dorfl 0.0.0 → 0.1.1
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 +3100 -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 +208 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +344 -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 +329 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +706 -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 +363 -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 +951 -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 +4379 -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 +477 -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 +1059 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +763 -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 +1437 -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,502 @@
|
|
|
1
|
+
import {existsSync, readFileSync} from 'node:fs';
|
|
2
|
+
import {join} from 'node:path';
|
|
3
|
+
import {
|
|
4
|
+
allAnswered,
|
|
5
|
+
isEntryAnswered,
|
|
6
|
+
parseSidecar,
|
|
7
|
+
sidecarPathFor,
|
|
8
|
+
type SidecarEntry,
|
|
9
|
+
type SidecarModel,
|
|
10
|
+
} from './sidecar.js';
|
|
11
|
+
import {run as runProc} from './git.js';
|
|
12
|
+
import {createJob, type Job} from './workspace.js';
|
|
13
|
+
import {
|
|
14
|
+
performIntegration,
|
|
15
|
+
type IntegrationCoreResult,
|
|
16
|
+
} from './integration-core.js';
|
|
17
|
+
import type {VerifyConfig} from './verify.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The **answered MERGE-QUESTION ACTION DISPATCH** (prd
|
|
21
|
+
* `land-time-reverify-and-parallel-merge-ceiling`, task
|
|
22
|
+
* `apply-rung-merge-disposition`; Stories #15, #16) — the deterministic,
|
|
23
|
+
* answer-driven RUNNER-ACTION layer that turns an answered
|
|
24
|
+
* `kind: merge` sidecar entry into a LAND through the EXISTING
|
|
25
|
+
* `integration-core.ts` land primitive (rebase → re-verify on the rebased tip →
|
|
26
|
+
* advance).
|
|
27
|
+
*
|
|
28
|
+
* This is a SIBLING of the agentic `decide()` content-decision in
|
|
29
|
+
* `apply-decide.ts`, NOT a route through it: a merge-acceptance has no
|
|
30
|
+
* judgement content (the human's plain `merge | hold | drop` answer IS the
|
|
31
|
+
* decision; the apply-time fresh-worktree re-verify on the rebased tip is the
|
|
32
|
+
* real correctness gate). Per the PRD's resolved mechanism, routing this
|
|
33
|
+
* through an LLM only adds cost and non-determinism, so the apply rung
|
|
34
|
+
* KIND-CHECKS the sidecar BEFORE calling the agentic decider: a sidecar entry
|
|
35
|
+
* carrying `kind: merge` (the typed dispatch field from `sidecar-kind-field`,
|
|
36
|
+
* stamped by `merge-question-surfacer`) dispatches HERE deterministically;
|
|
37
|
+
* content kinds (observation / triage / spec) keep going through `decide()` as
|
|
38
|
+
* today.
|
|
39
|
+
*
|
|
40
|
+
* The KEYING is the question identity + the human's plain answer:
|
|
41
|
+
*
|
|
42
|
+
* - `answer ≈ merge` → invoke the LAND primitive (see {@link performMergeLand})
|
|
43
|
+
* with `committedRecovery: true` + `freshWorktreeGate: true`. The unmerged
|
|
44
|
+
* `work/<slug>` is checked out via the EXISTING `workspace.ts` per-job
|
|
45
|
+
* worktree seam ({@link createJob} off the hub mirror), NOT a bespoke
|
|
46
|
+
* worktree/clone; `performIntegration` then re-verifies the REBASED tip and
|
|
47
|
+
* REFUSES on red (routes to needs-attention through its own shared seam),
|
|
48
|
+
* so `main` never receives a tree that fails `verify`.
|
|
49
|
+
* - `answer ≈ hold` → SKIP the land; the apply rung still records the answer
|
|
50
|
+
* in the item body via the normal apply path (the work branch stays
|
|
51
|
+
* unmerged; the next surface pass may re-emit a question).
|
|
52
|
+
* - `answer ≈ drop` → SKIP the land; the apply rung still records the answer
|
|
53
|
+
* in the item body via the normal apply path. (Cancellation of the work
|
|
54
|
+
* branch itself is out of this task's scope — the question is recorded as
|
|
55
|
+
* "drop" and the human / a later surfacer handles the artifact.)
|
|
56
|
+
*
|
|
57
|
+
* The STALE-APPROVAL POLICY (PRD OQ6, applied answer q1): default is the cheap
|
|
58
|
+
* "HONOUR the prior approval + land on a green re-verify" path; opt-in
|
|
59
|
+
* `strictMergeApproval` (resolved per-repo via the gate-family precedence chain
|
|
60
|
+
* by the sibling task `strict-merge-approval-gate`, default OFF) RE-SURFACES
|
|
61
|
+
* the merge-question instead of landing when the merge-base moved between the
|
|
62
|
+
* surfacer's question and this apply. The RED-re-verify refusal is unchanged
|
|
63
|
+
* in both modes.
|
|
64
|
+
*
|
|
65
|
+
* House-style boundary: this module is the DETERMINISTIC DISPATCH LAYER. It
|
|
66
|
+
* does NOT re-implement rebase / verify / integrate (it drives the EXISTING
|
|
67
|
+
* `performIntegration` with `committedRecovery: true` + `freshWorktreeGate:
|
|
68
|
+
* true`, which {@link createJob} cuts the worktree for), and it does NOT
|
|
69
|
+
* improvise a worktree or clone (it uses the same `createJob` seam the build /
|
|
70
|
+
* recovery callers use). Tests inject the {@link MergeActionHandler} seam so
|
|
71
|
+
* they assert on EXTERNAL behaviour (what lands on `main`, what routes to
|
|
72
|
+
* needs-attention, that `verify` ran on the rebased tip).
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
/** The three deterministic actions a merge-question answer encodes. */
|
|
76
|
+
export type MergeActionVerb = 'merge' | 'hold' | 'drop';
|
|
77
|
+
|
|
78
|
+
/** A detected, answer-driven merge-action keyed off ONE answered `kind: merge` entry. */
|
|
79
|
+
export interface DetectedMergeAction {
|
|
80
|
+
/** The deterministic verb parsed from the entry's answer text. */
|
|
81
|
+
verb: MergeActionVerb;
|
|
82
|
+
/** The answered `kind: merge` entry the verb came from. */
|
|
83
|
+
entry: SidecarEntry;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Parse the human's plain free-text answer into the deterministic
|
|
88
|
+
* {@link MergeActionVerb}. The merge-question surfacer renders
|
|
89
|
+
* `merge | hold | drop` in the entry's `default` as a human-readable hint, so
|
|
90
|
+
* the human typically types one of those words verbatim. We accept any text
|
|
91
|
+
* whose first whole word (case-insensitive) is one of `merge` / `hold` / `drop`
|
|
92
|
+
* — this is the same machine-parseable choice shape the surfacer's applied
|
|
93
|
+
* answer q1 documents ("a DETERMINISTIC CHOICE shape … the human picks and the
|
|
94
|
+
* system parses unambiguously").
|
|
95
|
+
*
|
|
96
|
+
* Returns `undefined` on ANYTHING else (an empty answer, a typo, a long
|
|
97
|
+
* narrative without one of the three words at the start) so the caller can
|
|
98
|
+
* route the ambiguity HONESTLY — never default-to-merge on a malformed answer,
|
|
99
|
+
* which would invent a land the human did not authorise.
|
|
100
|
+
*/
|
|
101
|
+
export function parseMergeAnswer(text: string): MergeActionVerb | undefined {
|
|
102
|
+
const trimmed = text.trim().toLowerCase();
|
|
103
|
+
if (trimmed === '') return undefined;
|
|
104
|
+
// The first whole alphabetic word; trailing punctuation (a comma, em-dash,
|
|
105
|
+
// period) and any following commentary are tolerated. We deliberately do
|
|
106
|
+
// NOT consume hyphens / apostrophes — the three verbs are plain ASCII
|
|
107
|
+
// words, and over-tolerating typo-shapes would silently invent a verb the
|
|
108
|
+
// human did not pick.
|
|
109
|
+
const match = /^([a-z]+)/.exec(trimmed);
|
|
110
|
+
if (match === null) return undefined;
|
|
111
|
+
const word = match[1];
|
|
112
|
+
if (word === 'merge' || word === 'hold' || word === 'drop') {
|
|
113
|
+
return word;
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Detect the FIRST answered `kind: merge` entry's deterministic action verb in
|
|
120
|
+
* a fully-answered sidecar (the apply rung's pre-decider kind-check). Returns
|
|
121
|
+
* `undefined` when the sidecar carries no answered `kind: merge` entry (the
|
|
122
|
+
* apply rung then proceeds to the existing path — agentic for observations,
|
|
123
|
+
* normal apply for task/prd content questions).
|
|
124
|
+
*
|
|
125
|
+
* The sidecar is read OFF DISK keyed off the namespaced item identity; the
|
|
126
|
+
* model is parsed via the SAME `parseSidecar` the rest of the engine uses.
|
|
127
|
+
* Returns `undefined` on a missing/unparseable sidecar (the caller's normal
|
|
128
|
+
* apply path will then raise the right error).
|
|
129
|
+
*/
|
|
130
|
+
export function detectAnsweredMergeAction(
|
|
131
|
+
cwd: string,
|
|
132
|
+
item: string,
|
|
133
|
+
): DetectedMergeAction | undefined {
|
|
134
|
+
const abs = join(cwd, sidecarPathFor(item));
|
|
135
|
+
if (!existsSync(abs)) return undefined;
|
|
136
|
+
let model: SidecarModel;
|
|
137
|
+
try {
|
|
138
|
+
model = parseSidecar(readFileSync(abs, 'utf8'));
|
|
139
|
+
} catch {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
if (!allAnswered(model)) return undefined;
|
|
143
|
+
for (const entry of model.entries) {
|
|
144
|
+
if (entry.kind !== 'merge') continue;
|
|
145
|
+
if (!isEntryAnswered(entry)) continue;
|
|
146
|
+
const verb = parseMergeAnswer(entry.answer);
|
|
147
|
+
if (verb !== undefined) {
|
|
148
|
+
return {verb, entry};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** Input the production merge-action handler consumes. */
|
|
155
|
+
export interface MergeActionInput {
|
|
156
|
+
/** The detected action (verb + source entry). */
|
|
157
|
+
action: DetectedMergeAction;
|
|
158
|
+
/** The namespaced item identity (`task:<slug>`). */
|
|
159
|
+
item: string;
|
|
160
|
+
/** The bare slug (the work branch is `work/task-<slug>` / `work/<slug>`). */
|
|
161
|
+
slug: string;
|
|
162
|
+
/** The apply rung's working clone (used to resolve the arbiter URL when needed). */
|
|
163
|
+
cwd: string;
|
|
164
|
+
/** The arbiter remote NAME in `cwd` (defaults to `origin`). */
|
|
165
|
+
arbiter: string;
|
|
166
|
+
/**
|
|
167
|
+
* The arbiter URL the land worktree mirrors from. When set, used DIRECTLY
|
|
168
|
+
* (the registry-set advance driver threads the per-mirror origin URL here).
|
|
169
|
+
* When unset, the URL is resolved from `cwd` + `arbiter` via `git remote
|
|
170
|
+
* get-url` (the in-place / one-shot caller).
|
|
171
|
+
*/
|
|
172
|
+
arbiterUrl?: string;
|
|
173
|
+
/** The execution working area (`~/.dorfl` by default) `createJob` cuts under. */
|
|
174
|
+
workspacesDir: string;
|
|
175
|
+
/** Per-repo env-prep config the fresh-worktree gate runs before `verify`. */
|
|
176
|
+
prepare?: VerifyConfig;
|
|
177
|
+
/** Per-repo acceptance gate (`verify`). */
|
|
178
|
+
verify?: VerifyConfig;
|
|
179
|
+
/**
|
|
180
|
+
* `strictMergeApproval` (resolved per-repo by the sibling task
|
|
181
|
+
* `strict-merge-approval-gate`; default OFF). OFF ⇒ honour the prior answer
|
|
182
|
+
* + land on a green re-verify (the cheap default). ON ⇒ re-surface the
|
|
183
|
+
* merge-question when the merge-base moved between the surfacer's question
|
|
184
|
+
* and this apply (don't land; the apply rung folds this into a re-pause).
|
|
185
|
+
*/
|
|
186
|
+
strictMergeApproval?: boolean;
|
|
187
|
+
/** Bounded recovery-rebase retry knob (mirrors the build path). */
|
|
188
|
+
recoveryRebaseRetries?: number;
|
|
189
|
+
/** Modest livelock-spreading jitter (ms) between recovery-rebase retries. */
|
|
190
|
+
recoveryRebaseJitterMs?: number;
|
|
191
|
+
/** Cross-job land-CAS retry cap (the `mergeRetries` precedence chain). */
|
|
192
|
+
mergeRetries?: number;
|
|
193
|
+
/** Environment for child git processes. */
|
|
194
|
+
env?: NodeJS.ProcessEnv;
|
|
195
|
+
/** Sink for human-readable progress notes. */
|
|
196
|
+
note?: (message: string) => void;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** The terminal verbs the dispatcher reports to the apply rung. */
|
|
200
|
+
export type MergeActionOutcome =
|
|
201
|
+
/** `answer=merge` + green re-verify ⇒ the kept commit landed on `<arbiter>/main`. */
|
|
202
|
+
| 'landed'
|
|
203
|
+
/** `answer=merge` + the kept tip was already on `<arbiter>/main` (idempotent re-run). */
|
|
204
|
+
| 'already-integrated'
|
|
205
|
+
/**
|
|
206
|
+
* `answer=merge` + RED re-verify on the rebased tip (or a rebase-conflict): the
|
|
207
|
+
* land was REFUSED; `performIntegration` routed the item to needs-attention
|
|
208
|
+
* through its shared seam — `main` never received the failing tree. The apply
|
|
209
|
+
* rung short-circuits (does NOT resolve the sidecar, so the open question
|
|
210
|
+
* stays surfaced for a human follow-up).
|
|
211
|
+
*/
|
|
212
|
+
| 'refused'
|
|
213
|
+
/**
|
|
214
|
+
* `answer=merge` + `strictMergeApproval` ON + the merge-base moved between
|
|
215
|
+
* the surfacer's question and this apply: the dispatcher RE-SURFACES the
|
|
216
|
+
* merge-question (the apply rung appends a fresh follow-up + re-pauses).
|
|
217
|
+
*/
|
|
218
|
+
| 'restale'
|
|
219
|
+
/** `answer=hold` ⇒ no land; the apply rung records the answer in body as usual. */
|
|
220
|
+
| 'hold'
|
|
221
|
+
/** `answer=drop` ⇒ no land; the apply rung records the answer in body as usual. */
|
|
222
|
+
| 'drop';
|
|
223
|
+
|
|
224
|
+
/** What the production handler returns to the apply rung. */
|
|
225
|
+
export interface MergeActionResult {
|
|
226
|
+
outcome: MergeActionOutcome;
|
|
227
|
+
/** Human-readable summary for the rung's message. */
|
|
228
|
+
message: string;
|
|
229
|
+
/**
|
|
230
|
+
* The integration-core result, when the dispatcher reached
|
|
231
|
+
* `performIntegration` (i.e. `answer=merge` + not re-staled). Carries the
|
|
232
|
+
* routing observed by the land primitive (`gate-failed`, `completed`,
|
|
233
|
+
* `already-integrated`, …), so callers can branch on it.
|
|
234
|
+
*/
|
|
235
|
+
integration?: IntegrationCoreResult;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* The injectable dispatch SEAM. Production wires {@link performMergeAction}
|
|
240
|
+
* (which checks out via `createJob` + lands via `performIntegration`); tests
|
|
241
|
+
* inject a stub to assert the apply-rung short-circuits on `refused` and falls
|
|
242
|
+
* through on `landed` / `hold` / `drop` / `restale` WITHOUT spinning up a real
|
|
243
|
+
* hub mirror.
|
|
244
|
+
*/
|
|
245
|
+
export type MergeActionHandler = (
|
|
246
|
+
input: MergeActionInput,
|
|
247
|
+
) => Promise<MergeActionResult>;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Resolve the arbiter URL the land worktree mirrors from. Prefers the
|
|
251
|
+
* caller-supplied `arbiterUrl` (the registry-set advance driver knows it
|
|
252
|
+
* directly); falls back to `git remote get-url <arbiter>` in the apply rung's
|
|
253
|
+
* `cwd` (the in-place / one-shot caller). Returns `undefined` when the URL
|
|
254
|
+
* cannot be resolved — the caller maps that to a clean refusal.
|
|
255
|
+
*/
|
|
256
|
+
function resolveArbiterUrl(input: MergeActionInput): string | undefined {
|
|
257
|
+
if (input.arbiterUrl !== undefined && input.arbiterUrl !== '') {
|
|
258
|
+
return input.arbiterUrl;
|
|
259
|
+
}
|
|
260
|
+
const res = runProc('git', ['remote', 'get-url', input.arbiter], input.cwd, {
|
|
261
|
+
env: input.env,
|
|
262
|
+
});
|
|
263
|
+
if (res.status !== 0) return undefined;
|
|
264
|
+
const url = res.stdout.trim();
|
|
265
|
+
return url === '' ? undefined : url;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* The `strictMergeApproval` re-stale check (PRD OQ6 opt-in): did `<arbiter>/
|
|
270
|
+
* main` move past the merge-base of the work branch since the surfacer
|
|
271
|
+
* authored the question? The git-alone analogue of GitHub's "dismiss stale
|
|
272
|
+
* approvals when the base changes" — host-agnostic by reachability.
|
|
273
|
+
*
|
|
274
|
+
* We fetch the latest `<arbiter>/main` from the JOB worktree's hub mirror (the
|
|
275
|
+
* worktree's `origin`), compute `merge-base(<branch>, <origin/main>)`, and
|
|
276
|
+
* compare against `<origin/main>` itself: if the merge-base IS `<origin/main>`,
|
|
277
|
+
* the branch is a strict descendant — the merge-base did NOT move — and the
|
|
278
|
+
* cheap default applies (HONOUR + land on green re-verify). If the merge-base
|
|
279
|
+
* is NOT `<origin/main>`, `main` advanced past the branch's divergence point
|
|
280
|
+
* since the branch was last rebased — the merge-base MOVED — and the strict
|
|
281
|
+
* mode re-surfaces.
|
|
282
|
+
*
|
|
283
|
+
* Returns `true` when the merge-base moved (⇒ re-surface), `false` otherwise.
|
|
284
|
+
* On any plumbing failure returns `false` (do NOT spuriously re-surface — the
|
|
285
|
+
* red re-verify is still the load-bearing safety; a transient git failure must
|
|
286
|
+
* not block a clean answer-then-land).
|
|
287
|
+
*/
|
|
288
|
+
function mergeBaseMoved(job: Job, env: NodeJS.ProcessEnv | undefined): boolean {
|
|
289
|
+
const fetch = runProc(
|
|
290
|
+
'git',
|
|
291
|
+
[
|
|
292
|
+
'fetch',
|
|
293
|
+
'--quiet',
|
|
294
|
+
job.arbiterRemote,
|
|
295
|
+
`+refs/heads/main:refs/remotes/${job.arbiterRemote}/main`,
|
|
296
|
+
],
|
|
297
|
+
job.dir,
|
|
298
|
+
{env},
|
|
299
|
+
);
|
|
300
|
+
if (fetch.status !== 0) return false;
|
|
301
|
+
const mainRef = `${job.arbiterRemote}/main`;
|
|
302
|
+
const mainSha = runProc(
|
|
303
|
+
'git',
|
|
304
|
+
['rev-parse', '--verify', '--quiet', mainRef],
|
|
305
|
+
job.dir,
|
|
306
|
+
{env},
|
|
307
|
+
);
|
|
308
|
+
if (mainSha.status !== 0) return false;
|
|
309
|
+
const base = runProc('git', ['merge-base', 'HEAD', mainRef], job.dir, {env});
|
|
310
|
+
if (base.status !== 0) return false;
|
|
311
|
+
return base.stdout.trim() !== mainSha.stdout.trim();
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* The PRODUCTION dispatcher: an answered `kind: merge` entry's verb drives one
|
|
316
|
+
* of the four terminals (`landed` / `refused` / `restale` / `hold|drop`). For
|
|
317
|
+
* `answer=merge` it checks out the unmerged `work/<slug>` via the EXISTING
|
|
318
|
+
* `workspace.ts` per-job worktree seam ({@link createJob}, the same seam the
|
|
319
|
+
* build / recovery callers use) and invokes the LAND primitive
|
|
320
|
+
* ({@link performIntegration}) with `committedRecovery: true` +
|
|
321
|
+
* `freshWorktreeGate: true` — so the rebased tip is re-verified BEFORE it
|
|
322
|
+
* lands, the answered-merge land path NEVER integrates a clean-rebase-but-
|
|
323
|
+
* broken tree, and a refusal routes to needs-attention through the SAME
|
|
324
|
+
* shared seam (`applyNeedsAttentionTransition`) the build path uses. The job
|
|
325
|
+
* worktree is always disposed (success or failure) so the hub mirror does not
|
|
326
|
+
* accumulate stale per-job state.
|
|
327
|
+
*
|
|
328
|
+
* For `answer=hold` and `answer=drop` the dispatcher does not land — it just
|
|
329
|
+
* tells the apply rung to fall through to the normal answer-recording path.
|
|
330
|
+
* (Cancellation of the work branch on `drop` is OUT OF SCOPE; the answer is
|
|
331
|
+
* recorded and a future surfacer / human handles the artifact.)
|
|
332
|
+
*/
|
|
333
|
+
export async function performMergeAction(
|
|
334
|
+
input: MergeActionInput,
|
|
335
|
+
): Promise<MergeActionResult> {
|
|
336
|
+
const note = input.note ?? (() => {});
|
|
337
|
+
const {verb} = input.action;
|
|
338
|
+
|
|
339
|
+
if (verb === 'hold') {
|
|
340
|
+
return {
|
|
341
|
+
outcome: 'hold',
|
|
342
|
+
message:
|
|
343
|
+
`merge-question for ${input.item} answered HOLD — leaving \`work/${input.slug}\` ` +
|
|
344
|
+
`unmerged (the answer is recorded in the item body).`,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
if (verb === 'drop') {
|
|
348
|
+
return {
|
|
349
|
+
outcome: 'drop',
|
|
350
|
+
message:
|
|
351
|
+
`merge-question for ${input.item} answered DROP — leaving \`work/${input.slug}\` ` +
|
|
352
|
+
`unmerged (the answer is recorded; cancellation of the work branch is ` +
|
|
353
|
+
`out of this dispatcher's scope).`,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// verb === 'merge'
|
|
358
|
+
const url = resolveArbiterUrl(input);
|
|
359
|
+
if (url === undefined) {
|
|
360
|
+
return {
|
|
361
|
+
outcome: 'refused',
|
|
362
|
+
message:
|
|
363
|
+
`merge-question for ${input.item} answered MERGE — but the arbiter URL ` +
|
|
364
|
+
`could not be resolved (no arbiterUrl threaded, and \`git remote get-url ` +
|
|
365
|
+
`${input.arbiter}\` failed in ${input.cwd}). NOT landing; the answer ` +
|
|
366
|
+
`stays surfaced.`,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Check out the unmerged `work/<type>-<slug>` via the EXISTING per-job
|
|
371
|
+
// worktree seam — the SAME seam build/recovery callers use, NOT a bespoke
|
|
372
|
+
// worktree or clone. The job dir is the worktree `performIntegration` works
|
|
373
|
+
// from; its `arbiterRemote` is the worktree's `origin` (a bare-hub remote
|
|
374
|
+
// that mirrors the real arbiter), which the integration core push-targets.
|
|
375
|
+
let job: Job;
|
|
376
|
+
try {
|
|
377
|
+
job = createJob({
|
|
378
|
+
url,
|
|
379
|
+
slug: input.slug,
|
|
380
|
+
type: 'task',
|
|
381
|
+
workspacesDir: input.workspacesDir,
|
|
382
|
+
env: input.env,
|
|
383
|
+
});
|
|
384
|
+
} catch (err) {
|
|
385
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
386
|
+
return {
|
|
387
|
+
outcome: 'refused',
|
|
388
|
+
message:
|
|
389
|
+
`merge-question for ${input.item} answered MERGE — but checking out ` +
|
|
390
|
+
`\`work/${input.slug}\` via the per-job worktree seam failed (${detail}). ` +
|
|
391
|
+
`NOT landing; the answer stays surfaced.`,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
try {
|
|
396
|
+
// CONTINUE-rebase-conflict: createJob's CONTINUE-rebase aborted on a
|
|
397
|
+
// genuine code conflict. The kept work stays on the branch (recoverable);
|
|
398
|
+
// we refuse the land and route via the standard refusal shape.
|
|
399
|
+
if (job.continueRebaseConflict) {
|
|
400
|
+
return {
|
|
401
|
+
outcome: 'refused',
|
|
402
|
+
message:
|
|
403
|
+
`merge-question for ${input.item} answered MERGE — but rebasing ` +
|
|
404
|
+
`\`work/${input.slug}\` onto current main conflicted (the kept work is ` +
|
|
405
|
+
`intact on the branch; resolve and re-answer). NOT landing.`,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
if (job.continuePushFailure !== undefined) {
|
|
409
|
+
return {
|
|
410
|
+
outcome: 'refused',
|
|
411
|
+
message:
|
|
412
|
+
`merge-question for ${input.item} answered MERGE — but the ` +
|
|
413
|
+
`continue-rebase push to the arbiter failed (${job.continuePushFailure}). ` +
|
|
414
|
+
`NOT landing; the kept work is intact on the branch.`,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// STRICT re-stale check (OQ6 opt-in): when ON and the merge-base moved
|
|
419
|
+
// between the surfacer's question and this apply, RE-SURFACE the
|
|
420
|
+
// merge-question (the apply rung folds this into a re-pause) instead of
|
|
421
|
+
// landing. Default OFF ⇒ this block is skipped; the cheap "green
|
|
422
|
+
// re-verify is enough" path runs.
|
|
423
|
+
if (input.strictMergeApproval === true && mergeBaseMoved(job, input.env)) {
|
|
424
|
+
return {
|
|
425
|
+
outcome: 'restale',
|
|
426
|
+
message:
|
|
427
|
+
`merge-question for ${input.item} answered MERGE — but ` +
|
|
428
|
+
`strictMergeApproval is ON and the merge-base of \`work/${input.slug}\` ` +
|
|
429
|
+
`moved between answer and apply: RE-SURFACING the merge-question ` +
|
|
430
|
+
`(no land; the human re-confirms against the new base).`,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// LAND through the EXISTING `performIntegration`. The branch's tip
|
|
435
|
+
// already carries its done-move commit (surfacer enumerates `work/*`
|
|
436
|
+
// unreachable from main, so it is a previously-built strand), so we
|
|
437
|
+
// drive the committed-recovery tail — but with `freshWorktreeGate: true`
|
|
438
|
+
// so the REBASED TIP is re-verified BEFORE the integrate (the
|
|
439
|
+
// `committed-recovery-honours-fresh-worktree-gate` task's contract).
|
|
440
|
+
const integration = await performIntegration({
|
|
441
|
+
cwd: job.dir,
|
|
442
|
+
arbiter: job.arbiterRemote,
|
|
443
|
+
slug: input.slug,
|
|
444
|
+
source: 'tasks-ready',
|
|
445
|
+
recovering: false,
|
|
446
|
+
committedRecovery: true,
|
|
447
|
+
freshWorktreeGate: true,
|
|
448
|
+
prepare: input.prepare,
|
|
449
|
+
verify: input.verify,
|
|
450
|
+
mode: 'merge',
|
|
451
|
+
// surfaceArbiter is set so a RED rebased-tip gate (or a rebase
|
|
452
|
+
// conflict surfaced during the retry loop) routes to needs-attention
|
|
453
|
+
// observably on the arbiter (not local-only). The build path uses
|
|
454
|
+
// this shape; we mirror it here for the answered-merge land.
|
|
455
|
+
surfaceArbiter: job.arbiterRemote,
|
|
456
|
+
recoveryRebaseRetries: input.recoveryRebaseRetries,
|
|
457
|
+
recoveryRebaseJitterMs: input.recoveryRebaseJitterMs,
|
|
458
|
+
mergeRetries: input.mergeRetries,
|
|
459
|
+
env: input.env,
|
|
460
|
+
note,
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
if (integration.outcome === 'completed') {
|
|
464
|
+
return {
|
|
465
|
+
outcome: 'landed',
|
|
466
|
+
message:
|
|
467
|
+
`merge-question for ${input.item} answered MERGE — landed ` +
|
|
468
|
+
`\`work/${input.slug}\` on \`${job.arbiterRemote}/main\` via the ` +
|
|
469
|
+
`land primitive (rebase → re-verify on the rebased tip → advance).`,
|
|
470
|
+
integration,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
if (integration.outcome === 'already-integrated') {
|
|
474
|
+
return {
|
|
475
|
+
outcome: 'already-integrated',
|
|
476
|
+
message:
|
|
477
|
+
`merge-question for ${input.item} answered MERGE — \`work/${input.slug}\` ` +
|
|
478
|
+
`was already on \`${job.arbiterRemote}/main\` (idempotent re-run).`,
|
|
479
|
+
integration,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
// gate-failed / prepare-failed / review-blocked / review-unparseable /
|
|
483
|
+
// rebase-conflict / invariant-violation: the land was REFUSED;
|
|
484
|
+
// performIntegration routed the bounce per its own shared seam (gated by
|
|
485
|
+
// `surfaceArbiter`), so `main` never received a failing tree.
|
|
486
|
+
return {
|
|
487
|
+
outcome: 'refused',
|
|
488
|
+
message:
|
|
489
|
+
integration.reason ??
|
|
490
|
+
`merge-question for ${input.item} answered MERGE — the land was REFUSED ` +
|
|
491
|
+
`(${integration.outcome}); NOT landing; the answer stays surfaced.`,
|
|
492
|
+
integration,
|
|
493
|
+
};
|
|
494
|
+
} finally {
|
|
495
|
+
try {
|
|
496
|
+
job.dispose();
|
|
497
|
+
} catch {
|
|
498
|
+
// Best-effort: a failed dispose leaves a reapable per-job worktree
|
|
499
|
+
// behind, which `gc` cleans up. Never crash the dispatch on teardown.
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|