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,194 @@
|
|
|
1
|
+
import {existsSync} from 'node:fs';
|
|
2
|
+
import {join} from 'node:path';
|
|
3
|
+
import {run, type RunResult} from './git.js';
|
|
4
|
+
import {resolveSidecarIdentity, sidecarPathFor} from './sidecar.js';
|
|
5
|
+
import {resolveItemPathByIdentity} from './item-path.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The DIRECT-DELETE helper (prd
|
|
9
|
+
* `agentic-question-resolution-retire-disposition-vocabulary`, US #5/#11; task
|
|
10
|
+
* `direct-delete-question-cli-helper`) — the "I just want to throw this away"
|
|
11
|
+
* path that `git rm`s a source item AND its question sidecar (when present) in
|
|
12
|
+
* ONE revertible commit, the human's reason recorded in the commit MESSAGE (git
|
|
13
|
+
* history is the archive).
|
|
14
|
+
*
|
|
15
|
+
* It is the DIRECT human/skill/CLI action of decision 7: the human, the
|
|
16
|
+
* `answer-questions` skill, or the `dorfl drop` verb deletes a signal STRAIGHT —
|
|
17
|
+
* it does NOT round-trip through the decision engine or spawn any agent. (The
|
|
18
|
+
* AGENT reaching `delete-source` as a verdict is the SEPARATE engine path in
|
|
19
|
+
* `apply-persist.ts`'s `dischargeByDeletion`; this module is its no-engine twin.)
|
|
20
|
+
*
|
|
21
|
+
* The shape deliberately MIRRORS `apply-persist.ts`'s `dischargeByDeletion` (same
|
|
22
|
+
* one-commit `git rm`, same reason-in-the-message archive) but reaches it WITHOUT
|
|
23
|
+
* the answered-sidecar precondition, the apply rung, or any verdict: the human
|
|
24
|
+
* has already decided. Both the source path and the sidecar path are resolved by
|
|
25
|
+
* the item's namespaced IDENTITY (the single source of truth) via the SHARED
|
|
26
|
+
* `resolveItemPathByIdentity` / `sidecarPathFor` resolvers — NOT a captured path.
|
|
27
|
+
*
|
|
28
|
+
* Git-recoverable by construction: a single revertible commit, so a wrong delete
|
|
29
|
+
* is never catastrophic (US #11).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export interface DropSourceOptions {
|
|
33
|
+
/** Working clone/worktree the deletion commits in. */
|
|
34
|
+
cwd: string;
|
|
35
|
+
/**
|
|
36
|
+
* The namespaced item identity to delete (`task:foo` / `prd:bar` /
|
|
37
|
+
* `observation:baz` / `obs:baz` / a bare `<slug>` = task). Resolved to its
|
|
38
|
+
* on-disk path by identity, folder-agnostic.
|
|
39
|
+
*/
|
|
40
|
+
item: string;
|
|
41
|
+
/**
|
|
42
|
+
* The human's reason for the deletion, recorded in the commit MESSAGE (git
|
|
43
|
+
* history is the archive). Empty/whitespace is recorded as "(no reason given)"
|
|
44
|
+
* rather than refused — the human asked to delete; the reason is documentation,
|
|
45
|
+
* not a gate.
|
|
46
|
+
*/
|
|
47
|
+
reason?: string;
|
|
48
|
+
/** Advisory committer id for the commit subject. Defaults to git user.name. */
|
|
49
|
+
by?: string;
|
|
50
|
+
/** Environment for child git processes. */
|
|
51
|
+
env?: NodeJS.ProcessEnv;
|
|
52
|
+
/** Sink for human-readable progress notes. */
|
|
53
|
+
note?: (message: string) => void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The terminal a drop reached. */
|
|
57
|
+
export type DropTerminal =
|
|
58
|
+
/** The source (+ its sidecar when present) were `git rm`-ed in one commit. */
|
|
59
|
+
| 'deleted'
|
|
60
|
+
/**
|
|
61
|
+
* No source resolved by identity in any lifecycle folder — nothing to delete.
|
|
62
|
+
* A clean no-op (no commit), NOT an error: the human asked to throw away
|
|
63
|
+
* something that is already gone, and the sidecar (if any) is the orphan-gc
|
|
64
|
+
* sweep's concern, not this direct verb's.
|
|
65
|
+
*/
|
|
66
|
+
| 'not-found';
|
|
67
|
+
|
|
68
|
+
export interface DropSourceResult {
|
|
69
|
+
/** The terminal the drop reached. */
|
|
70
|
+
outcome: DropTerminal;
|
|
71
|
+
/** The canonical namespaced identity the drop acted on. */
|
|
72
|
+
item: string;
|
|
73
|
+
/** The commit sha the drop produced (only on `deleted`). */
|
|
74
|
+
commit?: string;
|
|
75
|
+
/** The source path (relative to `cwd`) that was removed (only on `deleted`). */
|
|
76
|
+
itemPath?: string;
|
|
77
|
+
/**
|
|
78
|
+
* The sidecar path (relative to `cwd`) that was removed, or `undefined` when
|
|
79
|
+
* no sidecar was present (a source with no open-question conversation).
|
|
80
|
+
*/
|
|
81
|
+
sidecarPath?: string;
|
|
82
|
+
/** A human-readable summary. */
|
|
83
|
+
message: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Raised for usage errors (a missing repo). */
|
|
87
|
+
export class DropSourceError extends Error {
|
|
88
|
+
constructor(message: string) {
|
|
89
|
+
super(message);
|
|
90
|
+
this.name = 'DropSourceError';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function gitSoft(
|
|
95
|
+
args: string[],
|
|
96
|
+
cwd: string,
|
|
97
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
98
|
+
): RunResult {
|
|
99
|
+
return run('git', args, cwd, {env});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function gitHard(
|
|
103
|
+
args: string[],
|
|
104
|
+
cwd: string,
|
|
105
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
106
|
+
): RunResult {
|
|
107
|
+
const result = run('git', args, cwd, {env});
|
|
108
|
+
if (result.status !== 0) {
|
|
109
|
+
throw new DropSourceError(
|
|
110
|
+
`git ${args.join(' ')} failed (exit ${result.status}): ${result.stderr.trim()}`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function resolveBy(cwd: string, env: NodeJS.ProcessEnv | undefined): string {
|
|
117
|
+
const name = gitSoft(['config', 'user.name'], cwd, env);
|
|
118
|
+
if (name.status === 0 && name.stdout.trim() !== '') {
|
|
119
|
+
return name.stdout.trim();
|
|
120
|
+
}
|
|
121
|
+
const e = env ?? process.env;
|
|
122
|
+
return e.USER ?? e.USERNAME ?? '';
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* DELETE a source item + its question sidecar DIRECTLY (US #5/#11): `git rm` the
|
|
127
|
+
* source AND its sidecar (when present) in ONE revertible commit, the human's
|
|
128
|
+
* `reason` recorded in the commit MESSAGE. No decision engine, no agent — the
|
|
129
|
+
* direct human/skill/CLI throw-it-away path.
|
|
130
|
+
*
|
|
131
|
+
* - Resolves the source by IDENTITY (`resolveItemPathByIdentity`); when it is
|
|
132
|
+
* already gone, returns `not-found` as a clean no-op (no commit) — deleting
|
|
133
|
+
* something already absent is "nothing to throw away", not a failure.
|
|
134
|
+
* - `git rm`s the sidecar TOO when one is present (`sidecarPathFor` →
|
|
135
|
+
* `existsSync`); a source with no open-question conversation simply has no
|
|
136
|
+
* sidecar to remove.
|
|
137
|
+
* - Both ride ONE commit, so the deletion is a single revertible unit (a wrong
|
|
138
|
+
* delete is recoverable via `git revert`).
|
|
139
|
+
*/
|
|
140
|
+
export function dropSource(options: DropSourceOptions): DropSourceResult {
|
|
141
|
+
const {cwd, env} = options;
|
|
142
|
+
const note = options.note ?? (() => {});
|
|
143
|
+
|
|
144
|
+
if (gitSoft(['rev-parse', '--git-dir'], cwd, env).status !== 0) {
|
|
145
|
+
throw new DropSourceError('not inside a git repository');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Canonicalise the identity (bare slug → task, `obs:` → observation, …) so the
|
|
149
|
+
// commit message + result speak the one namespaced form.
|
|
150
|
+
const {item} = resolveSidecarIdentity(options.item);
|
|
151
|
+
|
|
152
|
+
const itemPath = resolveItemPathByIdentity(cwd, item);
|
|
153
|
+
if (itemPath === undefined) {
|
|
154
|
+
const message =
|
|
155
|
+
`drop ${item}: no source item resolves by identity in any lifecycle ` +
|
|
156
|
+
`folder — nothing to throw away (clean no-op, no commit).`;
|
|
157
|
+
note(message);
|
|
158
|
+
return {outcome: 'not-found', item, message};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// `git rm` the source. The sidecar may or may not exist (only items with an
|
|
162
|
+
// open-question conversation have one); rm it too when present, so the drop
|
|
163
|
+
// leaves no orphaned sidecar. Both ride ONE commit.
|
|
164
|
+
const sidecarPath = sidecarPathFor(item);
|
|
165
|
+
const sidecarPresent = existsSync(join(cwd, sidecarPath));
|
|
166
|
+
const rmPaths = sidecarPresent ? [itemPath, sidecarPath] : [itemPath];
|
|
167
|
+
gitHard(['rm', '--quiet', '--', ...rmPaths], cwd, env);
|
|
168
|
+
|
|
169
|
+
const by = options.by || resolveBy(cwd, env);
|
|
170
|
+
const reasonLine =
|
|
171
|
+
(options.reason ?? '').trim() === ''
|
|
172
|
+
? '(no reason given)'
|
|
173
|
+
: (options.reason ?? '').trim();
|
|
174
|
+
const subject = `drop: ${item} → deleted (by ${by})`;
|
|
175
|
+
const messageBody =
|
|
176
|
+
`Direct delete (the human threw it away; no engine round-trip; git ` +
|
|
177
|
+
`history is the archive). This is a single revertible commit.\n\n` +
|
|
178
|
+
`reason: ${reasonLine}`;
|
|
179
|
+
gitHard(['commit', '--quiet', '-m', subject, '-m', messageBody], cwd, env);
|
|
180
|
+
const commit = gitHard(['rev-parse', 'HEAD'], cwd, env).stdout.trim();
|
|
181
|
+
|
|
182
|
+
const message =
|
|
183
|
+
`dropped ${item} → deleted (source${sidecarPresent ? ' + sidecar' : ''} ` +
|
|
184
|
+
`git rm-ed in one revertible commit; reason in the commit message).`;
|
|
185
|
+
note(message);
|
|
186
|
+
return {
|
|
187
|
+
outcome: 'deleted',
|
|
188
|
+
item,
|
|
189
|
+
commit,
|
|
190
|
+
itemPath,
|
|
191
|
+
...(sidecarPresent ? {sidecarPath} : {}),
|
|
192
|
+
message,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure eligibility resolution. No I/O — callers pass in the two autonomy axes
|
|
3
|
+
* (`humanOnly`, `needsAnswers`), the item's `blockedBy` slugs, and the set of
|
|
4
|
+
* slugs present in the same repo's `work/done/`. Dependencies are per-repo only
|
|
5
|
+
* and never cross repos.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An autonomy gate axis. `true` ⇒ the item is gated on this axis (never
|
|
10
|
+
* auto-claim); `undefined`/`false` ⇒ not gated on it. Both `humanOnly` (DECIDED)
|
|
11
|
+
* and `needsAnswers` (DISCOVERED) share this shape and block orthogonally.
|
|
12
|
+
*/
|
|
13
|
+
export type HumanOnlyGate = boolean | undefined;
|
|
14
|
+
|
|
15
|
+
export interface BlockedByResult {
|
|
16
|
+
/** True when every blocker is present in `work/done/`. */
|
|
17
|
+
satisfied: boolean;
|
|
18
|
+
/** Blocker slugs not yet in `work/done/`, in declaration order. */
|
|
19
|
+
missing: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface EligibilityInput {
|
|
23
|
+
humanOnly: HumanOnlyGate;
|
|
24
|
+
needsAnswers: HumanOnlyGate;
|
|
25
|
+
blockedBy: string[];
|
|
26
|
+
/** Slugs present in this repo's `work/done/`. */
|
|
27
|
+
doneSlugs: Set<string>;
|
|
28
|
+
/** Per-repo policy: may agents auto-BUILD *undeclared* (not human-only) tasks? */
|
|
29
|
+
autoBuild: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface EligibilityResult {
|
|
33
|
+
/** Eligible now = gate passes AND all blockers satisfied. */
|
|
34
|
+
eligible: boolean;
|
|
35
|
+
/** Whether the autonomy gate alone passes (agent-claimable). */
|
|
36
|
+
gatePass: boolean;
|
|
37
|
+
blockedBy: BlockedByResult;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the autonomy gate: agent-claimable iff `needsAnswers` is not `true`
|
|
42
|
+
* AND `humanOnly` is not `true` AND the repo's `autoBuild` policy is on. Both
|
|
43
|
+
* axes block orthogonally and are never claimable by an agent regardless of
|
|
44
|
+
* policy; a human is never bound by either.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveGate(
|
|
47
|
+
humanOnly: HumanOnlyGate,
|
|
48
|
+
needsAnswers: HumanOnlyGate,
|
|
49
|
+
autoBuild: boolean,
|
|
50
|
+
): boolean {
|
|
51
|
+
if (needsAnswers === true || humanOnly === true) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return autoBuild;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Resolve `blockedBy` against the slugs present in `work/done/`. */
|
|
58
|
+
export function resolveBlockedBy(
|
|
59
|
+
blockedBy: string[],
|
|
60
|
+
doneSlugs: Set<string>,
|
|
61
|
+
): BlockedByResult {
|
|
62
|
+
const missing = blockedBy.filter((slug) => !doneSlugs.has(slug));
|
|
63
|
+
return {satisfied: missing.length === 0, missing};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Combine the autonomy gate and `blockedBy` resolution into a verdict. */
|
|
67
|
+
export function resolveEligibility(input: EligibilityInput): EligibilityResult {
|
|
68
|
+
const gatePass = resolveGate(
|
|
69
|
+
input.humanOnly,
|
|
70
|
+
input.needsAnswers,
|
|
71
|
+
input.autoBuild,
|
|
72
|
+
);
|
|
73
|
+
const blockedBy = resolveBlockedBy(input.blockedBy, input.doneSlugs);
|
|
74
|
+
return {
|
|
75
|
+
eligible: gatePass && blockedBy.satisfied,
|
|
76
|
+
gatePass,
|
|
77
|
+
blockedBy,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import type {Config, PartialConfig} from './config.js';
|
|
2
|
+
import {brand, constantCase} from './brand.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The environment-variable config layer.
|
|
6
|
+
*
|
|
7
|
+
* A per-machine context (a CI job, a developer's shell) can set ANY {@link Config}
|
|
8
|
+
* key via an `DORFL_*` environment variable WITHOUT committing a file —
|
|
9
|
+
* including the host-only keys (`piBin`, `agentCmd`, …) that the per-repo
|
|
10
|
+
* `.dorfl.json` deliberately rejects.
|
|
11
|
+
*
|
|
12
|
+
* Env is a legitimate *per-machine source* — exactly like a CLI flag or the
|
|
13
|
+
* global `~/.config/dorfl/config.json` — so it is NOT subject to the
|
|
14
|
+
* per-repo allow/reject split (that split only governs the *committed repo
|
|
15
|
+
* file*). This is the sharpened host-only principle (ADR §13): host-only keys
|
|
16
|
+
* must come from a per-machine source (flag, env, or global file), never the
|
|
17
|
+
* committed repo file; env is simply the per-machine source CI actually has
|
|
18
|
+
* without writing a file.
|
|
19
|
+
*
|
|
20
|
+
* Resolution chain (highest wins):
|
|
21
|
+
*
|
|
22
|
+
* flag > ENV (DORFL_*) > per-repo > global > built-in default
|
|
23
|
+
*
|
|
24
|
+
* Naming: `DORFL_<SCREAMING_SNAKE(key)>` (mechanical camelCase →
|
|
25
|
+
* SCREAMING_SNAKE, prefixed with `DORFL_` to match the binary). E.g.
|
|
26
|
+
* `DORFL_AGENT_CMD`, `DORFL_PI_BIN`, `DORFL_DEFAULT_ARBITER`,
|
|
27
|
+
* `DORFL_PER_REPO_MAX`.
|
|
28
|
+
*
|
|
29
|
+
* Each value is coerced per the key's type and a typo/invalid value FAILS LOUDLY
|
|
30
|
+
* (never silently ignored) with a message naming the offending variable.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The shared `DORFL_` prefix on every env config variable. Derived from
|
|
35
|
+
* the single brand identity (`constantCase(base) + '_'`) so a rename flips the
|
|
36
|
+
* prefix in lockstep with the binary name (see `brand.ts`).
|
|
37
|
+
*/
|
|
38
|
+
export const ENV_PREFIX = brand.envPrefix;
|
|
39
|
+
|
|
40
|
+
/** How a key's env value is coerced from its raw string. */
|
|
41
|
+
type Coercion =
|
|
42
|
+
| 'string'
|
|
43
|
+
| 'boolean'
|
|
44
|
+
| 'number'
|
|
45
|
+
| 'list'
|
|
46
|
+
| {enum: readonly string[]};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The coercion to apply per env-settable {@link Config} key. The source of truth
|
|
50
|
+
* for which env vars exist and how their raw strings become typed values. EVERY
|
|
51
|
+
* SCALAR `Config` key appears here (host-only included) — env is a per-machine
|
|
52
|
+
* source, so no scalar key is off-limits. Keys not listed have no env var.
|
|
53
|
+
*
|
|
54
|
+
* The lone EXCLUSION is `identity`: it is a NESTED structured object (with its
|
|
55
|
+
* own `auth`/`providers` sub-objects), not a scalar a single env string can
|
|
56
|
+
* carry. A `tokenEnv` indirection already covers the one secret a CI/per-machine
|
|
57
|
+
* context legitimately injects via env (the `gh` token), so there is no JSON-in-
|
|
58
|
+
* env hack here. The mapped type is `Partial` precisely to ALLOW this exclusion.
|
|
59
|
+
*/
|
|
60
|
+
const KEY_COERCIONS: {[K in keyof Config]?: Coercion} = {
|
|
61
|
+
autoBuild: 'boolean',
|
|
62
|
+
autoTask: 'boolean',
|
|
63
|
+
// The observation-triage gate is a 3-state ENUM coercion (like `integration`),
|
|
64
|
+
// so `DORFL_OBSERVATION_TRIAGE=off|ask|auto` works and a typo FAILS
|
|
65
|
+
// LOUDLY naming the variable + the valid options.
|
|
66
|
+
observationTriage: {enum: ['off', 'ask', 'auto']},
|
|
67
|
+
// The merge-question SURFACER gate is a 3-state ENUM coercion (mirrors
|
|
68
|
+
// `observationTriage`'s shape; SEPARATE axis with a HIGHER default, prd
|
|
69
|
+
// `land-time-reverify-and-parallel-merge-ceiling` Story 17 / task
|
|
70
|
+
// `merge-questions-gate-axis`), so `DORFL_MERGE_QUESTIONS=off|ask|auto`
|
|
71
|
+
// works and a typo FAILS LOUDLY naming the variable + the valid options.
|
|
72
|
+
mergeQuestions: {enum: ['off', 'ask', 'auto']},
|
|
73
|
+
// The surface-blockers gate is a BOOLEAN coercion (like `autoBuild`), so
|
|
74
|
+
// `DORFL_SURFACE_BLOCKERS=true|false` works and a typo FAILS LOUDLY.
|
|
75
|
+
surfaceBlockers: 'boolean',
|
|
76
|
+
// `surfaceStaging` (the BOOLEAN gate-family member that widens the SURFACE
|
|
77
|
+
// candidate set to include STAGING — `tasks/backlog/` + `prds/proposed/` —
|
|
78
|
+
// not only the agent pool; prd
|
|
79
|
+
// `staging-surface-and-apply-promote-safety` F2) coerces as a BOOLEAN like
|
|
80
|
+
// `autoBuild`/`surfaceBlockers`, so `DORFL_SURFACE_STAGING=true|false`
|
|
81
|
+
// works and a typo FAILS LOUDLY. Resolution chain identical to the other
|
|
82
|
+
// gate-family members (flag > env > per-repo > global > built-in `true`).
|
|
83
|
+
surfaceStaging: 'boolean',
|
|
84
|
+
// `selectionOrder` coerces as a `'list'` (comma form
|
|
85
|
+
// `DORFL_SELECTION_ORDER=build,task,surface,triage`); a single-element
|
|
86
|
+
// list whose one entry is a preset keyword (`=drain`) is expanded by the
|
|
87
|
+
// resolver (`select-order.ts`). Subsumes the removed `prdsFirst` boolean.
|
|
88
|
+
selectionOrder: 'list',
|
|
89
|
+
maxParallel: 'number',
|
|
90
|
+
perRepoMax: 'number',
|
|
91
|
+
defaultArbiter: 'string',
|
|
92
|
+
workspacesDir: 'string',
|
|
93
|
+
arbitersDir: 'string',
|
|
94
|
+
humanWorktreesDir: 'string',
|
|
95
|
+
integration: {enum: ['propose', 'merge']},
|
|
96
|
+
// `taskingIntegration` (the per-TRANSITION TASKING override) coerces as the SAME
|
|
97
|
+
// `propose`/`merge` enum as `integration`, so `DORFL_TASKING_INTEGRATION`
|
|
98
|
+
// works and a typo FAILS LOUDLY. Unset ⇒ the tasking transition falls back to
|
|
99
|
+
// `integration` (the flat value). It NEVER touches the build transition or intake.
|
|
100
|
+
taskingIntegration: {enum: ['propose', 'merge']},
|
|
101
|
+
// `tasksLandIn` (the per-repo TASK-PLACEMENT default — prd
|
|
102
|
+
// `staging-pool-position-gate-and-trust-model` US #5) coerces as the
|
|
103
|
+
// `pre-backlog`/`ready` enum, so `DORFL_TASKS_LAND_IN=ready` works and a
|
|
104
|
+
// typo FAILS LOUDLY. Same
|
|
105
|
+
// precedence chain as `taskingIntegration` (flag > env > per-repo > global >
|
|
106
|
+
// built-in `pre-backlog`); fed into the runner-deterministic placement
|
|
107
|
+
// resolver (`src/placement.ts`) as the configured-default rung.
|
|
108
|
+
tasksLandIn: {enum: ['pre-backlog', 'ready']},
|
|
109
|
+
// `specsLandIn` (the per-repo SPEC-PLACEMENT default — spec
|
|
110
|
+
// `staging-pool-position-gate-and-trust-model` US #2/#5) coerces as the
|
|
111
|
+
// `pre-proposed`/`ready` enum, so `DORFL_SPECS_LAND_IN=ready` works and a typo
|
|
112
|
+
// FAILS LOUDLY. Same precedence chain as `tasksLandIn` (flag > env > per-repo
|
|
113
|
+
// > global > built-in `pre-proposed`); fed into the shared placement resolver
|
|
114
|
+
// (`src/placement.ts`) as the configured-default rung for the spec lifecycle.
|
|
115
|
+
// The legacy `prdsLandIn` key / `DORFL_PRDS_LAND_IN` env are GONE after the
|
|
116
|
+
// prd → spec hard cutover (clean break).
|
|
117
|
+
specsLandIn: {enum: ['pre-proposed', 'ready']},
|
|
118
|
+
// `noPR` (the PR-INTENT axis) is a BOOLEAN coercion (like `review`), so
|
|
119
|
+
// `DORFL_NO_PR=true|false` works and a typo FAILS LOUDLY. The removed
|
|
120
|
+
// `provider` override has NO env var (a stale `DORFL_PROVIDER` is ignored
|
|
121
|
+
// with a deprecation warning — see `envOverrides`).
|
|
122
|
+
noPR: 'boolean',
|
|
123
|
+
agentCmd: 'string',
|
|
124
|
+
model: 'string',
|
|
125
|
+
harness: {enum: ['null', 'pi']},
|
|
126
|
+
piBin: 'string',
|
|
127
|
+
sessionsDir: 'string',
|
|
128
|
+
// `prepare` coerces as a `'list'` (comma form
|
|
129
|
+
// `DORFL_PREPARE=pnpm install,git submodule update --init`), exactly
|
|
130
|
+
// like `verify` — the SAME precedence chain, the sibling env-prep step.
|
|
131
|
+
prepare: 'list',
|
|
132
|
+
verify: 'list',
|
|
133
|
+
review: 'boolean',
|
|
134
|
+
reviewModel: 'string',
|
|
135
|
+
reviewMaxRounds: 'number',
|
|
136
|
+
taskerLoop: 'boolean',
|
|
137
|
+
taskerLoopMax: 'number',
|
|
138
|
+
taskerLoopModel: 'string',
|
|
139
|
+
// `freshWorktreeGate` is a BOOLEAN coercion (like `taskerLoop`), so
|
|
140
|
+
// `DORFL_FRESH_WORKTREE_GATE=true|false` works and a typo FAILS LOUDLY.
|
|
141
|
+
freshWorktreeGate: 'boolean',
|
|
142
|
+
// `mergeRetries` (the cross-job merge serialiser's CAS-retry cap — prd
|
|
143
|
+
// `land-time-reverify-and-parallel-merge-ceiling` Story 5 / Applied Answer q1 (a))
|
|
144
|
+
// coerces as a NUMBER (like `reviewMaxRounds`), so `DORFL_MERGE_RETRIES=20`
|
|
145
|
+
// works and a typo FAILS LOUDLY. A wide-matrix CI raises it; the default
|
|
146
|
+
// (1000 — the C2 large liveness ceiling) stays in place when unset.
|
|
147
|
+
mergeRetries: 'number',
|
|
148
|
+
// `strictMergeApproval` (the OPT-IN strictness layered on the OQ6
|
|
149
|
+
// stale-approval default — prd `land-time-reverify-and-parallel-merge-ceiling`
|
|
150
|
+
// sidecar OQ6 / task `strict-merge-approval-gate`) coerces as a BOOLEAN
|
|
151
|
+
// (like `freshWorktreeGate`), so `DORFL_STRICT_MERGE_APPROVAL=true|false`
|
|
152
|
+
// works and a typo FAILS LOUDLY. Default OFF; ON re-surfaces the
|
|
153
|
+
// merge-question on a merge-base change instead of auto-landing.
|
|
154
|
+
strictMergeApproval: 'boolean',
|
|
155
|
+
// `promptGuidance` is a STRUCTURED (nested) namespace, so it has no scalar env
|
|
156
|
+
// var of its own — each MEMBER carries its own env var (the nested-key form
|
|
157
|
+
// `DORFL_PROMPT_GUIDANCE_<MEMBER>`), handled out-of-band in
|
|
158
|
+
// `envOverrides` below. Listing the namespace here would imply a single scalar
|
|
159
|
+
// `DORFL_PROMPT_GUIDANCE` env var, which is NOT how the namespace is
|
|
160
|
+
// shaped (each nudge member is independently resolvable).
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The env vars for the nested members of the `promptGuidance` namespace. The
|
|
165
|
+
* key is the env var name (`DORFL_PROMPT_GUIDANCE_<MEMBER>`, the nested
|
|
166
|
+
* naming the prd specifies); the value is the (boolean) coercion. Each member
|
|
167
|
+
* present in env contributes `{<member>: bool}` into a single
|
|
168
|
+
* `promptGuidance` partial — mergeConfig replaces the whole namespace per the
|
|
169
|
+
* layered precedence, which is correct because EVERY member is included (env
|
|
170
|
+
* supplies a complete inner object whenever ANY member is set).
|
|
171
|
+
*/
|
|
172
|
+
const PROMPT_GUIDANCE_ENV: Readonly<Record<string, 'boolean'>> = {
|
|
173
|
+
[ENV_PREFIX + 'PROMPT_GUIDANCE_TEST_FIRST']: 'boolean',
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/** The `DORFL_*` env var name for a config key (`perRepoMax` →
|
|
177
|
+
* `DORFL_PER_REPO_MAX`): the brand prefix + the key in `constantCase`. */
|
|
178
|
+
export function envVarName(key: keyof Config): string {
|
|
179
|
+
return ENV_PREFIX + constantCase(key);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** A raw env map (defaults to `process.env`). */
|
|
183
|
+
export type EnvMap = Record<string, string | undefined>;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Coerce a raw env string for one key, FAILING LOUDLY (with the offending var
|
|
187
|
+
* name) on invalid input: booleans accept only `true`/`false`; numbers reject
|
|
188
|
+
* NaN; enums must be in their union; list keys split on comma; strings verbatim.
|
|
189
|
+
*/
|
|
190
|
+
function coerceValue(
|
|
191
|
+
varName: string,
|
|
192
|
+
raw: string,
|
|
193
|
+
coercion: Coercion,
|
|
194
|
+
): unknown {
|
|
195
|
+
if (typeof coercion === 'object') {
|
|
196
|
+
// Enum: validate against the union.
|
|
197
|
+
if (!coercion.enum.includes(raw)) {
|
|
198
|
+
throw new Error(
|
|
199
|
+
`Invalid value for ${varName}: '${raw}'. ` +
|
|
200
|
+
`Expected one of: ${coercion.enum.join(', ')}.`,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
return raw;
|
|
204
|
+
}
|
|
205
|
+
switch (coercion) {
|
|
206
|
+
case 'string':
|
|
207
|
+
return raw;
|
|
208
|
+
case 'boolean':
|
|
209
|
+
if (raw === 'true') {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
if (raw === 'false') {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
throw new Error(
|
|
216
|
+
`Invalid boolean for ${varName}: '${raw}'. Expected 'true' or 'false'.`,
|
|
217
|
+
);
|
|
218
|
+
case 'number': {
|
|
219
|
+
const n = Number(raw);
|
|
220
|
+
if (raw.trim() === '' || Number.isNaN(n)) {
|
|
221
|
+
throw new Error(
|
|
222
|
+
`Invalid number for ${varName}: '${raw}'. Expected a numeric value.`,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
return n;
|
|
226
|
+
}
|
|
227
|
+
case 'list':
|
|
228
|
+
// Split on comma (cross-platform; not `:`), trimming each entry. An empty
|
|
229
|
+
// string ⇒ an empty list (an explicit "clear" of a list key).
|
|
230
|
+
return raw
|
|
231
|
+
.split(',')
|
|
232
|
+
.map((s) => s.trim())
|
|
233
|
+
.filter((s) => s !== '');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Read the `DORFL_*` env layer into a {@link PartialConfig}. Only vars
|
|
239
|
+
* actually present (and non-`undefined`) contribute, so absent env ⇒ `{}` and
|
|
240
|
+
* built-in floors/defaults are untouched. Each present var is coerced per its
|
|
241
|
+
* key's type; an invalid value throws LOUDLY naming the variable.
|
|
242
|
+
*
|
|
243
|
+
* Env may set ANY key — host-only included — because env is a per-machine
|
|
244
|
+
* source, NOT the committed repo file (see this module's doc + ADR §13).
|
|
245
|
+
*/
|
|
246
|
+
export function envOverrides(
|
|
247
|
+
env: EnvMap = process.env,
|
|
248
|
+
warn: (message: string) => void = (m) => console.error(`>> ${m}`),
|
|
249
|
+
): PartialConfig {
|
|
250
|
+
// A stale `DORFL_PROVIDER` (the removed provider OVERRIDE) is IGNORED with
|
|
251
|
+
// a one-line deprecation warning, never an error — the provider is now purely
|
|
252
|
+
// arbiter-derived; "suppress the PR" re-homes to `noPR` (`DORFL_NO_PR`).
|
|
253
|
+
const staleProvider = env[ENV_PREFIX + 'PROVIDER'];
|
|
254
|
+
if (staleProvider !== undefined) {
|
|
255
|
+
warn(
|
|
256
|
+
`Ignoring deprecated env var ${ENV_PREFIX}PROVIDER: the provider is now ` +
|
|
257
|
+
'purely arbiter-derived (a GitHub remote ⇒ the GitHub provider, else ' +
|
|
258
|
+
'none). To suppress the PR (the old `none` use), set ' +
|
|
259
|
+
`${ENV_PREFIX}NO_PR=true (or pass --no-pr).` +
|
|
260
|
+
(staleProvider === 'none'
|
|
261
|
+
? ' (your `none` maps directly to NO_PR=true.)'
|
|
262
|
+
: ''),
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
const overrides: PartialConfig = {};
|
|
266
|
+
// Per-member env layer for the `promptGuidance` NUDGE namespace. Each member
|
|
267
|
+
// is INDEPENDENTLY resolvable (`DORFL_PROMPT_GUIDANCE_<MEMBER>`); a
|
|
268
|
+
// present env var sets that member in the partial. We merge ALL set members
|
|
269
|
+
// into a single inner object, then assign once — the outer mergeConfig
|
|
270
|
+
// REPLACES the namespace per layer, so we send a coherent partial-inner per
|
|
271
|
+
// env override (a missing member there reads its default from the lower
|
|
272
|
+
// layer's namespace, which works because env is precisely a per-machine
|
|
273
|
+
// SETTER, not a gate).
|
|
274
|
+
const promptGuidancePartial: Partial<{testFirst: boolean}> = {};
|
|
275
|
+
for (const [varName, coercion] of Object.entries(PROMPT_GUIDANCE_ENV)) {
|
|
276
|
+
const raw = env[varName];
|
|
277
|
+
if (raw === undefined) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const value = coerceValue(varName, raw, coercion) as boolean;
|
|
281
|
+
if (varName === ENV_PREFIX + 'PROMPT_GUIDANCE_TEST_FIRST') {
|
|
282
|
+
promptGuidancePartial.testFirst = value;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (Object.keys(promptGuidancePartial).length > 0) {
|
|
286
|
+
overrides.promptGuidance = {
|
|
287
|
+
testFirst: promptGuidancePartial.testFirst ?? false,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
for (const key of Object.keys(KEY_COERCIONS) as (keyof Config)[]) {
|
|
291
|
+
const coercion = KEY_COERCIONS[key];
|
|
292
|
+
if (coercion === undefined) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const varName = envVarName(key);
|
|
296
|
+
const raw = env[varName];
|
|
297
|
+
if (raw === undefined) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const coerced = coerceValue(varName, raw, coercion);
|
|
301
|
+
// Type matches by construction: each coercion yields the key's value type.
|
|
302
|
+
(overrides as Record<string, unknown>)[key] = coerced;
|
|
303
|
+
}
|
|
304
|
+
return overrides;
|
|
305
|
+
}
|