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
package/src/isolation.ts
ADDED
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
import {git} from './git.js';
|
|
2
|
+
import {createJob, type Job} from './workspace.js';
|
|
3
|
+
import {reapJob} from './gc.js';
|
|
4
|
+
import {
|
|
5
|
+
branchAheadOfArbiter,
|
|
6
|
+
rebaseContinuedBranchOntoMain,
|
|
7
|
+
pushContinuedBranchWithStaleLeaseRetry,
|
|
8
|
+
} from './continue-branch.js';
|
|
9
|
+
import {workBranchRef, type SlugNamespace} from './slug-namespace.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The **isolation-strategy seam** (`docs/adr/command-surface-and-journeys.md`
|
|
13
|
+
* §3; substrate ADR §1/§2/§4): one seam, two strategies, selected by whether
|
|
14
|
+
* there is a checkout —
|
|
15
|
+
*
|
|
16
|
+
* - **in-place** — the current checkout (a human's clone, or the CI container)
|
|
17
|
+
* IS the isolation: claim + build + gate + integrate operate directly in the
|
|
18
|
+
* current working tree on its `work/<slug>` branch. NO hub mirror, NO
|
|
19
|
+
* external worktree, NO reap (the human's checkout is left in a defined
|
|
20
|
+
* state, never deleted).
|
|
21
|
+
* - **job-worktree** — materialise a hub mirror + an external job worktree in
|
|
22
|
+
* the agents' area (`workspacesDir`), EXACTLY as `run`'s `createJob` path
|
|
23
|
+
* does (ADR §1/§2), with end-of-job teardown re-applying the §4
|
|
24
|
+
* provably-safe deletion predicate (`reapJob`).
|
|
25
|
+
*
|
|
26
|
+
* The load-bearing design constraint is the **uniform handle** ({@link
|
|
27
|
+
* IsolatedTree}): both strategies expose the SAME fields the post-claim pipeline
|
|
28
|
+
* reads (`dir`/`branch`/`arbiterRemote`/`arbiterUrl`) plus a strategy-appropriate
|
|
29
|
+
* `teardown`, so the shared build→gate→done-move→rebase→integrate→teardown steps
|
|
30
|
+
* run against EITHER strategy without knowing WHERE the tree lives. This removes
|
|
31
|
+
* the `Job`-shape coupling from the pipeline (`run`'s old `runOneItem` read a
|
|
32
|
+
* concrete `Job`).
|
|
33
|
+
*
|
|
34
|
+
* Wiring a COMMAND to the in-place strategy is the `do-in-place` task — this
|
|
35
|
+
* module only provides the seam + both implementors; `run` keeps using the
|
|
36
|
+
* job-worktree strategy (its observable behaviour is byte-identical).
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The uniform handle the post-claim pipeline reads from — satisfied IDENTICALLY
|
|
41
|
+
* by both strategies, so the shared steps never depend on a concrete `Job` (and
|
|
42
|
+
* thus never assume a hub mirror / external worktree).
|
|
43
|
+
*/
|
|
44
|
+
export interface IsolatedTree {
|
|
45
|
+
/**
|
|
46
|
+
* The working tree the agent + tests run in: the job worktree (job-worktree
|
|
47
|
+
* strategy) or the current checkout (in-place strategy).
|
|
48
|
+
*/
|
|
49
|
+
dir: string;
|
|
50
|
+
/** The work branch checked out there (`work/<type>-<slug>`). */
|
|
51
|
+
branch: string;
|
|
52
|
+
/**
|
|
53
|
+
* The git remote NAME, VALID INSIDE `dir`, that tracks the arbiter — the
|
|
54
|
+
* rebase/integrate push target. Job-worktree: `origin` (the bare hub mirror's
|
|
55
|
+
* clone remote). In-place: the checkout's own arbiter remote name.
|
|
56
|
+
*/
|
|
57
|
+
arbiterRemote: string;
|
|
58
|
+
/**
|
|
59
|
+
* The arbiter remote URL used for provider auto-detection (a GitHub URL ⇒ the
|
|
60
|
+
* `gh` provider). Job-worktree: the mirror's resolved arbiter URL
|
|
61
|
+
* (`job.mirror.url` today). In-place: the checkout's arbiter remote URL.
|
|
62
|
+
*/
|
|
63
|
+
arbiterUrl: string;
|
|
64
|
+
/**
|
|
65
|
+
* True iff this tree CONTINUED a kept arbiter `work/<slug>` branch (a requeue)
|
|
66
|
+
* rather than cutting fresh off main — the SAME continue-detection both
|
|
67
|
+
* onboarding paths use. The prompt assembly injects a CONTINUE block when set
|
|
68
|
+
* (the `agent-prompt-continue-context` task). Absent / false on a fresh cut.
|
|
69
|
+
*/
|
|
70
|
+
continued?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* True iff a CONTINUE rebase onto fresh main CONFLICTED at onboard-time
|
|
73
|
+
* (a requeue kept a `work/<slug>` whose commits did not replay onto the
|
|
74
|
+
* current main; aborted, never auto-resolved). The pipeline routes the item
|
|
75
|
+
* to needs-attention (the §10 path) instead of running the agent. Absent /
|
|
76
|
+
* false on a fresh cut and on a clean continue.
|
|
77
|
+
*/
|
|
78
|
+
continueRebaseConflict?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Set iff the CONTINUE reconcile push to the arbiter FAILED TERMINALLY at
|
|
81
|
+
* onboard-time (the stale-lease retry cap exhausted, or a non-stale-lease
|
|
82
|
+
* rejection / unreachable arbiter) — the push helper THROWS, caught so the run
|
|
83
|
+
* does NOT crash leaving the task silently in-progress on the arbiter (the
|
|
84
|
+
* stale-lease-strand bug). The pipeline routes the item to needs-attention,
|
|
85
|
+
* the kept work left committed + recoverable on the branch. Absent on a fresh
|
|
86
|
+
* cut, a clean continue that pushed, and a rebase conflict (which sets
|
|
87
|
+
* {@link continueRebaseConflict} instead).
|
|
88
|
+
*/
|
|
89
|
+
continuePushFailure?: string;
|
|
90
|
+
/**
|
|
91
|
+
* Tear the isolated tree down per the strategy. Job-worktree: re-apply the §4
|
|
92
|
+
* deletion-safety predicate and `git worktree remove`/prune the worktree ONLY
|
|
93
|
+
* if provably safe (`reapJob`). In-place: a NO-OP — the human's checkout is
|
|
94
|
+
* left in a defined state, NEVER reaped. Always safe to call (e.g. in a
|
|
95
|
+
* `finally`).
|
|
96
|
+
*
|
|
97
|
+
* `opts.reachableOnly` (job-worktree only) drops the clean-tree half of the
|
|
98
|
+
* predicate, keeping the reachable-on-arbiter half: a worktree whose durable
|
|
99
|
+
* branch is provably on the arbiter is reaped EVEN WHEN its tree has incidental
|
|
100
|
+
* churn. This is the FAILURE-path opt-in (`performDoRemote`'s needs-attention
|
|
101
|
+
* return, where the seam has already surfaced + pushed the branch), so a
|
|
102
|
+
* churn-dirty-but-arbiter-safe worktree does not linger to poison the next
|
|
103
|
+
* build. It NEVER reaps work not yet on the arbiter (reachability stands).
|
|
104
|
+
* The in-place teardown ignores it (still a no-op).
|
|
105
|
+
*/
|
|
106
|
+
teardown(opts?: {reachableOnly?: boolean}): void;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** What a strategy needs to prepare an isolated tree for one work item. */
|
|
110
|
+
export interface PrepareInput {
|
|
111
|
+
/** The work slug being processed (→ branch `work/<type>-<slug>`). */
|
|
112
|
+
slug: string;
|
|
113
|
+
/**
|
|
114
|
+
* The item TYPE — `'task'` for a build (intake/`do task:`), `'prd'` for a
|
|
115
|
+
* prd-tasking run (`do prd:`). It NAMESPACES the work branch via
|
|
116
|
+
* {@link workBranchRef} so a same-slug task and prd never collide on the
|
|
117
|
+
* arbiter branch. Defaults to `'task'` (the overwhelmingly-common build
|
|
118
|
+
* path); the prd-tasking path passes `'prd'` explicitly.
|
|
119
|
+
*/
|
|
120
|
+
type?: SlugNamespace;
|
|
121
|
+
/**
|
|
122
|
+
* The sha of the claim commit (`claim: <slug>`) just landed on the arbiter,
|
|
123
|
+
* surfaced out of `performClaim`. The in-place FRESH path branches the work
|
|
124
|
+
* branch from THIS exact commit (and HARD-FAILS if it is unreachable from
|
|
125
|
+
* `<arbiter>/main`) — never a stale same-named branch or a not-yet-advanced
|
|
126
|
+
* local main. Absent on a resume/continue or when the caller has no claim
|
|
127
|
+
* commit (the job-worktree strategy ignores it).
|
|
128
|
+
*/
|
|
129
|
+
claimCommit?: string;
|
|
130
|
+
/** Environment for child git/agent processes. */
|
|
131
|
+
env?: NodeJS.ProcessEnv;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A way to acquire (and tear down) an isolated working tree on a freshly-fetched
|
|
136
|
+
* main for a slug. The signatures stay SEMANTIC — "prepare an isolated tree;
|
|
137
|
+
* expose a uniform handle; tear it down" — and DO NOT assume WHERE the tree
|
|
138
|
+
* lives, so `do --remote`/`run` (job-worktree) and `do-in-place` (in-place) each
|
|
139
|
+
* select their strategy without the pipeline knowing.
|
|
140
|
+
*/
|
|
141
|
+
export interface IsolationStrategy {
|
|
142
|
+
/** Stable strategy name (for diagnostics / records). */
|
|
143
|
+
readonly name: 'in-place' | 'job-worktree';
|
|
144
|
+
/**
|
|
145
|
+
* Prepare an isolated working tree for `slug` on a freshly-fetched main and
|
|
146
|
+
* return the uniform handle. The handle's `teardown` reverses it per strategy.
|
|
147
|
+
*/
|
|
148
|
+
prepare(input: PrepareInput): IsolatedTree;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The **job-worktree** strategy — `run`'s EXISTING isolation, extracted behind
|
|
153
|
+
* the seam UNCHANGED. `prepare` ensures the hub mirror + cuts a per-job worktree
|
|
154
|
+
* off the freshly-fetched `<hub>/main` (`createJob`); the handle's `teardown`
|
|
155
|
+
* re-applies the §4 provably-safe deletion predicate (`reapJob`) — reaping the
|
|
156
|
+
* worktree iff its work is clean AND on the arbiter, retaining it otherwise (the
|
|
157
|
+
* never-lose-work signal). The arbiter remote inside the worktree is `origin`
|
|
158
|
+
* (the bare mirror's clone remote), and provider detection keys off the mirror's
|
|
159
|
+
* resolved arbiter URL — byte-identical to today's `run`.
|
|
160
|
+
*/
|
|
161
|
+
export function jobWorktreeStrategy(options: {
|
|
162
|
+
/** A working repo to resolve the arbiter URL from (with `arbiter`). */
|
|
163
|
+
fromRepo: string;
|
|
164
|
+
/** Remote name in `fromRepo` whose URL to mirror (default `origin`). */
|
|
165
|
+
arbiter?: string;
|
|
166
|
+
/** The execution working area (config `workspacesDir`). */
|
|
167
|
+
workspacesDir: string;
|
|
168
|
+
}): IsolationStrategy {
|
|
169
|
+
return {
|
|
170
|
+
name: 'job-worktree',
|
|
171
|
+
prepare({slug, type, env}): IsolatedTree {
|
|
172
|
+
const job: Job = createJob({
|
|
173
|
+
fromRepo: options.fromRepo,
|
|
174
|
+
arbiter: options.arbiter,
|
|
175
|
+
slug,
|
|
176
|
+
type: type ?? 'task',
|
|
177
|
+
workspacesDir: options.workspacesDir,
|
|
178
|
+
env,
|
|
179
|
+
});
|
|
180
|
+
return jobWorktreeHandle(job, env);
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Build the uniform handle for a job-worktree `Job` — the EXACT fields `run`'s
|
|
187
|
+
* pipeline read off `job` today (`dir`/`branch`/`arbiterRemote`/`mirror.url`)
|
|
188
|
+
* plus the `reapJob` teardown. Exposed so a caller that already created the
|
|
189
|
+
* `Job` (e.g. `run`'s pipeline, mid-extraction) can wrap it without re-creating.
|
|
190
|
+
*/
|
|
191
|
+
export function jobWorktreeHandle(
|
|
192
|
+
job: Job,
|
|
193
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
194
|
+
): IsolatedTree {
|
|
195
|
+
return {
|
|
196
|
+
dir: job.dir,
|
|
197
|
+
branch: job.branch,
|
|
198
|
+
arbiterRemote: job.arbiterRemote,
|
|
199
|
+
arbiterUrl: job.mirror.url,
|
|
200
|
+
continued: job.continued,
|
|
201
|
+
continueRebaseConflict: job.continueRebaseConflict,
|
|
202
|
+
continuePushFailure: job.continuePushFailure,
|
|
203
|
+
teardown(opts?: {reachableOnly?: boolean}): void {
|
|
204
|
+
// Auto-reap at end-of-job (ADR §4): re-apply the provably-safe deletion
|
|
205
|
+
// predicate and remove the worktree ONLY if it holds (clean tree AND the
|
|
206
|
+
// branch tip reachable on the arbiter). NEVER `--force` here.
|
|
207
|
+
//
|
|
208
|
+
// `reachableOnly` (the FAILURE-path opt-in) drops the clean-tree half but
|
|
209
|
+
// KEEPS reachability: a churn-dirty worktree whose durable branch is on
|
|
210
|
+
// the arbiter is reaped (it would otherwise linger and poison the next
|
|
211
|
+
// build's fetch); a worktree whose work is NOT yet on the arbiter is still
|
|
212
|
+
// retained (never lose work).
|
|
213
|
+
reapJob({
|
|
214
|
+
dir: job.dir,
|
|
215
|
+
branch: job.branch,
|
|
216
|
+
mirrorPath: job.mirror.path,
|
|
217
|
+
arbiter: job.arbiterRemote,
|
|
218
|
+
reachableOnly: opts?.reachableOnly === true,
|
|
219
|
+
env,
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* The **in-place** strategy — the current checkout (a human's clone, or the CI
|
|
227
|
+
* container) IS the isolation. `prepare` fetches the arbiter and switches the
|
|
228
|
+
* checkout to `work/<slug>` cut from the freshly-fetched `<arbiter>/main` (the
|
|
229
|
+
* SAME "every worktree is cut from a fresh main" guarantee, ADR §6), WITHOUT a
|
|
230
|
+
* hub mirror or external worktree. The handle's `arbiterRemote`/`arbiterUrl` come
|
|
231
|
+
* from the checkout's own arbiter remote; `teardown` is a NO-OP — the checkout is
|
|
232
|
+
* left in a defined state on `work/<slug>`, NEVER reaped (it is the human's tree
|
|
233
|
+
* / the only copy of CI's work).
|
|
234
|
+
*
|
|
235
|
+
* NOTE: this strategy assumes the slug is already CLAIMED (the same contract as
|
|
236
|
+
* the job-worktree strategy, whose caller claims before `prepare`). It does not
|
|
237
|
+
* itself claim — `do-in-place` composes the claim (and `start`/`complete`) around
|
|
238
|
+
* the seam. `prepare` here is the thin "put the checkout on a fresh work branch"
|
|
239
|
+
* step the shared pipeline needs; it is unwired in this task.
|
|
240
|
+
*/
|
|
241
|
+
export function inPlaceStrategy(options: {
|
|
242
|
+
/** The current checkout to operate in. */
|
|
243
|
+
checkout: string;
|
|
244
|
+
/** Name of the checkout's arbiter git remote. Defaults to `origin`. */
|
|
245
|
+
arbiter?: string;
|
|
246
|
+
}): IsolationStrategy {
|
|
247
|
+
const arbiter = options.arbiter ?? 'origin';
|
|
248
|
+
const checkout = options.checkout;
|
|
249
|
+
return {
|
|
250
|
+
name: 'in-place',
|
|
251
|
+
prepare({slug, type, claimCommit, env}): IsolatedTree {
|
|
252
|
+
const branch = workBranchRef(type ?? 'task', slug);
|
|
253
|
+
const arbiterUrl = git(['remote', 'get-url', arbiter], checkout, {
|
|
254
|
+
env,
|
|
255
|
+
}).trim();
|
|
256
|
+
|
|
257
|
+
git(['fetch', '--quiet', arbiter], checkout, {env});
|
|
258
|
+
|
|
259
|
+
// CONTINUE-detection (shared with the job-worktree path, ADR §14 keystone):
|
|
260
|
+
// does the arbiter have a `work/<slug>` ref AHEAD of main (a requeue kept
|
|
261
|
+
// it)? In a normal clone the refs are the remote-tracking
|
|
262
|
+
// `<arbiter>/work/<slug>` and `<arbiter>/main`.
|
|
263
|
+
let continued = false;
|
|
264
|
+
let continueRebaseConflict = false;
|
|
265
|
+
let continuePushFailure: string | undefined;
|
|
266
|
+
// ARBITER-AUTHORITATIVE continue-detection: `ls-remote` the arbiter so a
|
|
267
|
+
// STALE local remote-tracking ref (a plain `git fetch` does NOT prune
|
|
268
|
+
// unless `fetch.prune` is set) pointing at a branch the arbiter no longer
|
|
269
|
+
// has cannot resurrect a deleted branch as a "continue".
|
|
270
|
+
if (
|
|
271
|
+
branchAheadOfArbiter({
|
|
272
|
+
cwd: checkout,
|
|
273
|
+
arbiterRemote: arbiter,
|
|
274
|
+
branch,
|
|
275
|
+
branchRef: `${arbiter}/${branch}`,
|
|
276
|
+
mainRef: `${arbiter}/main`,
|
|
277
|
+
env,
|
|
278
|
+
})
|
|
279
|
+
) {
|
|
280
|
+
continued = true;
|
|
281
|
+
// The arbiter `work/<slug>` tip the fetch above brought down, READ BEFORE
|
|
282
|
+
// the onboard rebase rewrites the local branch — the value the
|
|
283
|
+
// --force-with-lease push expects the arbiter to still hold. In a normal
|
|
284
|
+
// clone this lives in the remote-tracking ref `<arbiter>/<branch>` (the
|
|
285
|
+
// rebase below rewrites only the LOCAL `<branch>`, so the tracking ref keeps
|
|
286
|
+
// the pre-rebase arbiter sha). Captured here, threaded into the stale-lease
|
|
287
|
+
// retry below so a requeue-continue that churns the ref after our fetch is
|
|
288
|
+
// re-leased against the freshly-fetched tip rather than stranding the work.
|
|
289
|
+
const expectedRemoteTip = git(
|
|
290
|
+
['rev-parse', `${arbiter}/${branch}`],
|
|
291
|
+
checkout,
|
|
292
|
+
{env},
|
|
293
|
+
).trim();
|
|
294
|
+
// CONTINUE: land on the kept arbiter tip (force-reset a stale local copy
|
|
295
|
+
// so we continue the SAME single branch), then REBASE onto fresh main at
|
|
296
|
+
// onboard-time (ADR §10: rebase, not merge). A CLEAN rebase updates the
|
|
297
|
+
// already-pushed tip with --force-with-lease on the WORK branch ONLY
|
|
298
|
+
// (a requeued item is unshared) — NEVER --force, NEVER to main (§11),
|
|
299
|
+
// SURVIVING a stale-lease ("stale info") rejection by re-fetching +
|
|
300
|
+
// re-rebasing + retrying (the SAME helper `workspace.ts` uses). A
|
|
301
|
+
// CONFLICT is aborted (never auto-resolved) + flagged for the caller to
|
|
302
|
+
// route to needs-attention.
|
|
303
|
+
git(
|
|
304
|
+
['switch', '--quiet', '-C', branch, `${arbiter}/${branch}`],
|
|
305
|
+
checkout,
|
|
306
|
+
{env},
|
|
307
|
+
);
|
|
308
|
+
const rebase = rebaseContinuedBranchOntoMain(
|
|
309
|
+
checkout,
|
|
310
|
+
`${arbiter}/main`,
|
|
311
|
+
env,
|
|
312
|
+
);
|
|
313
|
+
if (rebase.kind === 'conflict') {
|
|
314
|
+
continueRebaseConflict = true;
|
|
315
|
+
} else {
|
|
316
|
+
// The helper THROWS on a terminal failure (the stale-lease retry cap, or
|
|
317
|
+
// a non-stale-lease rejection / unreachable arbiter). CATCH it and flag
|
|
318
|
+
// `continuePushFailure` so the caller routes the item to needs-attention
|
|
319
|
+
// — the kept work stays committed + recoverable — rather than crashing
|
|
320
|
+
// the run and stranding it silently in-progress (the stale-lease bug).
|
|
321
|
+
try {
|
|
322
|
+
const pushed = pushContinuedBranchWithStaleLeaseRetry({
|
|
323
|
+
cwd: checkout,
|
|
324
|
+
branch,
|
|
325
|
+
arbiter,
|
|
326
|
+
mainRef: `${arbiter}/main`,
|
|
327
|
+
expectedRemoteTip,
|
|
328
|
+
env,
|
|
329
|
+
});
|
|
330
|
+
if (pushed.kind === 'conflict') {
|
|
331
|
+
continueRebaseConflict = true;
|
|
332
|
+
}
|
|
333
|
+
} catch (err) {
|
|
334
|
+
continuePushFailure =
|
|
335
|
+
err instanceof Error ? err.message : String(err);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
} else {
|
|
339
|
+
// FRESH: put the checkout on the namespaced work branch cut from the
|
|
340
|
+
// EXACT claim commit (the defensive onboarding guard). When a
|
|
341
|
+
// `claimCommit` is threaded in (the normal `do` build path), assert it is
|
|
342
|
+
// reachable from the freshly-fetched `<arbiter>/main` and force-RESET the
|
|
343
|
+
// branch onto it with `-C` — so a stale same-named local branch (e.g. one
|
|
344
|
+
// `intake` left behind, or a prior re-run) is RE-POINTED at the claim
|
|
345
|
+
// commit, NEVER silently reused on a pre-claim base (the "nothing to
|
|
346
|
+
// complete" defect). Mirrors the CONTINUE path's `-C`. A missing /
|
|
347
|
+
// unreachable claim commit FAILS LOUDLY — never a silent stale-base build.
|
|
348
|
+
if (claimCommit !== undefined) {
|
|
349
|
+
assertClaimCommitReachable(
|
|
350
|
+
checkout,
|
|
351
|
+
claimCommit,
|
|
352
|
+
`${arbiter}/main`,
|
|
353
|
+
env,
|
|
354
|
+
);
|
|
355
|
+
git(['switch', '--quiet', '-C', branch, claimCommit], checkout, {
|
|
356
|
+
env,
|
|
357
|
+
});
|
|
358
|
+
} else {
|
|
359
|
+
// No claim commit (a bare resume / re-run with no claim in hand): cut
|
|
360
|
+
// off the freshly-fetched `<arbiter>/main`; plain-switch a pre-existing
|
|
361
|
+
// local branch.
|
|
362
|
+
const created = gitSoftSwitch(
|
|
363
|
+
['switch', '--quiet', '-c', branch, `${arbiter}/main`],
|
|
364
|
+
checkout,
|
|
365
|
+
env,
|
|
366
|
+
);
|
|
367
|
+
if (!created) {
|
|
368
|
+
git(['switch', '--quiet', branch], checkout, {env});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
dir: checkout,
|
|
375
|
+
branch,
|
|
376
|
+
arbiterRemote: arbiter,
|
|
377
|
+
arbiterUrl,
|
|
378
|
+
continued,
|
|
379
|
+
continueRebaseConflict,
|
|
380
|
+
continuePushFailure,
|
|
381
|
+
// NO-OP teardown: the checkout is the human's / CI's tree — left on
|
|
382
|
+
// `work/<slug>` in a defined state, NEVER reaped (ADR §2/§4). The
|
|
383
|
+
// human's `complete` (or the runner) owns the branch lifecycle.
|
|
384
|
+
// `reachableOnly` is irrelevant here (nothing is ever reaped in-place).
|
|
385
|
+
teardown(): void {},
|
|
386
|
+
};
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Assert the claim commit is reachable from `<arbiter>/main` (an ancestor),
|
|
393
|
+
* throwing a CLEAR error if not — the LOUD-failure guard the FRESH onboarding
|
|
394
|
+
* path uses before force-resetting the work branch onto the claim commit. A
|
|
395
|
+
* not-yet-fetched or rolled-back arbiter main that does NOT reach the claim must
|
|
396
|
+
* fail fast here, never silently build on a stale base.
|
|
397
|
+
*/
|
|
398
|
+
function assertClaimCommitReachable(
|
|
399
|
+
checkout: string,
|
|
400
|
+
claimCommit: string,
|
|
401
|
+
mainRef: string,
|
|
402
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
403
|
+
): void {
|
|
404
|
+
const reachable = gitSoftSwitch(
|
|
405
|
+
['merge-base', '--is-ancestor', claimCommit, mainRef],
|
|
406
|
+
checkout,
|
|
407
|
+
env,
|
|
408
|
+
);
|
|
409
|
+
if (!reachable) {
|
|
410
|
+
throw new Error(
|
|
411
|
+
`onboarding '${claimCommit}' failed: the claim commit is not reachable ` +
|
|
412
|
+
`from ${mainRef} (the claim push did not land, or local ${mainRef} is ` +
|
|
413
|
+
'stale). Refusing to build on a stale base — re-fetch the arbiter and ' +
|
|
414
|
+
'retry, or `requeue` the item.',
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/** Try a git switch; return true on success, false on non-zero (no throw). */
|
|
420
|
+
function gitSoftSwitch(
|
|
421
|
+
args: string[],
|
|
422
|
+
cwd: string,
|
|
423
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
424
|
+
): boolean {
|
|
425
|
+
try {
|
|
426
|
+
git(args, cwd, {env});
|
|
427
|
+
return true;
|
|
428
|
+
} catch {
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** How {@link selectIsolationStrategy} chooses between the two strategies. */
|
|
434
|
+
export interface SelectIsolationInput {
|
|
435
|
+
/**
|
|
436
|
+
* The current checkout, when there IS one (the human's clone / CI container).
|
|
437
|
+
* Its presence selects the **in-place** strategy. Absent ⇒ the **job-worktree**
|
|
438
|
+
* strategy (materialise a mirror + worktree in the agents' area).
|
|
439
|
+
*/
|
|
440
|
+
checkout?: string;
|
|
441
|
+
/**
|
|
442
|
+
* A working repo to resolve the arbiter URL from for the job-worktree
|
|
443
|
+
* strategy (with `arbiter`). Required when `checkout` is absent.
|
|
444
|
+
*/
|
|
445
|
+
fromRepo?: string;
|
|
446
|
+
/** Arbiter remote name (default `origin`), used by either strategy. */
|
|
447
|
+
arbiter?: string;
|
|
448
|
+
/** The execution working area for the job-worktree strategy (`workspacesDir`). */
|
|
449
|
+
workspacesDir?: string;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Select the isolation strategy by **"is there a checkout"** (ADR §3) — NOT a
|
|
454
|
+
* hardcoded path:
|
|
455
|
+
*
|
|
456
|
+
* - `checkout` present ⇒ {@link inPlaceStrategy} (the checkout IS the
|
|
457
|
+
* isolation; `do <slug>` in a checkout, the in-place human path).
|
|
458
|
+
* - `checkout` absent ⇒ {@link jobWorktreeStrategy} (mirror + worktree in the
|
|
459
|
+
* agents' area; `do --remote` / `run`).
|
|
460
|
+
*
|
|
461
|
+
* Both yield the same uniform handle, so the caller's pipeline is identical
|
|
462
|
+
* regardless of which strategy was selected.
|
|
463
|
+
*/
|
|
464
|
+
export function selectIsolationStrategy(
|
|
465
|
+
input: SelectIsolationInput,
|
|
466
|
+
): IsolationStrategy {
|
|
467
|
+
if (input.checkout !== undefined) {
|
|
468
|
+
return inPlaceStrategy({
|
|
469
|
+
checkout: input.checkout,
|
|
470
|
+
arbiter: input.arbiter,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
if (input.fromRepo === undefined || input.workspacesDir === undefined) {
|
|
474
|
+
throw new Error(
|
|
475
|
+
'selectIsolationStrategy: the job-worktree strategy (no checkout) ' +
|
|
476
|
+
'requires both `fromRepo` and `workspacesDir`.',
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
return jobWorktreeStrategy({
|
|
480
|
+
fromRepo: input.fromRepo,
|
|
481
|
+
arbiter: input.arbiter,
|
|
482
|
+
workspacesDir: input.workspacesDir,
|
|
483
|
+
});
|
|
484
|
+
}
|