dorfl 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { run } from './git.js';
|
|
2
|
+
/**
|
|
3
|
+
* The **continue-detection** shared by BOTH onboarding paths (the keystone of
|
|
4
|
+
* the `requeue-continue-and-reset` task). `requeue` keeps the `work/<slug>`
|
|
5
|
+
* branch so the NEXT claim CONTINUES from its tip instead of force-cutting a
|
|
6
|
+
* fresh branch off main. This module factors the one question both onboarding
|
|
7
|
+
* paths must ask — **"does the arbiter have a `work/<slug>` ref AHEAD of
|
|
8
|
+
* main?"** — into ONE helper, plus the rebase-onto-fresh-main step the continued
|
|
9
|
+
* branch needs at onboard-time (ADR §10: rebase-or-abort, never auto-resolve →
|
|
10
|
+
* conflict routes to needs-attention; the agent builds on a CURRENT base).
|
|
11
|
+
*
|
|
12
|
+
* The two onboarding paths reference the same two refs differently:
|
|
13
|
+
* - **in-place** (`src/start.ts` `switchToWorkBranch`, used by
|
|
14
|
+
* `do`/`start`/`work-on`): a normal clone. After `git fetch <arbiter>` the
|
|
15
|
+
* branch is the remote-tracking ref `<arbiter>/work/<slug>` and main is
|
|
16
|
+
* `<arbiter>/main`.
|
|
17
|
+
* - **job-worktree** (`src/workspace.ts` `createJob`, used by
|
|
18
|
+
* `do --remote`/`run`): a BARE hub mirror. `ensureMirror` fetches
|
|
19
|
+
* `+refs/heads/*:refs/heads/*`, so the arbiter's `work/<slug>` lands as a
|
|
20
|
+
* LOCAL head `work/<slug>` and main is the local head `main`.
|
|
21
|
+
*
|
|
22
|
+
* Both call {@link branchAheadOf} with the appropriate ref names; the predicate
|
|
23
|
+
* is identical (ref exists AND is not an ancestor of main, i.e. it carries
|
|
24
|
+
* commits beyond main — the prior attempt's work to continue from). When the
|
|
25
|
+
* branch is ABSENT (the common case: a fresh task, or a `requeue --reset` that
|
|
26
|
+
* deleted it) the predicate is false and the caller falls through to the normal
|
|
27
|
+
* fresh-cut-off-main path with NO special logic.
|
|
28
|
+
*/
|
|
29
|
+
/** Run git, returning the raw result (no throw) — for soft checks. */
|
|
30
|
+
function gitSoft(args, cwd, env) {
|
|
31
|
+
return run('git', args, cwd, { env });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* True iff the git ref `branchRef` exists in `cwd` AND its tip is NOT an
|
|
35
|
+
* ancestor of `mainRef` — i.e. it carries commits beyond main (the prior
|
|
36
|
+
* attempt's work a `requeue` kept, to be continued). False when the ref is
|
|
37
|
+
* absent (nothing to continue → fresh cut) or already merged into main (no work
|
|
38
|
+
* beyond main → nothing to continue). Read-only; never throws.
|
|
39
|
+
*
|
|
40
|
+
* Both onboarding paths feed this ONE predicate with their own ref names:
|
|
41
|
+
* - in-place clone: branchRef=`<arbiter>/work/<slug>`, mainRef=`<arbiter>/main`
|
|
42
|
+
* - bare hub mirror: branchRef=`work/<slug>`, mainRef=`main`
|
|
43
|
+
*/
|
|
44
|
+
export function branchAheadOf(cwd, branchRef, mainRef, env) {
|
|
45
|
+
const tip = gitSoft(['rev-parse', '--verify', '--quiet', `${branchRef}^{commit}`], cwd, env).stdout.trim();
|
|
46
|
+
if (tip === '') {
|
|
47
|
+
return false; // the branch is not on the arbiter → fresh cut, no continue
|
|
48
|
+
}
|
|
49
|
+
const mainTip = gitSoft(['rev-parse', '--verify', '--quiet', `${mainRef}^{commit}`], cwd, env).stdout.trim();
|
|
50
|
+
if (mainTip === '') {
|
|
51
|
+
// No main to compare against (shouldn't happen): treat as ahead so the kept
|
|
52
|
+
// branch is continued rather than silently dropped.
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
// Ahead ⇔ the branch tip is NOT an ancestor of main (it has commits main lacks).
|
|
56
|
+
const isAncestor = gitSoft(['merge-base', '--is-ancestor', tip, mainTip], cwd, env).status ===
|
|
57
|
+
0;
|
|
58
|
+
return !isAncestor;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Arbiter-authoritative continue-detection: like {@link branchAheadOf}, but
|
|
62
|
+
* first asks the arbiter (`git ls-remote <arbiterRemote> refs/heads/<branch>`)
|
|
63
|
+
* whether the kept branch EXISTS — so a STALE local remote-tracking ref
|
|
64
|
+
* (`refs/remotes/<arbiter>/<branch>` or a bare mirror's `refs/heads/<branch>`)
|
|
65
|
+
* pointing at a branch already DELETED on the arbiter (by `requeue --reset`, by
|
|
66
|
+
* the merge-reap, or cross-machine by `gc --remote-branches`) can no longer
|
|
67
|
+
* fool the onboard into "continue". This is the READ-side backstop that pairs
|
|
68
|
+
* with the WRITE-side write-through ordering at every delete site
|
|
69
|
+
* (local-ref-first, then `git push <arbiter> --delete`): write-through keeps
|
|
70
|
+
* SAME-MACHINE state in sync at the source; this catches the CROSS-MACHINE
|
|
71
|
+
* residue at the read (the other machine cannot touch this machine's local
|
|
72
|
+
* tracking refs). A plain `git remote prune` does NOT cover this — verified a
|
|
73
|
+
* no-op on the bare hub mirror, which has no `remote.origin.fetch` refspec for
|
|
74
|
+
* the orphaned `refs/remotes/origin/*` namespace.
|
|
75
|
+
*
|
|
76
|
+
* The decision rules, in order:
|
|
77
|
+
* - `git ls-remote <arbiterRemote> refs/heads/<branch>` exits 0 with EMPTY
|
|
78
|
+
* stdout (branch absent on the arbiter) ⇒ NOT ahead (fresh cut). This is
|
|
79
|
+
* the bug-fix case: a stale local ref CANNOT override the arbiter's truth.
|
|
80
|
+
* - `ls-remote` exits 0 with a sha ⇒ delegate to {@link branchAheadOf} on
|
|
81
|
+
* the local refs (the existing predicate: ref exists AND not an ancestor
|
|
82
|
+
* of main). The arbiter-present case is the normal continue path.
|
|
83
|
+
* - `ls-remote` exits non-zero (unreachable arbiter / offline) ⇒ fall back
|
|
84
|
+
* to {@link branchAheadOf} on the local refs — the best the read can do
|
|
85
|
+
* when the arbiter cannot answer (same direction as today).
|
|
86
|
+
*
|
|
87
|
+
* `branch` is the unqualified branch name on the arbiter (e.g.
|
|
88
|
+
* `work/task-<slug>`); `branchRef` + `mainRef` are the local refs the
|
|
89
|
+
* arbiter-present delegate uses (in-place clone: `<arbiter>/<branch>` /
|
|
90
|
+
* `<arbiter>/main`; bare hub mirror: `<branch>` / `main`). `arbiterRemote` is
|
|
91
|
+
* the remote NAME to ls-remote (e.g. `origin` for the mirror, `arbiter` for an
|
|
92
|
+
* in-place clone with the conventional remote name).
|
|
93
|
+
*/
|
|
94
|
+
export function branchAheadOfArbiter(options) {
|
|
95
|
+
const { cwd, arbiterRemote, branch, branchRef, mainRef, env } = options;
|
|
96
|
+
const ls = gitSoft(['ls-remote', '--heads', arbiterRemote, branch], cwd, env);
|
|
97
|
+
if (ls.status === 0) {
|
|
98
|
+
// Reachable arbiter: its answer is AUTHORITATIVE. Empty ⇒ branch absent
|
|
99
|
+
// ⇒ no continue (a stale local ref cannot resurrect a deleted branch).
|
|
100
|
+
if (ls.stdout.trim() === '') {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
// Present on the arbiter ⇒ use the existing local-ref predicate to decide
|
|
104
|
+
// ahead-of-main (which is how "there is work to continue" is defined).
|
|
105
|
+
return branchAheadOf(cwd, branchRef, mainRef, env);
|
|
106
|
+
}
|
|
107
|
+
// Unreachable arbiter / offline — fall back to the local-ref answer (the
|
|
108
|
+
// best the read can do when the arbiter cannot answer; same direction as
|
|
109
|
+
// before this backstop existed).
|
|
110
|
+
return branchAheadOf(cwd, branchRef, mainRef, env);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Rebase the CURRENTLY-CHECKED-OUT continued `work/<slug>` branch onto
|
|
114
|
+
* `mainRef` (the freshly-fetched main), so the agent builds on a CURRENT base
|
|
115
|
+
* (ADR §10: rebase, NOT merge — linear history; the prior attempt's commits were
|
|
116
|
+
* based on an OLD main that moved while the item sat in backlog).
|
|
117
|
+
*
|
|
118
|
+
* This is a PLAIN rebase. After the per-item-lock cut-over (prd
|
|
119
|
+
* `ledger-status-per-item-lock-refs`, tasks 9a–9d) NO transient status lands on
|
|
120
|
+
* a work branch: claim does not move the body (it rests in `backlog/`),
|
|
121
|
+
* needs-attention is the lock `state: stuck` (not a `git mv`), and the
|
|
122
|
+
* tasking/advancing markers are gone. So a branch cut from `main` inherits no
|
|
123
|
+
* runner-authored move-only bookkeeping commit, there is nothing to drop, and
|
|
124
|
+
* the old `drop-bookkeeping-rebase` machinery (which papered over the
|
|
125
|
+
* rename/rename ledger conflict that inheritance caused) is deleted. The ONLY
|
|
126
|
+
* commits replayed are the agent's own wip / `→done` commits.
|
|
127
|
+
*
|
|
128
|
+
* A CLEAN rebase returns `{kind: 'clean'}`; a CONFLICTING rebase (a GENUINE code
|
|
129
|
+
* conflict) is `--abort`ed (NEVER auto-resolved) and returns `{kind: 'conflict'}`
|
|
130
|
+
* so the caller can route the item to needs-attention via the §10 path. Must be
|
|
131
|
+
* called while HEAD is the continued branch.
|
|
132
|
+
*
|
|
133
|
+
* RENAME-DETECTION-OFF (task `disable-rename-detection-on-continue-rebase`): the
|
|
134
|
+
* rebase is invoked with `-c merge.directoryRenames=false` SCOPED to the
|
|
135
|
+
* invocation (never a persistent `git config` write), so a single durable
|
|
136
|
+
* folder-transition `git mv` out of a SPARSE source folder is NOT misread by
|
|
137
|
+
* git's directory-rename heuristic as a whole-DIRECTORY rename — which would
|
|
138
|
+
* spuriously flag every sibling file main added into that same folder as
|
|
139
|
+
* `CONFLICT (file location)` and force a FALSE needs-attention. Content-rename
|
|
140
|
+
* detection (`-Xno-renames` / `merge.renames` / `diff.renames`) is NOT what
|
|
141
|
+
* controls this conflict and was empirically verified ineffective; only
|
|
142
|
+
* `merge.directoryRenames=false` suppresses it. A GENUINE same-path content
|
|
143
|
+
* conflict still conflicts unchanged.
|
|
144
|
+
*/
|
|
145
|
+
export function rebaseContinuedBranchOntoMain(cwd, mainRef, env) {
|
|
146
|
+
const rebase = gitSoft(['-c', 'merge.directoryRenames=false', 'rebase', mainRef], cwd, env);
|
|
147
|
+
if (rebase.status === 0) {
|
|
148
|
+
return { kind: 'clean' };
|
|
149
|
+
}
|
|
150
|
+
// NEVER auto-resolve: abort back to a clean continued-branch tip.
|
|
151
|
+
gitSoft(['rebase', '--abort'], cwd, env);
|
|
152
|
+
return { kind: 'conflict' };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The default cap on stale-lease push retries — mirrors the claim / tasking-lock
|
|
156
|
+
* INSTANT-contention loop's `retries: 3` default (`claim-cas.ts` `DEFAULT_RETRIES`).
|
|
157
|
+
* After this many re-fetch + re-rebase + re-push attempts the green work is left
|
|
158
|
+
* RECOVERABLE and the caller surfaces a clear terminal failure.
|
|
159
|
+
*/
|
|
160
|
+
export const DEFAULT_STALE_LEASE_RETRIES = 3;
|
|
161
|
+
/**
|
|
162
|
+
* Lexical signal of a `--force-with-lease` STALE-LEASE rejection (git prints
|
|
163
|
+
* `! [rejected] <ref> (stale info)`), as distinct from any OTHER push failure
|
|
164
|
+
* (connectivity, auth, a protected ref). ONLY this case is safe to re-lease +
|
|
165
|
+
* retry on the UNSHARED work branch — every other failure must surface, never
|
|
166
|
+
* silently overwrite. This is the SAME family of contention markers the
|
|
167
|
+
* ledger-write CAS recognises (`ledger-write.ts`), narrowed here to the lease's
|
|
168
|
+
* own `stale info`.
|
|
169
|
+
*/
|
|
170
|
+
export function isStaleLeaseRejection(stderr) {
|
|
171
|
+
return /stale info/i.test(stderr);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Push the propose-mode work branch with the SAME stale-lease retry semantics
|
|
175
|
+
* as {@link pushContinuedBranchWithStaleLeaseRetry} (explicit
|
|
176
|
+
* `--force-with-lease=<branch>:<expectedTip>`, `stale info` detection, bounded
|
|
177
|
+
* re-observation + retry, terminal throw on cap exhaustion / non-stale
|
|
178
|
+
* failure), plus the one race the continue path does not have: a `work/<slug>`
|
|
179
|
+
* ref that is GONE on the arbiter because the work already LANDED on `main` is
|
|
180
|
+
* a BENIGN already-landed success, not a failure. The predicate mirrors the
|
|
181
|
+
* leased-delete `already-reaped` + merged-head-reap ancestor guards: gone ref
|
|
182
|
+
* AND `HEAD` is an ancestor of `<arbiter>/main`.
|
|
183
|
+
*
|
|
184
|
+
* WHY a propose-specific helper instead of the continue helper verbatim: the
|
|
185
|
+
* continue helper's stale-lease retry RE-REBASES the kept branch onto the
|
|
186
|
+
* freshly-fetched main (a kept-branch onboard's job — main may have moved
|
|
187
|
+
* while the prior attempt sat in backlog). In the propose path the caller has
|
|
188
|
+
* ALREADY rebased the branch onto `<arbiter>/main` (`integrateWithRebase`, or
|
|
189
|
+
* `integration-core.ts` `recoverAlreadyCommitted`'s recovery rebase), so the
|
|
190
|
+
* only race the lease needs to survive here is the remote work ref MOVING /
|
|
191
|
+
* REAPING under us — re-leasing against the freshly-observed tip is enough,
|
|
192
|
+
* AND a re-rebase mid-integrate would smuggle a NEW rebase past
|
|
193
|
+
* `integrateWithRebase`'s explicit conflict-aborts-to-needs-attention contract.
|
|
194
|
+
* So this helper shares the stale-info detection + bounded retry shape (the
|
|
195
|
+
* `--force-with-lease`-only / never-bare-force / never-`:main` guardrails are
|
|
196
|
+
* identical) but does NOT layer the rebase step.
|
|
197
|
+
*
|
|
198
|
+
* Guardrails (ADR §11): `--force-with-lease` ONLY (re-computed each attempt),
|
|
199
|
+
* NEVER bare `--force`, NEVER `:main`, the WORK branch ONLY. The lease is
|
|
200
|
+
* threaded as `<branch>:<expectedTip>` — using EMPTY (`<branch>:`) when the
|
|
201
|
+
* arbiter has no ref yet (the first-time propose / post-reap shape — the same
|
|
202
|
+
* create-only lease form `item-lock.ts` uses for the lock CAS), so a bare-hub-
|
|
203
|
+
* mirror worktree (no `refs/remotes/<arbiter>/*` upstream) leases correctly.
|
|
204
|
+
*
|
|
205
|
+
* Bounded by `retries` (default {@link DEFAULT_STALE_LEASE_RETRIES}, mirroring
|
|
206
|
+
* the claim / continue retry cap). Must be called while HEAD is the propose
|
|
207
|
+
* `<branch>`.
|
|
208
|
+
*/
|
|
209
|
+
export function pushProposeBranchWithStaleLeaseRetry(options) {
|
|
210
|
+
const { cwd, branch, arbiter, env } = options;
|
|
211
|
+
const note = options.note ?? (() => { });
|
|
212
|
+
const retries = options.retries ?? DEFAULT_STALE_LEASE_RETRIES;
|
|
213
|
+
const mainRef = `refs/remotes/${arbiter}/main`;
|
|
214
|
+
const refreshMain = () => {
|
|
215
|
+
gitSoft(['fetch', '--quiet', arbiter, `+refs/heads/main:${mainRef}`], cwd, env);
|
|
216
|
+
};
|
|
217
|
+
/** The arbiter's CURRENT `<branch>` sha (via `ls-remote`), or `''` when absent / unreachable. */
|
|
218
|
+
const observeArbiterTip = () => {
|
|
219
|
+
const ls = gitSoft(['ls-remote', '--heads', arbiter, branch], cwd, env);
|
|
220
|
+
if (ls.status !== 0)
|
|
221
|
+
return '';
|
|
222
|
+
const m = /^([0-9a-f]{40})/m.exec(ls.stdout.trim());
|
|
223
|
+
return m ? m[1] : '';
|
|
224
|
+
};
|
|
225
|
+
/** True iff HEAD is provably reachable from `<arbiter>/main` (the work landed). */
|
|
226
|
+
const headOnArbiterMain = () => {
|
|
227
|
+
const head = gitSoft(['rev-parse', '--verify', '--quiet', 'HEAD'], cwd, env).stdout.trim();
|
|
228
|
+
if (head === '')
|
|
229
|
+
return false;
|
|
230
|
+
return (gitSoft(['merge-base', '--is-ancestor', head, mainRef], cwd, env)
|
|
231
|
+
.status === 0);
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* The BENIGN already-landed predicate: the remote work ref is GONE on the
|
|
235
|
+
* arbiter AND our HEAD is provably reachable from `<arbiter>/main`. Mirrors
|
|
236
|
+
* `integrator.ts` `deleteMergedHeadBranch`'s ancestor-guarded reap + the
|
|
237
|
+
* `item-lock.ts` leased-delete `already-reaped` precedent: a vanished ref
|
|
238
|
+
* whose work is provably landed is the desired end state. Re-fetches main
|
|
239
|
+
* first so the answer reflects the current arbiter, not a stale local view.
|
|
240
|
+
*/
|
|
241
|
+
const benignAlreadyLanded = () => {
|
|
242
|
+
refreshMain();
|
|
243
|
+
return observeArbiterTip() === '' && headOnArbiterMain();
|
|
244
|
+
};
|
|
245
|
+
// Short-circuit BEFORE any push: the dominant recovery race shape (a sibling
|
|
246
|
+
// already merged this work and reaped the head before we even attempted our
|
|
247
|
+
// push). Avoids burning a stale-lease retry budget on a no-op.
|
|
248
|
+
if (benignAlreadyLanded()) {
|
|
249
|
+
note(`${branch}: already landed on ${arbiter}/main + remote head reaped — ` +
|
|
250
|
+
'clean no-op (no push, no review request).');
|
|
251
|
+
return { kind: 'already-landed' };
|
|
252
|
+
}
|
|
253
|
+
let attempt = 0;
|
|
254
|
+
// eslint-disable-next-line no-constant-condition
|
|
255
|
+
while (true) {
|
|
256
|
+
const observed = observeArbiterTip();
|
|
257
|
+
// Explicit `<branch>:<expected>` — EMPTY when the ref is absent (first-time
|
|
258
|
+
// propose, or a post-reap retry), MATCHING when present. The empty-expected
|
|
259
|
+
// shape is the same create-only `--force-with-lease=<ref>:` form
|
|
260
|
+
// `item-lock.ts` uses for the CAS create.
|
|
261
|
+
const lease = observed === '' ? `${branch}:` : `${branch}:${observed}`;
|
|
262
|
+
const push = gitSoft(['push', arbiter, `${branch}:${branch}`, `--force-with-lease=${lease}`], cwd, env);
|
|
263
|
+
if (push.status === 0) {
|
|
264
|
+
return { kind: 'pushed' };
|
|
265
|
+
}
|
|
266
|
+
// Only `stale info` is re-leasable on this unshared work branch; every
|
|
267
|
+
// other failure (connectivity, protected ref, auth) SURFACES at once.
|
|
268
|
+
if (!isStaleLeaseRejection(push.stderr)) {
|
|
269
|
+
throw new Error(`pushing ${branch} to ${arbiter} failed (not a stale lease): ` +
|
|
270
|
+
(push.stderr.trim() || `exit ${push.status}`));
|
|
271
|
+
}
|
|
272
|
+
// A stale lease: re-check the BENIGN already-landed predicate first (the
|
|
273
|
+
// race tail this task carries), else retry with a freshly-observed lease.
|
|
274
|
+
if (benignAlreadyLanded()) {
|
|
275
|
+
note(`${branch}: stale lease + work already on ${arbiter}/main + remote ` +
|
|
276
|
+
'head reaped — clean no-op.');
|
|
277
|
+
return { kind: 'already-landed' };
|
|
278
|
+
}
|
|
279
|
+
attempt += 1;
|
|
280
|
+
if (attempt > retries) {
|
|
281
|
+
throw new Error(`pushing ${branch} to ${arbiter} kept failing with a stale ` +
|
|
282
|
+
`--force-with-lease after ${retries} retr${retries === 1 ? 'y' : 'ies'} ` +
|
|
283
|
+
'(the arbiter work ref keeps moving under us, and the work is not ' +
|
|
284
|
+
`provably on main). The green work is still committed on ${branch} — ` +
|
|
285
|
+
'route to needs-attention and retry when the churn settles.');
|
|
286
|
+
}
|
|
287
|
+
note(`${branch} propose push rejected (stale lease) — re-observe + retry ` +
|
|
288
|
+
`(${attempt}/${retries})...`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Push the CONTINUED `work/<slug>` branch to the arbiter with
|
|
293
|
+
* `--force-with-lease`, surviving a STALE-LEASE ("stale info") rejection by
|
|
294
|
+
* re-observing the arbiter's tip and replaying our green work onto it — instead
|
|
295
|
+
* of stranding a committed, gate-green build in the job worktree (the observed
|
|
296
|
+
* `advance-verb-resolver` incident).
|
|
297
|
+
*
|
|
298
|
+
* WHY a retry is SAFE here: the `work/<slug>` branch is UNSHARED — the arbiter
|
|
299
|
+
* CAS serialises the claim per slug, so no rival writer legitimately advances it
|
|
300
|
+
* concurrently. The lease's job is to catch a STALE LOCAL view, not a rival; so
|
|
301
|
+
* on a stale-lease rejection the correct response is to re-fetch the actual
|
|
302
|
+
* remote tip, rebase our work onto current main, and push again, re-leased
|
|
303
|
+
* against the JUST-fetched ref. This stays within the existing guardrails:
|
|
304
|
+
* `--force-with-lease` ONLY (re-computed each attempt), NEVER bare `--force`,
|
|
305
|
+
* NEVER targeting `main`, the WORK branch ONLY (ADR §11).
|
|
306
|
+
*
|
|
307
|
+
* The flow, bounded by `retries` (default {@link DEFAULT_STALE_LEASE_RETRIES},
|
|
308
|
+
* mirroring the claim/tasking-lock instant-contention cap):
|
|
309
|
+
* 1. Push `<branch>:<branch> --force-with-lease=<branch>:<expectedRemoteTip>`.
|
|
310
|
+
* 2. On success → `{kind: 'pushed'}`.
|
|
311
|
+
* 3. On a STALE-LEASE rejection → re-fetch `main` + `<branch>` from the arbiter
|
|
312
|
+
* (into a remote-tracking ref, since the branch is CHECKED OUT here), re-run
|
|
313
|
+
* the onboard-time rebase onto the freshly-fetched main, and retry with the
|
|
314
|
+
* lease re-leased against the freshly-fetched remote tip. A rebase CONFLICT
|
|
315
|
+
* on a retry → `{kind: 'conflict'}` (the existing abort → needs-attention
|
|
316
|
+
* path; the retry covers ONLY the clean-rebase stale-lease case).
|
|
317
|
+
* 4. After the cap → THROW a clear terminal error (the green work is still
|
|
318
|
+
* committed on the branch, so the caller's needs-attention route keeps it
|
|
319
|
+
* recoverable).
|
|
320
|
+
* 5. Any NON-stale push failure (connectivity, protected ref) → THROW at once
|
|
321
|
+
* (never re-leased, never silently swallowed).
|
|
322
|
+
*
|
|
323
|
+
* `expectedRemoteTip` is the arbiter `work/<slug>` sha the caller already
|
|
324
|
+
* observed (the pre-rebase mirror head). The explicit `<branch>:<sha>` lease is
|
|
325
|
+
* REQUIRED in the bare-hub-mirror worktree, which has no `refs/remotes/origin/*`
|
|
326
|
+
* upstream for git to imply the lease from. Must be called while HEAD is the
|
|
327
|
+
* continued `<branch>`.
|
|
328
|
+
*/
|
|
329
|
+
export function pushContinuedBranchWithStaleLeaseRetry(options) {
|
|
330
|
+
const { cwd, branch, arbiter, mainRef, env } = options;
|
|
331
|
+
const note = options.note ?? (() => { });
|
|
332
|
+
const retries = options.retries ?? DEFAULT_STALE_LEASE_RETRIES;
|
|
333
|
+
// The remote-tracking ref we re-fetch the arbiter `<branch>` into so the lease
|
|
334
|
+
// can be re-computed WITHOUT touching the checked-out local `<branch>` head
|
|
335
|
+
// (git refuses to fetch into a checked-out branch).
|
|
336
|
+
const trackingRef = `refs/remotes/${arbiter}/${branch}`;
|
|
337
|
+
let expectedTip = options.expectedRemoteTip;
|
|
338
|
+
let attempt = 0;
|
|
339
|
+
// eslint-disable-next-line no-constant-condition
|
|
340
|
+
while (true) {
|
|
341
|
+
const push = gitSoft([
|
|
342
|
+
'push',
|
|
343
|
+
arbiter,
|
|
344
|
+
`${branch}:${branch}`,
|
|
345
|
+
`--force-with-lease=${branch}:${expectedTip}`,
|
|
346
|
+
], cwd, env);
|
|
347
|
+
if (push.status === 0) {
|
|
348
|
+
return { kind: 'pushed' };
|
|
349
|
+
}
|
|
350
|
+
// Only a STALE-LEASE rejection is re-leasable on this unshared branch; any
|
|
351
|
+
// other failure (connectivity, protected ref) surfaces immediately.
|
|
352
|
+
if (!isStaleLeaseRejection(push.stderr)) {
|
|
353
|
+
throw new Error(`pushing ${branch} to ${arbiter} failed (not a stale lease): ` +
|
|
354
|
+
(push.stderr.trim() || `exit ${push.status}`));
|
|
355
|
+
}
|
|
356
|
+
attempt += 1;
|
|
357
|
+
if (attempt > retries) {
|
|
358
|
+
throw new Error(`pushing ${branch} to ${arbiter} kept failing with a stale ` +
|
|
359
|
+
`--force-with-lease after ${retries} retr${retries === 1 ? 'y' : 'ies'} ` +
|
|
360
|
+
'(the arbiter work ref keeps moving under us). The green work is ' +
|
|
361
|
+
`still committed on ${branch} — route to needs-attention and retry ` +
|
|
362
|
+
'when the churn settles.');
|
|
363
|
+
}
|
|
364
|
+
note(`${branch} push rejected (stale lease) — re-fetch + re-rebase + retry ` +
|
|
365
|
+
`(${attempt}/${retries})...`);
|
|
366
|
+
// Re-observe the arbiter: refresh local `main` (NOT checked out → fetch into
|
|
367
|
+
// its head) and the arbiter `<branch>` (CHECKED OUT → fetch into a
|
|
368
|
+
// remote-tracking ref so the lease can re-compute against it).
|
|
369
|
+
gitSoft([
|
|
370
|
+
'fetch',
|
|
371
|
+
arbiter,
|
|
372
|
+
`+refs/heads/main:${mainRef}`,
|
|
373
|
+
`+refs/heads/${branch}:${trackingRef}`,
|
|
374
|
+
], cwd, env);
|
|
375
|
+
const fresh = gitSoft(['rev-parse', '--verify', '--quiet', trackingRef], cwd, env).stdout.trim();
|
|
376
|
+
if (fresh !== '') {
|
|
377
|
+
expectedTip = fresh;
|
|
378
|
+
}
|
|
379
|
+
// Replay our green work onto the freshly-fetched main (ADR §10: rebase, not
|
|
380
|
+
// merge). A CONFLICT is the EXISTING abort → needs-attention path — the retry
|
|
381
|
+
// handles ONLY the clean-rebase stale-lease case (never auto-resolves).
|
|
382
|
+
const rebase = rebaseContinuedBranchOntoMain(cwd, mainRef, env);
|
|
383
|
+
if (rebase.kind === 'conflict') {
|
|
384
|
+
return { kind: 'conflict' };
|
|
385
|
+
}
|
|
386
|
+
// Loop: retry the push, now re-leased against the freshly-fetched remote tip.
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=continue-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"continue-branch.js","sourceRoot":"","sources":["../src/continue-branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { type RepoReport } from './scan.js';
|
|
2
|
+
import type { Config } from './config.js';
|
|
3
|
+
import type { ConfigOverrideMap } from './config-override.js';
|
|
4
|
+
/**
|
|
5
|
+
* The CWD-LOCAL section of `scan`/`status` (the `scan-status-read-cwd-repo`
|
|
6
|
+
* task). When a command runs INSIDE a participating repo, it ALSO reports that
|
|
7
|
+
* CURRENT repo as a clearly-labelled, separately-counted LOCAL section, in
|
|
8
|
+
* addition to (NEVER merged into) the cross-repo REGISTRY view.
|
|
9
|
+
*
|
|
10
|
+
* The consistency rule this module enforces (do not violate):
|
|
11
|
+
*
|
|
12
|
+
* - The local section reads the LOCAL WORKING TREE (`scanRepoPaths([cwd])`) —
|
|
13
|
+
* your possibly-uncommitted / unpushed / diverged state — NOT the bare
|
|
14
|
+
* mirror-ref the registry reads. The two reads have DIFFERENT freshness +
|
|
15
|
+
* storage models, so they are kept VISUALLY + SEMANTICALLY distinct, each
|
|
16
|
+
* with its OWN count. A merged grand total would be true in NEITHER model.
|
|
17
|
+
* - **The SELECTION pool is REMOTE-AUTHORITATIVE + FAILS CLOSED offline.** The
|
|
18
|
+
* held-lock set (`refs/dorfl/lock/*`) lives ONLY on the arbiter, and it is the
|
|
19
|
+
* LOAD-BEARING signal that keeps a claimed / in-flight item out of the
|
|
20
|
+
* eligible pool (the body no longer moves on claim). So the cwd pool reads the
|
|
21
|
+
* held set from the arbiter (`heldTaskSlugsStrict`) and SUBTRACTS it before
|
|
22
|
+
* reporting eligibility — exactly as the registry `scan()` does. When the cwd
|
|
23
|
+
* repo has a configured arbiter but that read cannot reach it, eligibility is
|
|
24
|
+
* UNKNOWN and the section THROWS rather than emit a confident-but-wrong pool
|
|
25
|
+
* (the
|
|
26
|
+
* `scan-cwd-selection-pool-read-local-skips-held-lock-subtraction-offline-must-fail`
|
|
27
|
+
* decision: offline selection fails; there is NO `--local` fallback). This is
|
|
28
|
+
* the SELECTION concern; the divergence line is the SURFACE concern and keeps
|
|
29
|
+
* its graceful warn+last-known behaviour.
|
|
30
|
+
* - **Fetch-first ALSO for the cwd** (the maintainer's explicit ask): the cwd
|
|
31
|
+
* repo's arbiter is fetched BEFORE the divergence is computed (the local
|
|
32
|
+
* working tree is the LEAST authoritative view), reusing the
|
|
33
|
+
* `scan-status-fetch-first` fetch+warn+fallback discipline — a failed fetch
|
|
34
|
+
* WARNS and falls back to last-known, NEVER errors out (a read-only command
|
|
35
|
+
* must degrade, ADR §5/§6).
|
|
36
|
+
* - The divergence-vs-arbiter is shown with the `main-divergence-guard` framing
|
|
37
|
+
* (`local main is N commits ahead of <arbiter>/main` = unpushed).
|
|
38
|
+
* - **De-dup:** if the cwd repo is ALSO registered, it is shown ONCE in the
|
|
39
|
+
* local section marked "(also registered)" and its registry row is dropped
|
|
40
|
+
* from the registry list — so the same repo never appears as two mystery
|
|
41
|
+
* rows with possibly-disagreeing states.
|
|
42
|
+
*
|
|
43
|
+
* The registry model is UNCHANGED by this: `scan`/`status` are read-only DISPLAY
|
|
44
|
+
* surfaces; the daemon (`run`) + the arbiter CAS still claim against the REGISTRY
|
|
45
|
+
* only. Showing the cwd changes nothing about where claims happen.
|
|
46
|
+
*/
|
|
47
|
+
/** The cwd repo's arbiter, as resolved for the local section's divergence line. */
|
|
48
|
+
export interface CwdArbiter {
|
|
49
|
+
/** The arbiter remote name inspected (e.g. `arbiter` / `origin`). */
|
|
50
|
+
remote: string;
|
|
51
|
+
/** True iff the cwd repo has a remote with that name. */
|
|
52
|
+
configured: boolean;
|
|
53
|
+
/** The arbiter's URL, when configured. */
|
|
54
|
+
url?: string;
|
|
55
|
+
/**
|
|
56
|
+
* True iff the cwd repo's arbiter `main` was FRESHLY FETCHED before the
|
|
57
|
+
* divergence was computed. False ⇒ the fetch failed (offline / no arbiter) and
|
|
58
|
+
* the divergence reflects the last-known arbiter ref (a warning was emitted).
|
|
59
|
+
*/
|
|
60
|
+
fetched: boolean;
|
|
61
|
+
/** Commits local `main` is AHEAD of `<arbiter>/main` (unpushed). */
|
|
62
|
+
ahead: number;
|
|
63
|
+
/** Commits local `main` is BEHIND `<arbiter>/main` (needs a pull/rebase). */
|
|
64
|
+
behind: number;
|
|
65
|
+
}
|
|
66
|
+
/** The cwd-local section report (one repo: the current working tree). */
|
|
67
|
+
export interface CwdSection {
|
|
68
|
+
/** Absolute path to the cwd repo. */
|
|
69
|
+
path: string;
|
|
70
|
+
/**
|
|
71
|
+
* True iff the cwd is a participating repo (a `work/` tree with lifecycle
|
|
72
|
+
* content in any pool — see {@link isParticipatingRepo}, NOT `tasks/ready/`
|
|
73
|
+
* alone). When false, every other field is absent — there is NO local section.
|
|
74
|
+
*/
|
|
75
|
+
participating: boolean;
|
|
76
|
+
/** The cwd repo's `work/` lifecycle, read from the LOCAL WORKING TREE. */
|
|
77
|
+
repo?: RepoReport;
|
|
78
|
+
/** Total backlog item count for the cwd (its OWN count, never merged). */
|
|
79
|
+
totalItems?: number;
|
|
80
|
+
/** Eligible item count for the cwd (its OWN count). */
|
|
81
|
+
totalEligible?: number;
|
|
82
|
+
/**
|
|
83
|
+
* True iff the cwd repo is ALSO in the registry (its arbiter URL keys to a
|
|
84
|
+
* registered hub mirror). When true the cwd is de-duped: shown once here,
|
|
85
|
+
* marked "(also registered)", and its registry row is dropped.
|
|
86
|
+
*/
|
|
87
|
+
alsoRegistered?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* The registered hub-mirror PATH the cwd de-dups against (so the registry view
|
|
90
|
+
* can drop that row). Present only when {@link alsoRegistered} is true.
|
|
91
|
+
*/
|
|
92
|
+
registeredMirrorPath?: string;
|
|
93
|
+
/** The cwd repo's arbiter + divergence (fetch-first). Absent when no arbiter. */
|
|
94
|
+
arbiter?: CwdArbiter;
|
|
95
|
+
}
|
|
96
|
+
/** The verdict of the FETCH-FREE cwd pre-check {@link cwdSectionDisposition}. */
|
|
97
|
+
export interface CwdDisposition {
|
|
98
|
+
/** True iff the cwd is a participating repo (a `work/` tree with lifecycle
|
|
99
|
+
* content in any pool — see {@link isParticipatingRepo}, NOT `tasks/ready/`
|
|
100
|
+
* alone). */
|
|
101
|
+
participating: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* True iff the cwd's arbiter URL keys to a registered hub mirror. When true the
|
|
104
|
+
* registry view ALREADY covers this repo, so a default `scan`/`status` should
|
|
105
|
+
* SKIP resolving the (expensive, fetch-first) cwd section entirely — the registry
|
|
106
|
+
* row represents it, and re-reading the cwd would just re-fetch the SAME arbiter
|
|
107
|
+
* `main` + lock refs the registry loop already fetched (the redundant-fetch the
|
|
108
|
+
* `scan-here-and-skip-redundant-cwd` decision eliminates). Meaningful only when
|
|
109
|
+
* {@link participating}.
|
|
110
|
+
*/
|
|
111
|
+
alsoRegistered: boolean;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The FETCH-FREE pre-check that decides whether a DEFAULT `scan`/`status` should
|
|
115
|
+
* pay for the cwd section at all. It does NO network I/O: it reads whether the cwd
|
|
116
|
+
* participates (local `readdirSync`) and resolves the cwd's arbiter URL via the
|
|
117
|
+
* fetch-free {@link arbiterStatus} (a local `git remote get-url`), then asks the
|
|
118
|
+
* fetch-free {@link resolveRegistration} (local {@link listMirrors} key match)
|
|
119
|
+
* whether that URL is already a registered mirror.
|
|
120
|
+
*
|
|
121
|
+
* The CLI gates on this BEFORE calling {@link resolveCwdSection}: a participating
|
|
122
|
+
* cwd that is ALSO registered is skipped (the registry already covers it, and the
|
|
123
|
+
* cwd read would only re-fetch the same arbiter), while a participating cwd with
|
|
124
|
+
* NO mirror is resolved + shown standalone so a mirror-less repo you are standing
|
|
125
|
+
* in is never invisible. `--here` bypasses this gate (it ALWAYS resolves the cwd,
|
|
126
|
+
* and only the cwd).
|
|
127
|
+
*/
|
|
128
|
+
export declare function cwdSectionDisposition(input: {
|
|
129
|
+
cwd: string;
|
|
130
|
+
config: Config;
|
|
131
|
+
/** The DIVERGENCE/arbiter remote whose URL keys the registration check. */
|
|
132
|
+
arbiterRemote?: string;
|
|
133
|
+
env?: NodeJS.ProcessEnv;
|
|
134
|
+
}): CwdDisposition;
|
|
135
|
+
/** Inputs to {@link resolveCwdSection}. */
|
|
136
|
+
export interface ResolveCwdSectionOptions {
|
|
137
|
+
/** The current working directory to inspect (the candidate cwd repo). */
|
|
138
|
+
cwd: string;
|
|
139
|
+
/** Resolved global config (for `workspacesDir` + per-repo `autoBuild`). */
|
|
140
|
+
config: Config;
|
|
141
|
+
/**
|
|
142
|
+
* The per-machine {@link ConfigOverrideMap}. Threaded into the local
|
|
143
|
+
* working-tree scan so the cwd section's eligibility reflects the per-machine
|
|
144
|
+
* override (consistent with the autopick / advance paths). Default: none.
|
|
145
|
+
*/
|
|
146
|
+
override?: ConfigOverrideMap;
|
|
147
|
+
/**
|
|
148
|
+
* The arbiter remote name to fetch + diff against (the SURFACE/divergence
|
|
149
|
+
* remote). Defaults to the same remote `status`'s arbiter section resolves
|
|
150
|
+
* (`arbiter`); the CLI passes the configured value.
|
|
151
|
+
*/
|
|
152
|
+
arbiterRemote?: string;
|
|
153
|
+
/**
|
|
154
|
+
* The COORDINATION arbiter remote where the per-item lock refs
|
|
155
|
+
* (`refs/dorfl/lock/*`) live — the remote the held-lock SUBTRACTION reads. This
|
|
156
|
+
* is the SAME remote `claim`/`do`/`complete` push locks to, which defaults to
|
|
157
|
+
* `origin` (NOT the `arbiter`-named DIVERGENCE remote above — a repo can use
|
|
158
|
+
* `origin` as its arbiter and have no `arbiter` remote at all, exactly this
|
|
159
|
+
* repo's shape). Decoupled so the held-lock read targets the real coordination
|
|
160
|
+
* arbiter even when the divergence remote is absent. Default `origin`.
|
|
161
|
+
*/
|
|
162
|
+
lockArbiterRemote?: string;
|
|
163
|
+
/** Sink for the fetch-first fall-back warning (warn + last-known, never error). */
|
|
164
|
+
warn?: (message: string) => void;
|
|
165
|
+
env?: NodeJS.ProcessEnv;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Resolve the cwd-local section for `scan`/`status`. Returns
|
|
169
|
+
* `{participating: false}` when the cwd is NOT a participating repo (the callers
|
|
170
|
+
* then render only the registry view, unchanged). When participating it:
|
|
171
|
+
*
|
|
172
|
+
* 1. FETCHES the cwd repo's arbiter first (warn + fall back to last-known on
|
|
173
|
+
* failure — never errors), then computes the divergence vs `<arbiter>/main`;
|
|
174
|
+
* 2. reads the COORDINATION arbiter's HELD-LOCK set (the remote where
|
|
175
|
+
* `refs/dorfl/lock/*` live, default `origin`; fail-closed: throws when that
|
|
176
|
+
* remote exists but is unreachable) to SUBTRACT in-flight items from the pool;
|
|
177
|
+
* 3. reads the cwd's `work/` lifecycle from the LOCAL WORKING TREE
|
|
178
|
+
* (`scanRepoPaths([cwd])`) with that held set subtracted;
|
|
179
|
+
* 4. de-dups against the registry (is the cwd's arbiter URL a registered
|
|
180
|
+
* mirror?).
|
|
181
|
+
*
|
|
182
|
+
* It MUTATES nothing but the arbiter fetch (a read refresh, same as the registry
|
|
183
|
+
* fetch-first); it never claims/moves/integrates.
|
|
184
|
+
*/
|
|
185
|
+
export declare function resolveCwdSection(options: ResolveCwdSectionOptions): Promise<CwdSection>;
|
|
186
|
+
//# sourceMappingURL=cwd-section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwd-section.d.ts","sourceRoot":"","sources":["../src/cwd-section.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,UAAU,EAAC,MAAM,WAAW,CAAC;AAKzD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,mFAAmF;AACnF,MAAM,WAAW,UAAU;IAC1B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;CACf;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,OAAO,CAAC,EAAE,UAAU,CAAC;CACrB;AAcD,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC9B;;iBAEa;IACb,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;;;;OAQG;IACH,cAAc,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,cAAc,CAgBjB;AAED,2CAA2C;AAC3C,MAAM,WAAW,wBAAwB;IACxC,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAwFrB"}
|