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 @@
|
|
|
1
|
+
{"version":3,"file":"repo-key.d.ts","sourceRoot":"","sources":["../src/repo-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD"}
|
package/dist/repo-key.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The arbiter-URL → **hub key** encoder, extracted from `repo-mirror.ts` so it
|
|
3
|
+
* is importable WITHOUT pulling in the rest of the hub-mirror plumbing (which
|
|
4
|
+
* itself depends on `repo-config.ts`). The split exists for ONE reason: the
|
|
5
|
+
* per-machine `config.override.json` layer (resolved in `repo-config.ts`)
|
|
6
|
+
* needs the hub key to look up the per-repo override bucket — but
|
|
7
|
+
* `repo-config.ts` cannot import from `repo-mirror.ts` without a cycle. The
|
|
8
|
+
* key encoder is pure (URL → string) and has no business depending on the
|
|
9
|
+
* mirror or the per-repo config, so it lives here. `repo-mirror.ts` re-exports
|
|
10
|
+
* {@link encodeRepoKey} so existing callers see no change.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Deterministically encode an arbiter remote URL into a hierarchical hub key:
|
|
14
|
+
* drop the scheme / user / `.git` suffix, then replace `.` → `-` **per path
|
|
15
|
+
* segment** (lossless and reversible; avoids the dotted-segment hazard that
|
|
16
|
+
* trips editors / tools and our own dotdir-pruning). E.g.
|
|
17
|
+
* `git@github.com:wighawag/dorfl.git` → `github-com/wighawag/dorfl`.
|
|
18
|
+
*/
|
|
19
|
+
export function encodeRepoKey(url) {
|
|
20
|
+
const segments = urlSegments(url);
|
|
21
|
+
return segments.map(dashDots).join('/');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Split a remote URL into its host + path segments (lossy only of scheme/user/
|
|
25
|
+
* port/`.git`, which carry no identity for keying). Handles the four shapes the
|
|
26
|
+
* arbiter can take: scp-like ssh (`git@host:org/repo.git`), `ssh://`, `https://`
|
|
27
|
+
* / `http://`, `file://`, and a plain local filesystem path to a bare repo.
|
|
28
|
+
*/
|
|
29
|
+
function urlSegments(url) {
|
|
30
|
+
const trimmed = url.trim();
|
|
31
|
+
// scp-like ssh: [user@]host:path (no `://`, has a `:` before the path).
|
|
32
|
+
const scp = /^(?:[^@/]+@)?([^/:]+):(.+)$/;
|
|
33
|
+
if (!trimmed.includes('://')) {
|
|
34
|
+
const m = scp.exec(trimmed);
|
|
35
|
+
if (m && !trimmed.startsWith('/')) {
|
|
36
|
+
return [m[1], ...pathSegments(m[2])];
|
|
37
|
+
}
|
|
38
|
+
// Otherwise a plain local path (e.g. `/srv/git/org/repo.git`).
|
|
39
|
+
return pathSegments(trimmed);
|
|
40
|
+
}
|
|
41
|
+
// scheme://[user@]host[:port]/path — or file:///abs/path (empty host).
|
|
42
|
+
const schemeEnd = trimmed.indexOf('://');
|
|
43
|
+
const rest = trimmed.slice(schemeEnd + 3);
|
|
44
|
+
const slash = rest.indexOf('/');
|
|
45
|
+
const authority = slash === -1 ? rest : rest.slice(0, slash);
|
|
46
|
+
const path = slash === -1 ? '' : rest.slice(slash + 1);
|
|
47
|
+
const host = stripUserAndPort(authority);
|
|
48
|
+
const hostSegments = host === '' ? [] : [host];
|
|
49
|
+
return [...hostSegments, ...pathSegments(path)];
|
|
50
|
+
}
|
|
51
|
+
/** Drop `user@` and `:port` from an authority, leaving the bare host. */
|
|
52
|
+
function stripUserAndPort(authority) {
|
|
53
|
+
const afterUser = authority.includes('@')
|
|
54
|
+
? authority.slice(authority.lastIndexOf('@') + 1)
|
|
55
|
+
: authority;
|
|
56
|
+
const colon = afterUser.indexOf(':');
|
|
57
|
+
return colon === -1 ? afterUser : afterUser.slice(0, colon);
|
|
58
|
+
}
|
|
59
|
+
/** Split a `/`-path into non-empty segments, dropping a trailing `.git`. */
|
|
60
|
+
function pathSegments(path) {
|
|
61
|
+
const noGit = path.replace(/\.git\/?$/, '');
|
|
62
|
+
return noGit.split('/').filter((s) => s.length > 0);
|
|
63
|
+
}
|
|
64
|
+
/** Replace every `.` with `-` within a single segment (per-segment, lossless). */
|
|
65
|
+
function dashDots(segment) {
|
|
66
|
+
return segment.replace(/\./g, '-');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=repo-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-key.js","sourceRoot":"","sources":["../src/repo-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import type { Config, PartialConfig } from './config.js';
|
|
2
|
+
import type { ConfigOverrideMap } from './config-override.js';
|
|
3
|
+
export { encodeRepoKey } from './repo-key.js';
|
|
4
|
+
/**
|
|
5
|
+
* Read a bare hub mirror's `origin` URL (`git -C <mirror> remote get-url
|
|
6
|
+
* origin`). Returns the trimmed URL, or `undefined` when the mirror has no
|
|
7
|
+
* `origin` or the read fails (a malformed mirror). The single helper both the
|
|
8
|
+
* registry enumeration (`remote ls`) and the per-machine override layer (the
|
|
9
|
+
* hub-key lookup in {@link resolveRepoConfigFromMirror}) use; defining it here
|
|
10
|
+
* avoids duplicating the `git remote get-url origin` call across modules.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readOriginUrl(mirrorDir: string, env: NodeJS.ProcessEnv | undefined): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* The shared **hub-mirror primitive**: one bare mirror per repo under
|
|
15
|
+
* `<workspacesDir>/repos/<key>.git`, re-fetched from the arbiter. Both the
|
|
16
|
+
* autonomous job runner (`agent-workspaces`) and the human `work-on` build on
|
|
17
|
+
* it: a job worktree and a human worktree are both cut from the mirror's
|
|
18
|
+
* freshly-fetched `main`, so they always branch off the latest arbiter main
|
|
19
|
+
* (ADR §2).
|
|
20
|
+
*
|
|
21
|
+
* This module does NOT create worktrees, claim, or run anything — it only
|
|
22
|
+
* locates / creates / fetches the mirror. It is STATE, not cache (ADR §3): it
|
|
23
|
+
* lives under `~/.dorfl/` (config `workspacesDir`), never `~/.cache`.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* The on-disk location of the bare hub mirror for `url`:
|
|
27
|
+
* `<workspacesDir>/repos/<key>.git`. Lives under `workspacesDir` (default
|
|
28
|
+
* `~/.dorfl`), never `~/.cache` (ADR §3).
|
|
29
|
+
*/
|
|
30
|
+
export declare function mirrorPath(workspacesDir: string, url: string): string;
|
|
31
|
+
export interface EnsureMirrorOptions {
|
|
32
|
+
/**
|
|
33
|
+
* The arbiter remote URL to mirror. Either `url` OR (`fromRepo` + `arbiter`)
|
|
34
|
+
* must be given; if both, `url` wins.
|
|
35
|
+
*/
|
|
36
|
+
url?: string;
|
|
37
|
+
/** A working repo to resolve the remote URL from (with `arbiter`). */
|
|
38
|
+
fromRepo?: string;
|
|
39
|
+
/** Remote name in `fromRepo` whose URL to mirror (default `origin`). */
|
|
40
|
+
arbiter?: string;
|
|
41
|
+
/** The execution working area (config `workspacesDir`, default `~/.dorfl`). */
|
|
42
|
+
workspacesDir: string;
|
|
43
|
+
env?: NodeJS.ProcessEnv;
|
|
44
|
+
}
|
|
45
|
+
export interface EnsureMirrorResult {
|
|
46
|
+
/** Absolute path to the bare mirror. */
|
|
47
|
+
path: string;
|
|
48
|
+
/** The resolved arbiter URL the mirror tracks. */
|
|
49
|
+
url: string;
|
|
50
|
+
/** True iff the mirror did not exist and was just created. */
|
|
51
|
+
created: boolean;
|
|
52
|
+
/** True iff an existing mirror was fetched (not created). */
|
|
53
|
+
fetched: boolean;
|
|
54
|
+
/** The mirror's freshly-fetched `main` tip (40-hex sha). */
|
|
55
|
+
mainSha: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Locate the bare hub mirror for the arbiter; create it (`git clone --bare`) if
|
|
59
|
+
* absent, or `git fetch` it if present. Idempotent: a second call fetches and
|
|
60
|
+
* reuses the same mirror (it never re-clones, so any local mirror state — e.g.
|
|
61
|
+
* other branches/objects — survives). Returns the mirror path and its
|
|
62
|
+
* freshly-fetched `main`, so callers (job worktrees, human worktrees) always
|
|
63
|
+
* branch off the latest arbiter main.
|
|
64
|
+
*/
|
|
65
|
+
export declare function ensureMirror(options: EnsureMirrorOptions): EnsureMirrorResult;
|
|
66
|
+
/**
|
|
67
|
+
* Locate the bare hub mirror for the arbiter and refresh ONLY its `main`,
|
|
68
|
+
* WITHOUT the all-heads `--prune` fetch {@link ensureMirror} does. Clones the
|
|
69
|
+
* mirror (`git clone --bare`) if absent — a fresh clone has no local worktrees,
|
|
70
|
+
* so the all-heads clone refspec cannot collide with any checked-out branch —
|
|
71
|
+
* but on REUSE refreshes via {@link fetchMirrorMain} (main-only, no-prune).
|
|
72
|
+
*
|
|
73
|
+
* This is the MIRROR-ENSURE for the no-checkout CONFIG READ (`do --remote`/
|
|
74
|
+
* `do --isolated` per-repo `.dorfl.json`): `git show main:.dorfl.json`
|
|
75
|
+
* only needs `main`, and using the pruning all-heads fetch here would let a
|
|
76
|
+
* `work/<slug>` branch CHECKED OUT in some other (stale) job worktree block the
|
|
77
|
+
* fetch (`git refuses to fetch into branch … checked out`), throwing the config
|
|
78
|
+
* read into its global+default fallback. Narrowing the config-read fetch to
|
|
79
|
+
* main-only (no-prune) means a checked-out worktree branch can NEVER block it
|
|
80
|
+
* (the read-path `scan`/`status`/mirror-pool-scan already use main-only fetches
|
|
81
|
+
* for exactly this reason — ADR §6).
|
|
82
|
+
*
|
|
83
|
+
* Does NOT replace {@link ensureMirror}: the build's worktree MATERIALISATION
|
|
84
|
+
* still legitimately needs the all-heads fetch (continue-detection wants the
|
|
85
|
+
* kept `work/<slug>` head as a local mirror ref). This is only for the read.
|
|
86
|
+
*/
|
|
87
|
+
export declare function ensureMirrorMain(options: EnsureMirrorOptions): EnsureMirrorResult;
|
|
88
|
+
/**
|
|
89
|
+
* Fetch ONLY `main` from the arbiter into an existing bare mirror, WITHOUT
|
|
90
|
+
* `--prune`. Use this when the mirror also holds LOCAL-ONLY branches that must
|
|
91
|
+
* survive (e.g. the `work/<slug>` branches of live worktrees): the full
|
|
92
|
+
* mirror-style `+refs/heads/*:refs/heads/*` fetch in {@link ensureMirror} prunes
|
|
93
|
+
* any local head absent on the arbiter, which would delete (and corrupt) a
|
|
94
|
+
* checked-out `work/<slug>` worktree branch. This refreshes `main` to the latest
|
|
95
|
+
* arbiter tip while leaving every other local ref untouched. Returns the fresh
|
|
96
|
+
* `main` tip.
|
|
97
|
+
*/
|
|
98
|
+
export declare function fetchMirrorMain(mirrorDir: string, env?: NodeJS.ProcessEnv): string;
|
|
99
|
+
/**
|
|
100
|
+
* Read the target repo's COMMITTED `.dorfl.json` from the bare hub
|
|
101
|
+
* mirror's `main` (`git show main:.dorfl.json`) — the per-repo config
|
|
102
|
+
* layer for the NO-CHECKOUT paths (`do --remote`). The committed file is a
|
|
103
|
+
* tracked file on `<arbiter>/main`, so it is reachable from the mirror without a
|
|
104
|
+
* worktree. Returns the raw file CONTENT, or `undefined` when the repo has no
|
|
105
|
+
* `.dorfl.json` on `main` (a config-less repo — the caller then resolves to
|
|
106
|
+
* exactly global + default, byte-identical to before this layer existed).
|
|
107
|
+
*
|
|
108
|
+
* This is the task's ONE genuinely-new seam: sourcing the bytes from the arbiter
|
|
109
|
+
* instead of the cwd. The parse / allow-reject filtering stays in
|
|
110
|
+
* {@link loadRepoConfigFromContent} (the existing per-repo machinery), so the
|
|
111
|
+
* host-only key rejection is identical however the bytes were sourced.
|
|
112
|
+
*
|
|
113
|
+
* A `git show` failure that is NOT "path missing on main" (a corrupt mirror, an
|
|
114
|
+
* absent `main`) is propagated — it is a genuine plumbing fault, not a
|
|
115
|
+
* config-less repo. The missing-path case (`git show` exit ≠ 0 naming the path)
|
|
116
|
+
* is read as `undefined` (no file = no per-repo layer).
|
|
117
|
+
*/
|
|
118
|
+
export declare function readRepoConfigFromMirrorMain(mirrorDir: string, env?: NodeJS.ProcessEnv): string | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* Resolve a repo's effective {@link Config} for a NO-CHECKOUT path by layering its
|
|
121
|
+
* COMMITTED `.dorfl.json` (read from the bare hub mirror's `main` via
|
|
122
|
+
* {@link readRepoConfigFromMirrorMain}) into the SAME
|
|
123
|
+
* `flag > env > per-repo > global > default` chain a working checkout uses
|
|
124
|
+
* ({@link resolveRepoConfigFromLoaded}). This is the reusable core of `do
|
|
125
|
+
* --remote`'s inline per-repo resolution (`resolveRemoteRepoConfig` in `cli.ts`):
|
|
126
|
+
* the mirror is assumed ALREADY ensured + fetched by the caller (the read paths
|
|
127
|
+
* fetch-first), so this only READS its `main` config and layers it.
|
|
128
|
+
*
|
|
129
|
+
* Resilient: a config-less repo (no file on `main`) resolves to exactly
|
|
130
|
+
* global + flags (byte-identical to the no-per-repo behaviour). A genuine
|
|
131
|
+
* read fault is propagated by {@link readRepoConfigFromMirrorMain}; a caller that
|
|
132
|
+
* must never block on a fault (a read-only scan) catches + falls back to
|
|
133
|
+
* global + flags itself.
|
|
134
|
+
*/
|
|
135
|
+
export declare function resolveRepoConfigFromMirror(options: {
|
|
136
|
+
/** The bare hub mirror directory whose `main:.dorfl.json` to read. */
|
|
137
|
+
mirrorPath: string;
|
|
138
|
+
/** The global + default config layer (from `loadConfig`/`mergeConfig`). */
|
|
139
|
+
global: Config;
|
|
140
|
+
/** Optional flag overrides (highest precedence). */
|
|
141
|
+
flags?: PartialConfig;
|
|
142
|
+
env?: NodeJS.ProcessEnv;
|
|
143
|
+
/**
|
|
144
|
+
* The per-machine override map (from `loadConfigOverride`), inserted between
|
|
145
|
+
* the committed per-repo file and env in the precedence chain. The hub key is
|
|
146
|
+
* derived from the mirror's own `origin` URL (via {@link readOriginUrl}); if
|
|
147
|
+
* unresolvable, the hub-key bucket is skipped and only the `"*"` bucket
|
|
148
|
+
* applies. Default: empty map (no override applied) — byte-identical to the
|
|
149
|
+
* pre-override behaviour.
|
|
150
|
+
*/
|
|
151
|
+
override?: ConfigOverrideMap;
|
|
152
|
+
}): Config;
|
|
153
|
+
/** The bare mirror's `main` tip (40-hex sha), as freshly fetched. */
|
|
154
|
+
export declare function mirrorMainSha(mirrorDir: string, env?: NodeJS.ProcessEnv): string;
|
|
155
|
+
/**
|
|
156
|
+
* Fetch-first for the READ paths (`scan`/`status`, ADR
|
|
157
|
+
* `command-surface-and-journeys` §5/§6): refresh a registered mirror's `main`
|
|
158
|
+
* before reading its `work/` tree, so the read sees the remote truth (the
|
|
159
|
+
* registry model makes the remote the source of truth). It is a thin wrapper
|
|
160
|
+
* over {@link fetchMirrorMain} (the load-bearing main-only, no-prune fetch — it
|
|
161
|
+
* must NOT be the pruning `ensureMirror` fetch, which would delete live
|
|
162
|
+
* worktrees' `work/<slug>` branches, ADR §6).
|
|
163
|
+
*
|
|
164
|
+
* **Never errors out: warn + fall back to last-known.** A failed fetch (offline,
|
|
165
|
+
* a vanished origin, a dead arbiter) is NOT fatal for a read — `scan`/`status`
|
|
166
|
+
* must still report from the mirror's last-known `main`. On failure it routes a
|
|
167
|
+
* human-readable note through `warn` and returns `false`; on success it returns
|
|
168
|
+
* `true`. The freshness of the read then reflects the last SUCCESSFUL fetch.
|
|
169
|
+
*/
|
|
170
|
+
export declare function fetchMirrorMainOrWarn(options: {
|
|
171
|
+
/** The bare hub mirror directory whose `main` to refresh. */
|
|
172
|
+
mirrorPath: string;
|
|
173
|
+
/** Sink for the fall-back warning when the fetch fails. */
|
|
174
|
+
warn?: (message: string) => void;
|
|
175
|
+
env?: NodeJS.ProcessEnv;
|
|
176
|
+
}): boolean;
|
|
177
|
+
//# sourceMappingURL=repo-mirror.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-mirror.d.ts","sourceRoot":"","sources":["../src/repo-mirror.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAS5D,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAOpB;AAED;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,MAAM,WAAW,mBAAmB;IACnC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IAClC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAiD7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,mBAAmB,GAC1B,kBAAkB,CAqBpB;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC9B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,CAKR;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAC3C,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,GAAG,SAAS,CAqBpB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACpD,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,MAAM,CAmBT;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,CAER;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC9C,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,OAAO,CAYV"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { git, run } from './git.js';
|
|
4
|
+
import { REPO_CONFIG_FILENAME, loadRepoConfigFromContent, resolveRepoConfigFromLoaded, } from './repo-config.js';
|
|
5
|
+
import { encodeRepoKey } from './repo-key.js';
|
|
6
|
+
export { encodeRepoKey } from './repo-key.js';
|
|
7
|
+
/**
|
|
8
|
+
* Read a bare hub mirror's `origin` URL (`git -C <mirror> remote get-url
|
|
9
|
+
* origin`). Returns the trimmed URL, or `undefined` when the mirror has no
|
|
10
|
+
* `origin` or the read fails (a malformed mirror). The single helper both the
|
|
11
|
+
* registry enumeration (`remote ls`) and the per-machine override layer (the
|
|
12
|
+
* hub-key lookup in {@link resolveRepoConfigFromMirror}) use; defining it here
|
|
13
|
+
* avoids duplicating the `git remote get-url origin` call across modules.
|
|
14
|
+
*/
|
|
15
|
+
export function readOriginUrl(mirrorDir, env) {
|
|
16
|
+
const result = run('git', ['remote', 'get-url', 'origin'], mirrorDir, { env });
|
|
17
|
+
if (result.status !== 0) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const url = result.stdout.trim();
|
|
21
|
+
return url === '' ? undefined : url;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The shared **hub-mirror primitive**: one bare mirror per repo under
|
|
25
|
+
* `<workspacesDir>/repos/<key>.git`, re-fetched from the arbiter. Both the
|
|
26
|
+
* autonomous job runner (`agent-workspaces`) and the human `work-on` build on
|
|
27
|
+
* it: a job worktree and a human worktree are both cut from the mirror's
|
|
28
|
+
* freshly-fetched `main`, so they always branch off the latest arbiter main
|
|
29
|
+
* (ADR §2).
|
|
30
|
+
*
|
|
31
|
+
* This module does NOT create worktrees, claim, or run anything — it only
|
|
32
|
+
* locates / creates / fetches the mirror. It is STATE, not cache (ADR §3): it
|
|
33
|
+
* lives under `~/.dorfl/` (config `workspacesDir`), never `~/.cache`.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* The on-disk location of the bare hub mirror for `url`:
|
|
37
|
+
* `<workspacesDir>/repos/<key>.git`. Lives under `workspacesDir` (default
|
|
38
|
+
* `~/.dorfl`), never `~/.cache` (ADR §3).
|
|
39
|
+
*/
|
|
40
|
+
export function mirrorPath(workspacesDir, url) {
|
|
41
|
+
return join(workspacesDir, 'repos', `${encodeRepoKey(url)}.git`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Locate the bare hub mirror for the arbiter; create it (`git clone --bare`) if
|
|
45
|
+
* absent, or `git fetch` it if present. Idempotent: a second call fetches and
|
|
46
|
+
* reuses the same mirror (it never re-clones, so any local mirror state — e.g.
|
|
47
|
+
* other branches/objects — survives). Returns the mirror path and its
|
|
48
|
+
* freshly-fetched `main`, so callers (job worktrees, human worktrees) always
|
|
49
|
+
* branch off the latest arbiter main.
|
|
50
|
+
*/
|
|
51
|
+
export function ensureMirror(options) {
|
|
52
|
+
const env = options.env;
|
|
53
|
+
const url = resolveUrl(options);
|
|
54
|
+
const path = mirrorPath(options.workspacesDir, url);
|
|
55
|
+
let created = false;
|
|
56
|
+
let fetched = false;
|
|
57
|
+
if (existsSync(path)) {
|
|
58
|
+
// Reuse: fetch the latest from the arbiter into the existing bare mirror.
|
|
59
|
+
//
|
|
60
|
+
// `main` is the authoritative base every worktree branches off — fetch it
|
|
61
|
+
// HARD (prune), and it can never collide with a checked-out branch (`main` is
|
|
62
|
+
// never a job worktree branch).
|
|
63
|
+
git(['fetch', '--prune', 'origin', '+refs/heads/main:refs/heads/main'], path, {
|
|
64
|
+
env,
|
|
65
|
+
});
|
|
66
|
+
// SHARED-MIRROR SIBLING-WORKTREE SAFETY (task
|
|
67
|
+
// `cutover-claim-body-stays-and-complete-sources-from-backlog`): two SAME-repo
|
|
68
|
+
// `run` jobs share ONE bare mirror, and each `git worktree add`s its own LOCAL
|
|
69
|
+
// `work/<slug>` head. The remaining all-heads fetch (which brings down each
|
|
70
|
+
// arbiter `work/<slug>` so continue-detection can read it as a local head) tries
|
|
71
|
+
// to UPDATE every such head; git REFUSES to fetch into a SIBLING's `work/<slug>`
|
|
72
|
+
// head while that sibling worktree has it checked out (`fatal: refusing to fetch
|
|
73
|
+
// into branch ... checked out`) and exits non-zero — EVEN THOUGH it still updated
|
|
74
|
+
// every OTHER ref (incl. main, above, and THIS job's own `work/<slug>`). Before
|
|
75
|
+
// this task the claim's body-move serialised the jobs enough to hide the
|
|
76
|
+
// overlap; with claim no longer writing `main` the jobs run concurrently and it
|
|
77
|
+
// surfaces. So this all-heads fetch is BEST-EFFORT (soft): a sibling's
|
|
78
|
+
// checked-out head being refused must NOT fail the whole ensure — the refs we
|
|
79
|
+
// need (main + this job's own head) are already updated, and continue-detection
|
|
80
|
+
// is arbiter-authoritative (`ls-remote` in `createJob`) anyway. A genuinely
|
|
81
|
+
// unrelated failure (e.g. an unreachable arbiter) ALSO degrades to best-effort
|
|
82
|
+
// here, but `main` (the hard fetch above) already succeeded, so the worktree
|
|
83
|
+
// materialisation has its base; the per-branch onboard reads still fail loudly
|
|
84
|
+
// downstream if a needed ref is genuinely absent.
|
|
85
|
+
run('git', ['fetch', 'origin', '+refs/heads/*:refs/heads/*'], path, { env });
|
|
86
|
+
fetched = true;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// First time: a bare mirror clone (shared object store, cheap).
|
|
90
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
91
|
+
git(['clone', '--quiet', '--bare', url, path], dirname(path), { env });
|
|
92
|
+
created = true;
|
|
93
|
+
}
|
|
94
|
+
return { path, url, created, fetched, mainSha: mirrorMainSha(path, env) };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Locate the bare hub mirror for the arbiter and refresh ONLY its `main`,
|
|
98
|
+
* WITHOUT the all-heads `--prune` fetch {@link ensureMirror} does. Clones the
|
|
99
|
+
* mirror (`git clone --bare`) if absent — a fresh clone has no local worktrees,
|
|
100
|
+
* so the all-heads clone refspec cannot collide with any checked-out branch —
|
|
101
|
+
* but on REUSE refreshes via {@link fetchMirrorMain} (main-only, no-prune).
|
|
102
|
+
*
|
|
103
|
+
* This is the MIRROR-ENSURE for the no-checkout CONFIG READ (`do --remote`/
|
|
104
|
+
* `do --isolated` per-repo `.dorfl.json`): `git show main:.dorfl.json`
|
|
105
|
+
* only needs `main`, and using the pruning all-heads fetch here would let a
|
|
106
|
+
* `work/<slug>` branch CHECKED OUT in some other (stale) job worktree block the
|
|
107
|
+
* fetch (`git refuses to fetch into branch … checked out`), throwing the config
|
|
108
|
+
* read into its global+default fallback. Narrowing the config-read fetch to
|
|
109
|
+
* main-only (no-prune) means a checked-out worktree branch can NEVER block it
|
|
110
|
+
* (the read-path `scan`/`status`/mirror-pool-scan already use main-only fetches
|
|
111
|
+
* for exactly this reason — ADR §6).
|
|
112
|
+
*
|
|
113
|
+
* Does NOT replace {@link ensureMirror}: the build's worktree MATERIALISATION
|
|
114
|
+
* still legitimately needs the all-heads fetch (continue-detection wants the
|
|
115
|
+
* kept `work/<slug>` head as a local mirror ref). This is only for the read.
|
|
116
|
+
*/
|
|
117
|
+
export function ensureMirrorMain(options) {
|
|
118
|
+
const env = options.env;
|
|
119
|
+
const url = resolveUrl(options);
|
|
120
|
+
const path = mirrorPath(options.workspacesDir, url);
|
|
121
|
+
let created = false;
|
|
122
|
+
let fetched = false;
|
|
123
|
+
if (existsSync(path)) {
|
|
124
|
+
// Reuse: refresh ONLY `main`, no-prune, so a `work/<slug>` branch checked
|
|
125
|
+
// out in some other worktree can never block this fetch.
|
|
126
|
+
fetchMirrorMain(path, env);
|
|
127
|
+
fetched = true;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// First time: a bare mirror clone (no local worktrees yet, so the clone's
|
|
131
|
+
// own refspec can collide with nothing).
|
|
132
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
133
|
+
git(['clone', '--quiet', '--bare', url, path], dirname(path), { env });
|
|
134
|
+
created = true;
|
|
135
|
+
}
|
|
136
|
+
return { path, url, created, fetched, mainSha: mirrorMainSha(path, env) };
|
|
137
|
+
}
|
|
138
|
+
/** Resolve the arbiter URL from `url`, or from `fromRepo` + `arbiter` remote. */
|
|
139
|
+
function resolveUrl(options) {
|
|
140
|
+
if (options.url && options.url.trim() !== '') {
|
|
141
|
+
return options.url.trim();
|
|
142
|
+
}
|
|
143
|
+
if (options.fromRepo) {
|
|
144
|
+
const remote = options.arbiter ?? 'origin';
|
|
145
|
+
return git(['remote', 'get-url', remote], options.fromRepo, {
|
|
146
|
+
env: options.env,
|
|
147
|
+
}).trim();
|
|
148
|
+
}
|
|
149
|
+
throw new Error('ensureMirror requires either `url` or `fromRepo` (with `arbiter`).');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Fetch ONLY `main` from the arbiter into an existing bare mirror, WITHOUT
|
|
153
|
+
* `--prune`. Use this when the mirror also holds LOCAL-ONLY branches that must
|
|
154
|
+
* survive (e.g. the `work/<slug>` branches of live worktrees): the full
|
|
155
|
+
* mirror-style `+refs/heads/*:refs/heads/*` fetch in {@link ensureMirror} prunes
|
|
156
|
+
* any local head absent on the arbiter, which would delete (and corrupt) a
|
|
157
|
+
* checked-out `work/<slug>` worktree branch. This refreshes `main` to the latest
|
|
158
|
+
* arbiter tip while leaving every other local ref untouched. Returns the fresh
|
|
159
|
+
* `main` tip.
|
|
160
|
+
*/
|
|
161
|
+
export function fetchMirrorMain(mirrorDir, env) {
|
|
162
|
+
git(['fetch', 'origin', '+refs/heads/main:refs/heads/main'], mirrorDir, {
|
|
163
|
+
env,
|
|
164
|
+
});
|
|
165
|
+
return mirrorMainSha(mirrorDir, env);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Read the target repo's COMMITTED `.dorfl.json` from the bare hub
|
|
169
|
+
* mirror's `main` (`git show main:.dorfl.json`) — the per-repo config
|
|
170
|
+
* layer for the NO-CHECKOUT paths (`do --remote`). The committed file is a
|
|
171
|
+
* tracked file on `<arbiter>/main`, so it is reachable from the mirror without a
|
|
172
|
+
* worktree. Returns the raw file CONTENT, or `undefined` when the repo has no
|
|
173
|
+
* `.dorfl.json` on `main` (a config-less repo — the caller then resolves to
|
|
174
|
+
* exactly global + default, byte-identical to before this layer existed).
|
|
175
|
+
*
|
|
176
|
+
* This is the task's ONE genuinely-new seam: sourcing the bytes from the arbiter
|
|
177
|
+
* instead of the cwd. The parse / allow-reject filtering stays in
|
|
178
|
+
* {@link loadRepoConfigFromContent} (the existing per-repo machinery), so the
|
|
179
|
+
* host-only key rejection is identical however the bytes were sourced.
|
|
180
|
+
*
|
|
181
|
+
* A `git show` failure that is NOT "path missing on main" (a corrupt mirror, an
|
|
182
|
+
* absent `main`) is propagated — it is a genuine plumbing fault, not a
|
|
183
|
+
* config-less repo. The missing-path case (`git show` exit ≠ 0 naming the path)
|
|
184
|
+
* is read as `undefined` (no file = no per-repo layer).
|
|
185
|
+
*/
|
|
186
|
+
export function readRepoConfigFromMirrorMain(mirrorDir, env) {
|
|
187
|
+
const spec = `main:${REPO_CONFIG_FILENAME}`;
|
|
188
|
+
const res = run('git', ['show', spec], mirrorDir, { env });
|
|
189
|
+
if (res.status === 0) {
|
|
190
|
+
return res.stdout;
|
|
191
|
+
}
|
|
192
|
+
// `git show main:<path>` exits non-zero both when the PATH is absent on main
|
|
193
|
+
// (the config-less repo — expected, → undefined) and when `main`/the object is
|
|
194
|
+
// unresolvable (a genuine fault — propagate). git words the former as
|
|
195
|
+
// "...does not exist in 'main'" / "exists on disk, but not in" / "path ...
|
|
196
|
+
// does not exist"; the latter as an invalid-object/unknown-revision error.
|
|
197
|
+
const stderr = res.stderr;
|
|
198
|
+
const pathMissing = /does not exist in|exists on disk, but not in|fatal: path/i.test(stderr) ||
|
|
199
|
+
/did not match any file/i.test(stderr);
|
|
200
|
+
if (pathMissing) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
throw new Error(`git show ${spec} failed in ${mirrorDir} (exit ${res.status}): ${stderr.trim()}`);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Resolve a repo's effective {@link Config} for a NO-CHECKOUT path by layering its
|
|
207
|
+
* COMMITTED `.dorfl.json` (read from the bare hub mirror's `main` via
|
|
208
|
+
* {@link readRepoConfigFromMirrorMain}) into the SAME
|
|
209
|
+
* `flag > env > per-repo > global > default` chain a working checkout uses
|
|
210
|
+
* ({@link resolveRepoConfigFromLoaded}). This is the reusable core of `do
|
|
211
|
+
* --remote`'s inline per-repo resolution (`resolveRemoteRepoConfig` in `cli.ts`):
|
|
212
|
+
* the mirror is assumed ALREADY ensured + fetched by the caller (the read paths
|
|
213
|
+
* fetch-first), so this only READS its `main` config and layers it.
|
|
214
|
+
*
|
|
215
|
+
* Resilient: a config-less repo (no file on `main`) resolves to exactly
|
|
216
|
+
* global + flags (byte-identical to the no-per-repo behaviour). A genuine
|
|
217
|
+
* read fault is propagated by {@link readRepoConfigFromMirrorMain}; a caller that
|
|
218
|
+
* must never block on a fault (a read-only scan) catches + falls back to
|
|
219
|
+
* global + flags itself.
|
|
220
|
+
*/
|
|
221
|
+
export function resolveRepoConfigFromMirror(options) {
|
|
222
|
+
const { mirrorPath, global, flags, env, override } = options;
|
|
223
|
+
const content = readRepoConfigFromMirrorMain(mirrorPath, env);
|
|
224
|
+
const label = `${mirrorPath}#main:${REPO_CONFIG_FILENAME}`;
|
|
225
|
+
const loaded = content === undefined
|
|
226
|
+
? { path: label, config: {}, rejected: [] }
|
|
227
|
+
: loadRepoConfigFromContent(content, label);
|
|
228
|
+
// The hub key for the override lookup comes from the mirror's OWN `origin`
|
|
229
|
+
// URL (the more reliable source for a no-checkout path — the mirror is what
|
|
230
|
+
// the runner actually operates on). Unresolvable ⇒ hub-key lookup skipped
|
|
231
|
+
// (graceful degrade); the `"*"` bucket still applies.
|
|
232
|
+
const arbiterUrl = readOriginUrl(mirrorPath, env);
|
|
233
|
+
return resolveRepoConfigFromLoaded(loaded, {
|
|
234
|
+
global,
|
|
235
|
+
flags,
|
|
236
|
+
override,
|
|
237
|
+
...(arbiterUrl !== undefined ? { arbiterUrl } : {}),
|
|
238
|
+
}).config;
|
|
239
|
+
}
|
|
240
|
+
/** The bare mirror's `main` tip (40-hex sha), as freshly fetched. */
|
|
241
|
+
export function mirrorMainSha(mirrorDir, env) {
|
|
242
|
+
return git(['rev-parse', 'main'], mirrorDir, { env }).trim();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Fetch-first for the READ paths (`scan`/`status`, ADR
|
|
246
|
+
* `command-surface-and-journeys` §5/§6): refresh a registered mirror's `main`
|
|
247
|
+
* before reading its `work/` tree, so the read sees the remote truth (the
|
|
248
|
+
* registry model makes the remote the source of truth). It is a thin wrapper
|
|
249
|
+
* over {@link fetchMirrorMain} (the load-bearing main-only, no-prune fetch — it
|
|
250
|
+
* must NOT be the pruning `ensureMirror` fetch, which would delete live
|
|
251
|
+
* worktrees' `work/<slug>` branches, ADR §6).
|
|
252
|
+
*
|
|
253
|
+
* **Never errors out: warn + fall back to last-known.** A failed fetch (offline,
|
|
254
|
+
* a vanished origin, a dead arbiter) is NOT fatal for a read — `scan`/`status`
|
|
255
|
+
* must still report from the mirror's last-known `main`. On failure it routes a
|
|
256
|
+
* human-readable note through `warn` and returns `false`; on success it returns
|
|
257
|
+
* `true`. The freshness of the read then reflects the last SUCCESSFUL fetch.
|
|
258
|
+
*/
|
|
259
|
+
export function fetchMirrorMainOrWarn(options) {
|
|
260
|
+
try {
|
|
261
|
+
fetchMirrorMain(options.mirrorPath, options.env);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
266
|
+
options.warn?.(`could not fetch mirror at ${options.mirrorPath}; ` +
|
|
267
|
+
`reading last-known state (offline). ${reason}`);
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=repo-mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-mirror.js","sourceRoot":"","sources":["../src/repo-mirror.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small, shared **bounded exponential-backoff** retry helper for git / provider
|
|
3
|
+
* NETWORK ops on the needs-attention route (the OBSERVABLE surface push, the
|
|
4
|
+
* RECOVERABLE branch push, and the propose-mode PR create). The route does a
|
|
5
|
+
* LOCAL move that always succeeds offline, then these best-effort remote ops; a
|
|
6
|
+
* transient OUTAGE (unreachable arbiter / flaky provider) should be RETRIED a few
|
|
7
|
+
* times with a temporal delay before a clean BOUNDED give-up into the local-only
|
|
8
|
+
* degraded state — never an indefinite hang, never an uncaught throw out of the
|
|
9
|
+
* failure handler.
|
|
10
|
+
*
|
|
11
|
+
* This is DELIBERATELY NOT the model in {@link file://./claim-cas.ts}: that loop
|
|
12
|
+
* retries CONTENTION (a REJECTED push — someone advanced the ref) INSTANTLY with
|
|
13
|
+
* NO delay, refetching+rebuilding against the new base. THIS helper is for the
|
|
14
|
+
* OUTAGE/unreachable case, which needs a temporal back-off (the remote may come
|
|
15
|
+
* back); the two are distinct and must not be conflated.
|
|
16
|
+
*
|
|
17
|
+
* Bounds (all configurable, sensible defaults):
|
|
18
|
+
* - `initialDelayMs` (X): the first inter-attempt delay.
|
|
19
|
+
* - `maxDelayMs` (Y): the cap the exponentially-growing delay never exceeds.
|
|
20
|
+
* - `maxTotalMs` (Z): the wall-clock budget; once the NEXT delay would push the
|
|
21
|
+
* cumulative sleep past this, we stop retrying (a clean bounded give-up).
|
|
22
|
+
* - `maxAttempts`: a hard upper bound on attempts (a belt-and-braces cap so a
|
|
23
|
+
* tiny/zero delay budget still terminates).
|
|
24
|
+
*
|
|
25
|
+
* The SLEEP is INJECTABLE (reusing the `sleep?: (ms) => Promise<void>` /
|
|
26
|
+
* `realSleep` seam `src/run.ts` already uses for the inter-tick sleep) so tests
|
|
27
|
+
* drive the whole retry TIMELINE deterministically with NO real wall-clock waits.
|
|
28
|
+
*
|
|
29
|
+
* Model-endpoint retries are NOT this helper's job — the pi harness retries its
|
|
30
|
+
* own API. This is git/provider network resilience only.
|
|
31
|
+
*/
|
|
32
|
+
/** A sleep seam: resolve after `ms`. The real one is `setTimeout`-backed. */
|
|
33
|
+
export type Sleep = (ms: number) => Promise<void>;
|
|
34
|
+
/** The default real sleep (a `setTimeout`-backed promise). */
|
|
35
|
+
export declare const realSleep: Sleep;
|
|
36
|
+
/** Bounds for {@link retryWithBackoff}. All optional; defaults below. */
|
|
37
|
+
export interface BackoffOptions {
|
|
38
|
+
/** First inter-attempt delay (ms). Default {@link DEFAULT_BACKOFF}.initialDelayMs. */
|
|
39
|
+
initialDelayMs?: number;
|
|
40
|
+
/** Exponential-growth cap (ms). Default {@link DEFAULT_BACKOFF}.maxDelayMs. */
|
|
41
|
+
maxDelayMs?: number;
|
|
42
|
+
/** Total wall-clock budget for delays (ms). Default {@link DEFAULT_BACKOFF}.maxTotalMs. */
|
|
43
|
+
maxTotalMs?: number;
|
|
44
|
+
/** Hard attempt cap. Default {@link DEFAULT_BACKOFF}.maxAttempts. */
|
|
45
|
+
maxAttempts?: number;
|
|
46
|
+
/** Injected sleep (tests). Default {@link realSleep}. */
|
|
47
|
+
sleep?: Sleep;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The default bounds: a short first delay growing exponentially to a modest cap,
|
|
51
|
+
* with a small total budget — enough to ride out a blip, NOT a hang. A clean
|
|
52
|
+
* bounded give-up into the local-only degraded state beats waiting forever;
|
|
53
|
+
* CI/humans then retry deliberately.
|
|
54
|
+
*/
|
|
55
|
+
export declare const DEFAULT_BACKOFF: Required<Omit<BackoffOptions, 'sleep'>>;
|
|
56
|
+
/** Outcome of {@link retryWithBackoff}: the op's value, or a clean give-up. */
|
|
57
|
+
export type RetryResult<T> = {
|
|
58
|
+
ok: true;
|
|
59
|
+
value: T;
|
|
60
|
+
attempts: number;
|
|
61
|
+
} | {
|
|
62
|
+
ok: false;
|
|
63
|
+
attempts: number;
|
|
64
|
+
lastError?: string;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Run `op` and, if it reports failure, RETRY it with bounded exponential backoff
|
|
68
|
+
* until it succeeds or the bounds are exhausted (then a clean give-up — NEVER an
|
|
69
|
+
* indefinite loop). `op` reports failure in EITHER of two ways, both treated the
|
|
70
|
+
* same so callers can use whichever fits the underlying API:
|
|
71
|
+
*
|
|
72
|
+
* - it RETURNS `{ok: false, error?}` (e.g. a git `RunResult` mapped to a
|
|
73
|
+
* boolean — a non-zero exit is a failure, not a throw), OR
|
|
74
|
+
* - it THROWS (e.g. a git plumbing helper's hard-fetch against an unreachable
|
|
75
|
+
* remote) — the throw is CAUGHT here and treated as a failed attempt.
|
|
76
|
+
*
|
|
77
|
+
* On success it returns `{ok: true, value}`. On exhaustion it returns
|
|
78
|
+
* `{ok: false, lastError}` — it NEVER throws out (the route must not crash on a
|
|
79
|
+
* git outage). The delay schedule is `initialDelayMs`, doubling each attempt up
|
|
80
|
+
* to `maxDelayMs`, stopping once another attempt's delay would exceed the
|
|
81
|
+
* `maxTotalMs` budget or `maxAttempts` is reached.
|
|
82
|
+
*/
|
|
83
|
+
export declare function retryWithBackoff<T>(op: () => Promise<{
|
|
84
|
+
ok: true;
|
|
85
|
+
value: T;
|
|
86
|
+
} | {
|
|
87
|
+
ok: false;
|
|
88
|
+
error?: string;
|
|
89
|
+
}>, options?: BackoffOptions): Promise<RetryResult<T>>;
|
|
90
|
+
//# sourceMappingURL=retry-backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-backoff.d.ts","sourceRoot":"","sources":["../src/retry-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElD,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAC0B,CAAC;AAEnD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC9B,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAKnE,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,WAAW,CAAC,CAAC,IACtB;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACtC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,EACrE,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAsCzB"}
|