dorfl 0.0.0 → 0.1.0
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/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { type Config, type PartialConfig } from './config.js';
|
|
2
|
+
import { type EnvMap } from './env-config.js';
|
|
3
|
+
import type { ConfigOverrideMap } from './config-override.js';
|
|
4
|
+
/**
|
|
5
|
+
* The per-repo config layer.
|
|
6
|
+
*
|
|
7
|
+
* A repo may commit a `.dorfl.json` at its root. It travels WITH the repo
|
|
8
|
+
* (it is committed) and overrides the global `~/.config/dorfl/config.json`
|
|
9
|
+
* FOR THAT REPO ONLY — so repo-local properties (how this repo integrates, its
|
|
10
|
+
* acceptance `verify` gate, which remote arbitrates its claims) are agreed by all
|
|
11
|
+
* collaborators and agents rather than living in one person's global config.
|
|
12
|
+
*
|
|
13
|
+
* Resolution is per-key, highest wins:
|
|
14
|
+
*
|
|
15
|
+
* flag (where a command offers one) > ENV (DORFL_*) > per-repo file >
|
|
16
|
+
* global > built-in default
|
|
17
|
+
*
|
|
18
|
+
* The mechanism is multi-repo aware: each repo resolves against its OWN
|
|
19
|
+
* `.dorfl.json`, so repo A can be `merge` while repo B is `propose` in the
|
|
20
|
+
* SAME run (see {@link resolveRepoConfig}).
|
|
21
|
+
*
|
|
22
|
+
* Only keys that are genuinely repo properties are honoured in the COMMITTED
|
|
23
|
+
* per-repo file. Runner/host-only keys (`piBin`, `agentCmd`, `maxParallel`, …)
|
|
24
|
+
* describe the runner or the host machine, NOT a single repo;
|
|
25
|
+
* if present in a per-repo file they are ignored and reported with a clear
|
|
26
|
+
* message ({@link loadRepoConfig}).
|
|
27
|
+
*
|
|
28
|
+
* The sharpened host-only principle (ADR §13): **host-only keys must come from a
|
|
29
|
+
* per-machine source — a CLI flag, an `DORFL_*` env var, or the global
|
|
30
|
+
* config file — NEVER the committed repo file.** The allow/reject split below
|
|
31
|
+
* therefore governs ONLY the committed repo file; env (a per-machine source like
|
|
32
|
+
* the global file / a flag) may set ANY key, host-only included (see
|
|
33
|
+
* {@link envOverrides}).
|
|
34
|
+
*
|
|
35
|
+
* A repo with no `.dorfl.json` resolves to exactly the global config —
|
|
36
|
+
* behaviour is unchanged from before this layer existed.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* The conventional per-repo config filename, committed at the repo root. Derived
|
|
40
|
+
* from the single brand identity (`.{base}.json`) so a rename flips it in lockstep
|
|
41
|
+
* (see `brand.ts`).
|
|
42
|
+
*/
|
|
43
|
+
export declare const REPO_CONFIG_FILENAME: string;
|
|
44
|
+
/**
|
|
45
|
+
* Config keys that are genuinely repo properties and so are honoured in a
|
|
46
|
+
* per-repo `.dorfl.json`. Deliberately a subset of {@link Config};
|
|
47
|
+
* extend this list as more keys become legitimately repo-scoped.
|
|
48
|
+
*/
|
|
49
|
+
export declare const REPO_ALLOWED_KEYS: readonly ["integration", "taskingIntegration", "tasksLandIn", "specsLandIn", "noPR", "verify", "prepare", "defaultArbiter", "autoBuild", "autoTask", "observationTriage", "mergeQuestions", "surfaceBlockers", "surfaceStaging", "selectionOrder", "model", "harness", "review", "reviewModel", "reviewMaxRounds", "taskerLoop", "taskerLoopMax", "taskerLoopModel", "freshWorktreeGate", "mergeRetries", "strictMergeApproval", "promptGuidance"];
|
|
50
|
+
/** A key honoured in a per-repo file. */
|
|
51
|
+
export type RepoAllowedKey = (typeof REPO_ALLOWED_KEYS)[number];
|
|
52
|
+
/**
|
|
53
|
+
* Config keys that describe the RUNNER or the HOST machine, not a single repo,
|
|
54
|
+
* and so are rejected (ignored + reported) in a per-repo file. These remain the
|
|
55
|
+
* domain of the global config / CLI flags.
|
|
56
|
+
*/
|
|
57
|
+
export declare const REPO_REJECTED_KEYS: readonly ["maxParallel", "perRepoMax", "agentCmd", "piBin", "sessionsDir", "identity", "humanWorktreesDir"];
|
|
58
|
+
/** A key rejected from a per-repo file. */
|
|
59
|
+
export type RepoRejectedKey = (typeof REPO_REJECTED_KEYS)[number];
|
|
60
|
+
/** The path to a repo's `.dorfl.json` (repo root + filename). */
|
|
61
|
+
export declare function repoConfigPath(repoPath: string): string;
|
|
62
|
+
/** The result of reading (and filtering) a repo's `.dorfl.json`. */
|
|
63
|
+
export interface LoadedRepoConfig {
|
|
64
|
+
/** Where we looked (whether or not the file exists). */
|
|
65
|
+
path: string;
|
|
66
|
+
/**
|
|
67
|
+
* Only the repo-appropriate keys found in the file, ready to layer over the
|
|
68
|
+
* global config. Unknown and rejected keys are NOT present here.
|
|
69
|
+
*/
|
|
70
|
+
config: PartialConfig;
|
|
71
|
+
/**
|
|
72
|
+
* Runner/host-only keys that WERE present in the file and were ignored. Empty
|
|
73
|
+
* when nothing was rejected.
|
|
74
|
+
*/
|
|
75
|
+
rejected: string[];
|
|
76
|
+
/**
|
|
77
|
+
* A clear, human-facing message naming the rejected keys and the file they
|
|
78
|
+
* came from. `undefined` when nothing was rejected.
|
|
79
|
+
*/
|
|
80
|
+
message?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Read a repo's `.dorfl.json` and split it into the honoured subset and
|
|
84
|
+
* the rejected runner/host-only keys. A missing file is not an error (the repo
|
|
85
|
+
* simply resolves to the global config); invalid JSON is. Unknown keys are
|
|
86
|
+
* silently dropped (neither honoured nor reported as rejected). Only keys in
|
|
87
|
+
* {@link REPO_ALLOWED_KEYS} are carried into `config`.
|
|
88
|
+
*/
|
|
89
|
+
export declare function loadRepoConfig(repoPath: string): LoadedRepoConfig;
|
|
90
|
+
/**
|
|
91
|
+
* The content-based half of {@link loadRepoConfig}: parse + apply the SAME
|
|
92
|
+
* allow/reject split to ALREADY-READ `.dorfl.json` bytes, labelling the
|
|
93
|
+
* source as `sourceLabel` (a path, or e.g. `<arbiter>/main:.dorfl.json`)
|
|
94
|
+
* in the rejected-key message. Used wherever the committed repo file is sourced
|
|
95
|
+
* from somewhere OTHER than a working-tree path — notably `do --remote`, which
|
|
96
|
+
* reads it from the arbiter's `main` (`git show`) since there is no checkout.
|
|
97
|
+
* Reuses the allow/reject SET verbatim (no parallel split), so a host-only key
|
|
98
|
+
* is rejected identically however the bytes were sourced. Invalid JSON throws.
|
|
99
|
+
*/
|
|
100
|
+
export declare function loadRepoConfigFromContent(content: string, sourceLabel: string): LoadedRepoConfig;
|
|
101
|
+
/** Inputs to {@link resolveRepoConfig}. */
|
|
102
|
+
export interface ResolveRepoConfigOptions {
|
|
103
|
+
/** Absolute path to the repo root (where `.dorfl.json` would live). */
|
|
104
|
+
repoPath: string;
|
|
105
|
+
/**
|
|
106
|
+
* The fully-resolved GLOBAL config (already merged over built-in defaults,
|
|
107
|
+
* e.g. via {@link mergeConfig} / `loadConfig`). The per-repo file and any
|
|
108
|
+
* flags layer OVER this; it provides the global + default layers of the
|
|
109
|
+
* precedence chain.
|
|
110
|
+
*/
|
|
111
|
+
global: Config;
|
|
112
|
+
/**
|
|
113
|
+
* Command-level flag overrides (where a command offers one). These sit at the
|
|
114
|
+
* TOP of the precedence chain: flag > env > per-repo > global > default. Only
|
|
115
|
+
* keys a command actually exposes need appear here.
|
|
116
|
+
*/
|
|
117
|
+
flags?: PartialConfig;
|
|
118
|
+
/**
|
|
119
|
+
* The raw environment map the `DORFL_*` layer is read from (defaults to
|
|
120
|
+
* `process.env`). Env sits ABOVE the per-repo file and BELOW a flag, and — as
|
|
121
|
+
* a per-machine source — may set ANY key, host-only included (it is NOT subject
|
|
122
|
+
* to the per-repo allow/reject split). Injectable so tests need not mutate the
|
|
123
|
+
* real `process.env`.
|
|
124
|
+
*/
|
|
125
|
+
env?: EnvMap;
|
|
126
|
+
/**
|
|
127
|
+
* The per-machine {@link ConfigOverrideMap} (from `loadConfigOverride`),
|
|
128
|
+
* inserted between the committed per-repo file and env in the precedence chain
|
|
129
|
+
* (ADR `per-machine-config-override-layer`). The hub-key bucket beats the
|
|
130
|
+
* `"*"` bucket. Default: empty (no override applied) — byte-identical to the
|
|
131
|
+
* pre-override behaviour. Injectable so tests need not touch the real
|
|
132
|
+
* `~/.config/dorfl/`.
|
|
133
|
+
*/
|
|
134
|
+
override?: ConfigOverrideMap;
|
|
135
|
+
/**
|
|
136
|
+
* The resolved arbiter URL used to compute the hub key (via
|
|
137
|
+
* {@link encodeRepoKey}) for the override lookup. If omitted, the URL is
|
|
138
|
+
* resolved from `repoPath` + `global.defaultArbiter` (`git remote get-url`).
|
|
139
|
+
* Unresolvable ⇒ the hub-key bucket is SKIPPED and only the `"*"` bucket
|
|
140
|
+
* applies (graceful degrade, never an error).
|
|
141
|
+
*/
|
|
142
|
+
arbiterUrl?: string;
|
|
143
|
+
}
|
|
144
|
+
/** The effective config for one repo, plus any rejected-key diagnostics. */
|
|
145
|
+
export interface ResolvedRepoConfig {
|
|
146
|
+
/** The layered, effective {@link Config} for this repo. */
|
|
147
|
+
config: Config;
|
|
148
|
+
/** Runner/host-only keys ignored in this repo's file (see {@link loadRepoConfig}). */
|
|
149
|
+
rejected: string[];
|
|
150
|
+
/** Clear message for the rejected keys, if any. */
|
|
151
|
+
message?: string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Resolve the effective config for ONE repo by layering, per key:
|
|
155
|
+
*
|
|
156
|
+
* flag > ENV (DORFL_*) > per-repo `.dorfl.json` > global >
|
|
157
|
+
* built-in default
|
|
158
|
+
*
|
|
159
|
+
* The `global` argument already carries the global + default layers (it is the
|
|
160
|
+
* output of `loadConfig`/`mergeConfig`). We layer the repo's honoured keys over
|
|
161
|
+
* it, then the `DORFL_*` env layer over that (env may set host-only keys
|
|
162
|
+
* the per-repo file rejected — it is a per-machine source), then any flags on
|
|
163
|
+
* top. The shared `global` object is never mutated, so calling this once per repo
|
|
164
|
+
* in a multi-repo run yields INDEPENDENT results — repo A can be `merge` while
|
|
165
|
+
* repo B is `propose` in the same run.
|
|
166
|
+
*
|
|
167
|
+
* A repo with no `.dorfl.json` (and no env) resolves to exactly `global`
|
|
168
|
+
* (unchanged behaviour).
|
|
169
|
+
*/
|
|
170
|
+
export declare function resolveRepoConfig(options: ResolveRepoConfigOptions): ResolvedRepoConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Layer an ALREADY-LOADED {@link LoadedRepoConfig} (the honoured subset + its
|
|
173
|
+
* rejected-key diagnostics) into the SAME precedence chain {@link resolveRepoConfig}
|
|
174
|
+
* applies:
|
|
175
|
+
*
|
|
176
|
+
* flag > ENV (DORFL_*) > per-repo > global > built-in default
|
|
177
|
+
*
|
|
178
|
+
* This is the source-agnostic core: {@link resolveRepoConfig} feeds it a
|
|
179
|
+
* working-tree read ({@link loadRepoConfig}); `do --remote` feeds it the arbiter's
|
|
180
|
+
* committed file read from `main` via {@link loadRepoConfigFromContent}. EITHER
|
|
181
|
+
* way the layering + the rejected-key passthrough are IDENTICAL — only the bytes'
|
|
182
|
+
* origin differs (the task's one genuinely-new seam).
|
|
183
|
+
*/
|
|
184
|
+
export declare function resolveRepoConfigFromLoaded(repo: LoadedRepoConfig, options: {
|
|
185
|
+
global: Config;
|
|
186
|
+
flags?: PartialConfig;
|
|
187
|
+
env?: EnvMap;
|
|
188
|
+
/**
|
|
189
|
+
* The per-machine {@link ConfigOverrideMap}; default empty (no override).
|
|
190
|
+
* Inserted between the committed per-repo file and env in the precedence
|
|
191
|
+
* chain (ADR `per-machine-config-override-layer`).
|
|
192
|
+
*/
|
|
193
|
+
override?: ConfigOverrideMap;
|
|
194
|
+
/**
|
|
195
|
+
* The resolved arbiter URL used to look up the hub-key override bucket
|
|
196
|
+
* (via {@link encodeRepoKey}). Unresolvable ⇒ skip the hub-key bucket;
|
|
197
|
+
* the `"*"` bucket still applies (graceful degrade).
|
|
198
|
+
*/
|
|
199
|
+
arbiterUrl?: string;
|
|
200
|
+
}): ResolvedRepoConfig;
|
|
201
|
+
//# sourceMappingURL=repo-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.d.ts","sourceRoot":"","sources":["../src/repo-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAGN,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAe,KAAK,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAG1D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA2B,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,obA4JgB,CAAC;AAE/C,yCAAyC;AACzC,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,6GAyBrB,CAAC;AAEX,2CAA2C;AAC3C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIlE,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAChC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAcjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GACjB,gBAAgB,CA0ClB;AAMD,2CAA2C;AAC3C,MAAM,WAAW,wBAAwB;IACxC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAyBD,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IAClC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,wBAAwB,GAC/B,kBAAkB,CAiBpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAC1C,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,GACC,kBAAkB,CAiCpB"}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { mergeConfig, warnDeprecatedConfigKeys, } from './config.js';
|
|
4
|
+
import { envOverrides } from './env-config.js';
|
|
5
|
+
import { brand } from './brand.js';
|
|
6
|
+
import { encodeRepoKey } from './repo-key.js';
|
|
7
|
+
import { run } from './git.js';
|
|
8
|
+
/**
|
|
9
|
+
* The per-repo config layer.
|
|
10
|
+
*
|
|
11
|
+
* A repo may commit a `.dorfl.json` at its root. It travels WITH the repo
|
|
12
|
+
* (it is committed) and overrides the global `~/.config/dorfl/config.json`
|
|
13
|
+
* FOR THAT REPO ONLY — so repo-local properties (how this repo integrates, its
|
|
14
|
+
* acceptance `verify` gate, which remote arbitrates its claims) are agreed by all
|
|
15
|
+
* collaborators and agents rather than living in one person's global config.
|
|
16
|
+
*
|
|
17
|
+
* Resolution is per-key, highest wins:
|
|
18
|
+
*
|
|
19
|
+
* flag (where a command offers one) > ENV (DORFL_*) > per-repo file >
|
|
20
|
+
* global > built-in default
|
|
21
|
+
*
|
|
22
|
+
* The mechanism is multi-repo aware: each repo resolves against its OWN
|
|
23
|
+
* `.dorfl.json`, so repo A can be `merge` while repo B is `propose` in the
|
|
24
|
+
* SAME run (see {@link resolveRepoConfig}).
|
|
25
|
+
*
|
|
26
|
+
* Only keys that are genuinely repo properties are honoured in the COMMITTED
|
|
27
|
+
* per-repo file. Runner/host-only keys (`piBin`, `agentCmd`, `maxParallel`, …)
|
|
28
|
+
* describe the runner or the host machine, NOT a single repo;
|
|
29
|
+
* if present in a per-repo file they are ignored and reported with a clear
|
|
30
|
+
* message ({@link loadRepoConfig}).
|
|
31
|
+
*
|
|
32
|
+
* The sharpened host-only principle (ADR §13): **host-only keys must come from a
|
|
33
|
+
* per-machine source — a CLI flag, an `DORFL_*` env var, or the global
|
|
34
|
+
* config file — NEVER the committed repo file.** The allow/reject split below
|
|
35
|
+
* therefore governs ONLY the committed repo file; env (a per-machine source like
|
|
36
|
+
* the global file / a flag) may set ANY key, host-only included (see
|
|
37
|
+
* {@link envOverrides}).
|
|
38
|
+
*
|
|
39
|
+
* A repo with no `.dorfl.json` resolves to exactly the global config —
|
|
40
|
+
* behaviour is unchanged from before this layer existed.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* The conventional per-repo config filename, committed at the repo root. Derived
|
|
44
|
+
* from the single brand identity (`.{base}.json`) so a rename flips it in lockstep
|
|
45
|
+
* (see `brand.ts`).
|
|
46
|
+
*/
|
|
47
|
+
export const REPO_CONFIG_FILENAME = brand.repoConfigFilename;
|
|
48
|
+
/**
|
|
49
|
+
* Config keys that are genuinely repo properties and so are honoured in a
|
|
50
|
+
* per-repo `.dorfl.json`. Deliberately a subset of {@link Config};
|
|
51
|
+
* extend this list as more keys become legitimately repo-scoped.
|
|
52
|
+
*/
|
|
53
|
+
export const REPO_ALLOWED_KEYS = [
|
|
54
|
+
'integration',
|
|
55
|
+
// `taskingIntegration` (the per-TRANSITION override for the prd→tasks TASKING
|
|
56
|
+
// transition ONLY) is a genuine repo property exactly like `integration`: whether
|
|
57
|
+
// THIS repo tasks a prd straight onto `main` (task FILES land, no PR) while it
|
|
58
|
+
// still BUILDS each task as a reviewable PR is agreed by all collaborators +
|
|
59
|
+
// travels with the repo. Resolved per-repo through the SAME chain as
|
|
60
|
+
// `integration`, then falls back to `integration` when unset. DISTINCT from
|
|
61
|
+
// intake's per-EMITTED-TYPE `{task, prd}` resolver (front door, author-trust):
|
|
62
|
+
// this is a per-lifecycle-transition knob, inside the boundary, config-resolved.
|
|
63
|
+
'taskingIntegration',
|
|
64
|
+
// `tasksLandIn` (the per-repo TASK-PLACEMENT default — staging vs pool, prd
|
|
65
|
+
// `staging-pool-position-gate-and-trust-model` US #5) is a genuine repo property
|
|
66
|
+
// exactly like `taskingIntegration`/`integration`: whether THIS repo's tasker
|
|
67
|
+
// output lands STAGED (`pre-backlog/`, review-without-PR human-promote path) or
|
|
68
|
+
// straight in the agent-eligible POOL (`ready/`, trusted fast-path) is agreed
|
|
69
|
+
// by all collaborators + travels with the repo. Resolved per-repo through the
|
|
70
|
+
// SAME chain as `taskingIntegration` (flag > env > per-repo > global > built-in
|
|
71
|
+
// `pre-backlog`). DISTINCT from intake's per-emitted-type stamps (front door):
|
|
72
|
+
// this is a per-lifecycle PLACEMENT knob, inside the trust boundary,
|
|
73
|
+
// config-resolved. Fed into the shared placement resolver as the
|
|
74
|
+
// configured-default rung (`src/placement.ts`).
|
|
75
|
+
'tasksLandIn',
|
|
76
|
+
// `specsLandIn` (the per-repo SPEC-PLACEMENT default — staging vs pool, spec
|
|
77
|
+
// `staging-pool-position-gate-and-trust-model` US #2/#5/#6/#12) is a genuine
|
|
78
|
+
// repo property exactly like `tasksLandIn`: whether THIS repo's intake-
|
|
79
|
+
// authored specs land STAGED (`specs/proposed/`, review-without-PR human-promote
|
|
80
|
+
// path) or straight in the auto-tasking POOL (`specs/ready/`, trusted fast-path)
|
|
81
|
+
// is agreed by all collaborators + travels with the repo. Resolved per-repo
|
|
82
|
+
// through the SAME chain as `tasksLandIn` (flag `--specs-land-in` > env
|
|
83
|
+
// `DORFL_SPECS_LAND_IN` > per-repo > global > built-in). Fed into the shared
|
|
84
|
+
// placement resolver as the configured-default rung for the spec lifecycle
|
|
85
|
+
// (`src/placement.ts`). The sole spec-placement key after the prd → spec HARD
|
|
86
|
+
// CUTOVER (the legacy `prdsLandIn` key is GONE — clean break, no accepted alias).
|
|
87
|
+
'specsLandIn',
|
|
88
|
+
// `noPR` (the PR-INTENT axis — push the branch but deliberately skip the PR) is
|
|
89
|
+
// a genuine repo property exactly like `integration`/`review`: whether this
|
|
90
|
+
// repo's propose runs open a PR is agreed by all collaborators + travels with
|
|
91
|
+
// the repo. Resolved per-repo through the SAME chain. (The removed `provider`
|
|
92
|
+
// OVERRIDE is gone — a stale `provider` key is ignored with a deprecation
|
|
93
|
+
// warning, see `loadRepoConfigFromContent`.)
|
|
94
|
+
'noPR',
|
|
95
|
+
'verify',
|
|
96
|
+
// `prepare` (the env-prep / install step run ONCE before the first `verify` on
|
|
97
|
+
// a fresh worktree) is a genuine repo property exactly like `verify` — how this
|
|
98
|
+
// repo's environment is made ready (install deps / submodules / codegen) is
|
|
99
|
+
// agreed by all collaborators + travels with the repo. Resolved per-repo
|
|
100
|
+
// through the SAME chain as `verify`. Install belongs HERE, never baked into
|
|
101
|
+
// `verify`.
|
|
102
|
+
'prepare',
|
|
103
|
+
'defaultArbiter',
|
|
104
|
+
// `autoBuild` (may an agent auto-BUILD undeclared, not-`humanOnly` tasks in
|
|
105
|
+
// this repo?) is a genuine repo property — the build member of the symmetric
|
|
106
|
+
// per-action gate family.
|
|
107
|
+
'autoBuild',
|
|
108
|
+
// `autoTask` (may an agent auto-task undeclared prds in this repo?) is a
|
|
109
|
+
// genuine repo property — the tasking-autonomy mirror of `autoBuild`
|
|
110
|
+
// (`work/prds/auto-task.md`), resolved per-repo through the same chain.
|
|
111
|
+
'autoTask',
|
|
112
|
+
// `observationTriage` (the 3-state `off|ask|auto` gate over the observation
|
|
113
|
+
// INBOX) is a genuine repo property — the observation-side question-surfacing
|
|
114
|
+
// gate (ADR `ci-config-policy-and-gate-family`), resolved per-repo through the
|
|
115
|
+
// same chain as `integration`/`autoBuild`. It REPLACES the old `autoTriage`
|
|
116
|
+
// boolean (no alias; no external users owed a migration window, 2026-06-12).
|
|
117
|
+
'observationTriage',
|
|
118
|
+
// `mergeQuestions` (the 3-state `off|ask|auto` gate over the MERGE-QUESTION
|
|
119
|
+
// SURFACER — prd `land-time-reverify-and-parallel-merge-ceiling` Story 17 /
|
|
120
|
+
// task `merge-questions-gate-axis`) is a genuine repo property exactly like
|
|
121
|
+
// `observationTriage`: whether THIS repo's unmerged `work/*` branches surface
|
|
122
|
+
// as merge-questions (and whether they auto-land) is agreed by all
|
|
123
|
+
// collaborators + travels with the repo. SEPARATE axis from
|
|
124
|
+
// `observationTriage` (never rides it) with a HIGHER default (`ask`, never
|
|
125
|
+
// `off` — a dropped merge-question means pushed work never lands). Resolved
|
|
126
|
+
// per-repo through the SAME precedence chain as the rest of the gate family
|
|
127
|
+
// (flag > env > per-repo > global > default `ask`).
|
|
128
|
+
'mergeQuestions',
|
|
129
|
+
// `surfaceBlockers` (the BOOLEAN gate over DECLARED blocked work — whether a
|
|
130
|
+
// task/prd carrying `needsAnswers:true` is rendered into a question sidecar) is a
|
|
131
|
+
// genuine repo property — the blocked-work side of the question-surfacing gate
|
|
132
|
+
// family (ADR `ci-config-policy-and-gate-family`), the orthogonal peer of
|
|
133
|
+
// `observationTriage`, resolved per-repo through the same chain as `autoBuild`.
|
|
134
|
+
'surfaceBlockers',
|
|
135
|
+
// `surfaceStaging` (the BOOLEAN gate-family member that widens SURFACE into
|
|
136
|
+
// STAGING — prd `staging-surface-and-apply-promote-safety` F2) is a genuine
|
|
137
|
+
// repo property exactly like its siblings (`surfaceBlockers`/`autoBuild`):
|
|
138
|
+
// whether THIS repo inspects staging for questions is agreed by all
|
|
139
|
+
// collaborators + travels with the repo. Default `true`; resolved per-repo
|
|
140
|
+
// through the SAME chain (flag > env > per-repo > global > built-in `true`).
|
|
141
|
+
// Does NOT touch the BUILD/claim candidate set — staging stays non-claimable.
|
|
142
|
+
'surfaceStaging',
|
|
143
|
+
// `selectionOrder` (the configurable order across the four orderable auto-pick
|
|
144
|
+
// pools — build/task/surface/triage; `apply` is pinned first) is a genuine repo
|
|
145
|
+
// property — the per-repo selection-order field ADR `ci-config-policy-and-gate-
|
|
146
|
+
// family` specifies, resolved per-repo like `autoTask`. SUBSUMES the removed
|
|
147
|
+
// `prdsFirst` boolean (a preset keyword or an explicit pool-name list).
|
|
148
|
+
'selectionOrder',
|
|
149
|
+
// `model` (which model this repo's work runs on) and `harness` (which adapter)
|
|
150
|
+
// are legitimate repo properties (ADR §13) — model is routing intent, not auth,
|
|
151
|
+
// and a repo may prefer a given harness. `piBin`/`agentCmd` stay host-only
|
|
152
|
+
// (machine paths/commands), so they are rejected below.
|
|
153
|
+
'model',
|
|
154
|
+
'harness',
|
|
155
|
+
// Gate 2 (PR/code review) policy is a genuine repo property (GATES prd
|
|
156
|
+
// `work/prds/tasked/review.md`), resolved per-repo like `integration`/`autoBuild`:
|
|
157
|
+
// whether this repo runs Gate 2 (`review`), which model the review agent runs
|
|
158
|
+
// on (`reviewModel`), and the revise↔review loop bound (`reviewMaxRounds`).
|
|
159
|
+
// `reviewModel` is routing intent (not auth), so — like `model` — it is
|
|
160
|
+
// repo-appropriate, not host-only.
|
|
161
|
+
'review',
|
|
162
|
+
'reviewModel',
|
|
163
|
+
'reviewMaxRounds',
|
|
164
|
+
// The tasker IMPROVER-loop family (`taskerLoop` on/off, `taskerLoopMax` hard
|
|
165
|
+
// cap on in-context review passes, `taskerLoopModel` the loop reviewer's
|
|
166
|
+
// de-correlated model) are genuine repo properties — like `review`/`reviewModel`
|
|
167
|
+
// they tune the per-repo review discipline, resolved per-repo through the same
|
|
168
|
+
// chain. They live on the LOOP (task-generation review), not on a gate, and are
|
|
169
|
+
// DISTINCT from the acceptance gate's `--review*` family.
|
|
170
|
+
'taskerLoop',
|
|
171
|
+
'taskerLoopMax',
|
|
172
|
+
'taskerLoopModel',
|
|
173
|
+
// `freshWorktreeGate` (run the acceptance gate against the REBASED tip in a
|
|
174
|
+
// clean throwaway worktree, ON by default) is a genuine repo property exactly
|
|
175
|
+
// like `verify`/`prepare`/`review`: whether this repo's gate tests the merged
|
|
176
|
+
// artifact (and pays the per-gate install cost) is agreed by all collaborators
|
|
177
|
+
// + travels with the repo. Resolved per-repo through the SAME chain.
|
|
178
|
+
'freshWorktreeGate',
|
|
179
|
+
// `mergeRetries` (the cross-job merge serialiser's CAS-retry cap — prd
|
|
180
|
+
// `land-time-reverify-and-parallel-merge-ceiling` Story 5 / Applied Answer q1 (a))
|
|
181
|
+
// is a genuine repo property exactly like `freshWorktreeGate`: "how many
|
|
182
|
+
// re-rebase-and-retry attempts before a contender bounces to needs-attention"
|
|
183
|
+
// is agreed by all collaborators in a wide-matrix CI repo + travels with the
|
|
184
|
+
// repo. Resolved per-repo through the SAME chain as `freshWorktreeGate`
|
|
185
|
+
// (flag > env > per-repo > global > default). Safety is unchanged — a lost
|
|
186
|
+
// CAS still costs only a re-rebase + re-gate retry, never a `--force`.
|
|
187
|
+
'mergeRetries',
|
|
188
|
+
// `strictMergeApproval` (the OPT-IN strictness layered on the OQ6
|
|
189
|
+
// stale-approval default — prd `land-time-reverify-and-parallel-merge-ceiling`
|
|
190
|
+
// sidecar OQ6 / task `strict-merge-approval-gate`) is a genuine repo property
|
|
191
|
+
// exactly like `mergeQuestions`/`mergeRetries`: whether THIS repo re-surfaces
|
|
192
|
+
// the merge-question on a merge-base change (the host-agnostic analogue of
|
|
193
|
+
// GitHub's "dismiss stale approvals when the base changes") instead of
|
|
194
|
+
// auto-landing on a green re-verify is agreed by all collaborators + travels
|
|
195
|
+
// with the repo. Resolved per-repo through the SAME gate-family precedence
|
|
196
|
+
// chain (flag > env > per-repo > global > default `false`). SEPARATE,
|
|
197
|
+
// independent axis — does NOT alter `mergeQuestions`/`observationTriage`
|
|
198
|
+
// default or shape. The re-surface vs. land branch is
|
|
199
|
+
// `apply-rung-merge-disposition`'s consumer, never here.
|
|
200
|
+
'strictMergeApproval',
|
|
201
|
+
// `promptGuidance` (the NUDGE namespace — prompt-text knobs that strengthen
|
|
202
|
+
// the worker's in-band wrapper line, e.g. `testFirst`) is a genuine repo
|
|
203
|
+
// property: "is this repo nudged toward test-first?" travels with the repo
|
|
204
|
+
// and is agreed by all collaborators. CATEGORICALLY SEPARATE from the gate
|
|
205
|
+
// family (`verify`/`autoBuild`/`humanOnly`) — a nudge changes the agent's
|
|
206
|
+
// disposition, NEVER the acceptance bar. Resolved per-repo through the SAME
|
|
207
|
+
// chain as `autoBuild` (flag > env > per-repo > global > default).
|
|
208
|
+
'promptGuidance',
|
|
209
|
+
];
|
|
210
|
+
/**
|
|
211
|
+
* Config keys that describe the RUNNER or the HOST machine, not a single repo,
|
|
212
|
+
* and so are rejected (ignored + reported) in a per-repo file. These remain the
|
|
213
|
+
* domain of the global config / CLI flags.
|
|
214
|
+
*/
|
|
215
|
+
export const REPO_REJECTED_KEYS = [
|
|
216
|
+
'maxParallel',
|
|
217
|
+
'perRepoMax',
|
|
218
|
+
'agentCmd',
|
|
219
|
+
// `piBin` is a machine PATH/command, not repo policy, so it is host-only and
|
|
220
|
+
// rejected per-repo (ADR §13). It must come from a per-machine source — a
|
|
221
|
+
// flag, an `DORFL_PI_BIN` env var, or the global file — never a
|
|
222
|
+
// committed repo file. (`harness`, by contrast, is repo-appropriate and so is
|
|
223
|
+
// deliberately NOT rejected.)
|
|
224
|
+
'piBin',
|
|
225
|
+
// `sessionsDir` is a machine PATH (where the host writes pi session logs), not
|
|
226
|
+
// repo policy, so it is host-only and rejected per-repo: a committed repo file
|
|
227
|
+
// must NOT redirect where the host writes sessions. It must come from a per-
|
|
228
|
+
// machine source — a flag (`--sessions-dir`), `DORFL_SESSIONS_DIR`, or
|
|
229
|
+
// the global file (exactly like `piBin`).
|
|
230
|
+
'sessionsDir',
|
|
231
|
+
// `identity` carries SECRETS (a `gh` token, an SSH key path) and is a per-
|
|
232
|
+
// MACHINE concept (a bot's credentials), never repo policy — so a committed
|
|
233
|
+
// repo file must NOT supply it. Host-only: it comes from the global config
|
|
234
|
+
// only. Rejected per-repo (ADR identity §; same class as `piBin`).
|
|
235
|
+
'identity',
|
|
236
|
+
// Reserved/future host-only keys callers may name; rejected proactively so a
|
|
237
|
+
// typo or a copy-pasted global config never silently leaks host policy into a
|
|
238
|
+
// repo. (`humanWorktreesDir` is a planned host-only path.)
|
|
239
|
+
'humanWorktreesDir',
|
|
240
|
+
];
|
|
241
|
+
const ALLOWED_SET = new Set(REPO_ALLOWED_KEYS);
|
|
242
|
+
/** The path to a repo's `.dorfl.json` (repo root + filename). */
|
|
243
|
+
export function repoConfigPath(repoPath) {
|
|
244
|
+
return join(repoPath, REPO_CONFIG_FILENAME);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Read a repo's `.dorfl.json` and split it into the honoured subset and
|
|
248
|
+
* the rejected runner/host-only keys. A missing file is not an error (the repo
|
|
249
|
+
* simply resolves to the global config); invalid JSON is. Unknown keys are
|
|
250
|
+
* silently dropped (neither honoured nor reported as rejected). Only keys in
|
|
251
|
+
* {@link REPO_ALLOWED_KEYS} are carried into `config`.
|
|
252
|
+
*/
|
|
253
|
+
export function loadRepoConfig(repoPath) {
|
|
254
|
+
const path = repoConfigPath(repoPath);
|
|
255
|
+
if (!existsSync(path)) {
|
|
256
|
+
return { path, config: {}, rejected: [] };
|
|
257
|
+
}
|
|
258
|
+
let raw;
|
|
259
|
+
try {
|
|
260
|
+
raw = readFileSync(path, 'utf8');
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
throw new Error(`Failed to read ${path}: ${err.message}`);
|
|
264
|
+
}
|
|
265
|
+
return loadRepoConfigFromContent(raw, path);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The content-based half of {@link loadRepoConfig}: parse + apply the SAME
|
|
269
|
+
* allow/reject split to ALREADY-READ `.dorfl.json` bytes, labelling the
|
|
270
|
+
* source as `sourceLabel` (a path, or e.g. `<arbiter>/main:.dorfl.json`)
|
|
271
|
+
* in the rejected-key message. Used wherever the committed repo file is sourced
|
|
272
|
+
* from somewhere OTHER than a working-tree path — notably `do --remote`, which
|
|
273
|
+
* reads it from the arbiter's `main` (`git show`) since there is no checkout.
|
|
274
|
+
* Reuses the allow/reject SET verbatim (no parallel split), so a host-only key
|
|
275
|
+
* is rejected identically however the bytes were sourced. Invalid JSON throws.
|
|
276
|
+
*/
|
|
277
|
+
export function loadRepoConfigFromContent(content, sourceLabel) {
|
|
278
|
+
let parsed;
|
|
279
|
+
try {
|
|
280
|
+
parsed = JSON.parse(content);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
throw new Error(`Invalid JSON in ${sourceLabel}: ${err.message}`);
|
|
284
|
+
}
|
|
285
|
+
// Drop (with a one-line warning) any DEPRECATED key (e.g. the removed `provider`
|
|
286
|
+
// override) before the allow/reject split, so an existing committed config keeps
|
|
287
|
+
// working — ignored, never an error, and never mistaken for an unknown key.
|
|
288
|
+
warnDeprecatedConfigKeys(parsed, sourceLabel);
|
|
289
|
+
const config = {};
|
|
290
|
+
const rejected = [];
|
|
291
|
+
for (const key of Object.keys(parsed)) {
|
|
292
|
+
const value = parsed[key];
|
|
293
|
+
if (value === undefined) {
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
if (ALLOWED_SET.has(key)) {
|
|
297
|
+
// Type matches by construction: key ∈ REPO_ALLOWED_KEYS ⊂ keyof Config.
|
|
298
|
+
config[key] = value;
|
|
299
|
+
}
|
|
300
|
+
else if (isRejectedKey(key)) {
|
|
301
|
+
rejected.push(key);
|
|
302
|
+
}
|
|
303
|
+
// else: unknown key ⇒ silently ignored.
|
|
304
|
+
}
|
|
305
|
+
const rejectedMessage = rejected.length > 0
|
|
306
|
+
? `Ignoring runner/host-only key(s) in ${REPO_CONFIG_FILENAME} ` +
|
|
307
|
+
`(${sourceLabel}): ${rejected.join(', ')}. ` +
|
|
308
|
+
`These describe the runner/host, not a single repo, and belong in ` +
|
|
309
|
+
`the global config or a CLI flag.`
|
|
310
|
+
: undefined;
|
|
311
|
+
const message = rejectedMessage;
|
|
312
|
+
return { path: sourceLabel, config, rejected, ...(message ? { message } : {}) };
|
|
313
|
+
}
|
|
314
|
+
function isRejectedKey(key) {
|
|
315
|
+
return REPO_REJECTED_KEYS.includes(key);
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The thin `git remote get-url <name>` reader used by {@link resolveRepoConfig}
|
|
319
|
+
* to derive a CHECKOUT's arbiter URL for the override hub-key lookup. Mirrors
|
|
320
|
+
* `resolveArbiterUrlFromCheckout` in `do.ts` (which is the same primitive on the
|
|
321
|
+
* `do --isolated` path); duplicated here — a single-line `run('git', …)` call —
|
|
322
|
+
* to avoid a `repo-config.ts` → `do.ts` dependency that would close a cycle
|
|
323
|
+
* (`do.ts` → `repo-mirror.ts` → `repo-config.ts`). Returns `undefined` when the
|
|
324
|
+
* remote is unset or the cwd is not a git repo — the override layer DEGRADES
|
|
325
|
+
* GRACEFULLY on an unresolvable URL.
|
|
326
|
+
*/
|
|
327
|
+
function gitRemoteGetUrl(cwd, remote, env) {
|
|
328
|
+
const res = run('git', ['remote', 'get-url', remote], cwd, { env });
|
|
329
|
+
if (res.status !== 0) {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
const url = res.stdout.trim();
|
|
333
|
+
return url === '' ? undefined : url;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Resolve the effective config for ONE repo by layering, per key:
|
|
337
|
+
*
|
|
338
|
+
* flag > ENV (DORFL_*) > per-repo `.dorfl.json` > global >
|
|
339
|
+
* built-in default
|
|
340
|
+
*
|
|
341
|
+
* The `global` argument already carries the global + default layers (it is the
|
|
342
|
+
* output of `loadConfig`/`mergeConfig`). We layer the repo's honoured keys over
|
|
343
|
+
* it, then the `DORFL_*` env layer over that (env may set host-only keys
|
|
344
|
+
* the per-repo file rejected — it is a per-machine source), then any flags on
|
|
345
|
+
* top. The shared `global` object is never mutated, so calling this once per repo
|
|
346
|
+
* in a multi-repo run yields INDEPENDENT results — repo A can be `merge` while
|
|
347
|
+
* repo B is `propose` in the same run.
|
|
348
|
+
*
|
|
349
|
+
* A repo with no `.dorfl.json` (and no env) resolves to exactly `global`
|
|
350
|
+
* (unchanged behaviour).
|
|
351
|
+
*/
|
|
352
|
+
export function resolveRepoConfig(options) {
|
|
353
|
+
const { repoPath, global, flags, env, override } = options;
|
|
354
|
+
const repo = loadRepoConfig(repoPath);
|
|
355
|
+
// Resolve the arbiter URL for the override hub-key lookup from the CHECKOUT's
|
|
356
|
+
// configured `<defaultArbiter>` remote (the working-tree analogue of the
|
|
357
|
+
// mirror's `origin`). Unresolvable (no remote, not a git repo) ⇒ hub-key
|
|
358
|
+
// lookup skipped; the `"*"` bucket still applies (graceful degrade).
|
|
359
|
+
const arbiterRemote = flags?.defaultArbiter ?? global.defaultArbiter;
|
|
360
|
+
const arbiterUrl = options.arbiterUrl ?? gitRemoteGetUrl(repoPath, arbiterRemote, env);
|
|
361
|
+
return resolveRepoConfigFromLoaded(repo, {
|
|
362
|
+
global,
|
|
363
|
+
flags,
|
|
364
|
+
env,
|
|
365
|
+
override,
|
|
366
|
+
...(arbiterUrl !== undefined ? { arbiterUrl } : {}),
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Layer an ALREADY-LOADED {@link LoadedRepoConfig} (the honoured subset + its
|
|
371
|
+
* rejected-key diagnostics) into the SAME precedence chain {@link resolveRepoConfig}
|
|
372
|
+
* applies:
|
|
373
|
+
*
|
|
374
|
+
* flag > ENV (DORFL_*) > per-repo > global > built-in default
|
|
375
|
+
*
|
|
376
|
+
* This is the source-agnostic core: {@link resolveRepoConfig} feeds it a
|
|
377
|
+
* working-tree read ({@link loadRepoConfig}); `do --remote` feeds it the arbiter's
|
|
378
|
+
* committed file read from `main` via {@link loadRepoConfigFromContent}. EITHER
|
|
379
|
+
* way the layering + the rejected-key passthrough are IDENTICAL — only the bytes'
|
|
380
|
+
* origin differs (the task's one genuinely-new seam).
|
|
381
|
+
*/
|
|
382
|
+
export function resolveRepoConfigFromLoaded(repo, options) {
|
|
383
|
+
const { global, flags, env, override, arbiterUrl } = options;
|
|
384
|
+
// The per-machine override layer (ADR `per-machine-config-override-layer`):
|
|
385
|
+
// the `"*"` (all-repos) bucket then the hub-key (this-repo) bucket, spread
|
|
386
|
+
// BETWEEN the committed per-repo file and env. Hub-key beats `"*"`. An
|
|
387
|
+
// unresolvable arbiter URL skips the hub-key lookup but keeps `"*"` — never
|
|
388
|
+
// an error. The override may set ANY key (host-only included): it is a
|
|
389
|
+
// per-machine source like env / flag / the global file, NOT subject to the
|
|
390
|
+
// per-repo allow/reject split.
|
|
391
|
+
const overrideStar = override?.['*'] ?? {};
|
|
392
|
+
const hubKey = arbiterUrl !== undefined ? encodeRepoKey(arbiterUrl) : undefined;
|
|
393
|
+
const overrideHub = hubKey !== undefined && override !== undefined
|
|
394
|
+
? (override[hubKey] ?? {})
|
|
395
|
+
: {};
|
|
396
|
+
// mergeConfig copies `global` (spreads DEFAULT_CONFIG then assigns) so the
|
|
397
|
+
// shared global object is never mutated. Layer per-repo, then the override
|
|
398
|
+
// (`"*"` then hub-key — hub-key wins), then env (a per-machine source — may
|
|
399
|
+
// set host-only keys), then flags on top.
|
|
400
|
+
const config = mergeConfig({
|
|
401
|
+
...global,
|
|
402
|
+
...repo.config,
|
|
403
|
+
...overrideStar,
|
|
404
|
+
...overrideHub,
|
|
405
|
+
...envOverrides(env),
|
|
406
|
+
...(flags ?? {}),
|
|
407
|
+
});
|
|
408
|
+
return {
|
|
409
|
+
config,
|
|
410
|
+
rejected: repo.rejected,
|
|
411
|
+
...(repo.message ? { message: repo.message } : {}),
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=repo-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config.js","sourceRoot":"","sources":["../src/repo-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The arbiter-URL → **hub key** encoder, extracted from `repo-mirror.ts` so it
|
|
3
|
+
* is importable WITHOUT pulling in the rest of the hub-mirror plumbing (which
|
|
4
|
+
* itself depends on `repo-config.ts`). The split exists for ONE reason: the
|
|
5
|
+
* per-machine `config.override.json` layer (resolved in `repo-config.ts`)
|
|
6
|
+
* needs the hub key to look up the per-repo override bucket — but
|
|
7
|
+
* `repo-config.ts` cannot import from `repo-mirror.ts` without a cycle. The
|
|
8
|
+
* key encoder is pure (URL → string) and has no business depending on the
|
|
9
|
+
* mirror or the per-repo config, so it lives here. `repo-mirror.ts` re-exports
|
|
10
|
+
* {@link encodeRepoKey} so existing callers see no change.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Deterministically encode an arbiter remote URL into a hierarchical hub key:
|
|
14
|
+
* drop the scheme / user / `.git` suffix, then replace `.` → `-` **per path
|
|
15
|
+
* segment** (lossless and reversible; avoids the dotted-segment hazard that
|
|
16
|
+
* trips editors / tools and our own dotdir-pruning). E.g.
|
|
17
|
+
* `git@github.com:wighawag/dorfl.git` → `github-com/wighawag/dorfl`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function encodeRepoKey(url: string): string;
|
|
20
|
+
//# sourceMappingURL=repo-key.d.ts.map
|