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,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The **remote merged-work-branch reaper** — the cross-machine COUNTERPART of the
|
|
3
|
+
* job-worktree reaper in `gc.ts`. Where `gc.ts` reaps LOCAL job WORKTREES under
|
|
4
|
+
* `workspacesDir/work/*`, this reaps REMOTE `work/<slug>` BRANCHES that linger on
|
|
5
|
+
* the arbiter after their propose-mode PR has MERGED.
|
|
6
|
+
*
|
|
7
|
+
* The safety lynchpin is the SAME provably-merged predicate the worktree reaper
|
|
8
|
+
* uses (`gc.ts` `isAncestor`, REUSED here, never a second one): a remote
|
|
9
|
+
* `work/<slug>` branch is reapable **iff** its tip is
|
|
10
|
+
* `git merge-base --is-ancestor <tip> <arbiter>/main` — provably on `main`. A
|
|
11
|
+
* merely-pushed-but-unmerged branch (an in-flight, kept-for-continue recovery
|
|
12
|
+
* point) is NOT an ancestor of `main`, so the predicate AUTOMATICALLY excludes it
|
|
13
|
+
* — the never-delete-the-in-flight-branch invariant (ADR §4 deletion-safety)
|
|
14
|
+
* stays absolute. Deletion of a fully-merged ref needs NO force, so this NEVER
|
|
15
|
+
* `--force`s.
|
|
16
|
+
*
|
|
17
|
+
* It is provider-AGNOSTIC plain git (`git ls-remote` to enumerate, `git push
|
|
18
|
+
* --delete` to reap), so it works against a local `--bare` arbiter and any
|
|
19
|
+
* provider — NOT relying on GitHub's repo-level auto-delete setting (which is an
|
|
20
|
+
* additive convenience for GitHub arbiters only). The arbiter is addressed
|
|
21
|
+
* THROUGH a local repo (`cwd`) whose `<arbiter>` remote points at it: the same
|
|
22
|
+
* way `requeue --reset` addresses the arbiter for its sanctioned UN-merged
|
|
23
|
+
* deletion (the complement of this merged-only sweep).
|
|
24
|
+
*/
|
|
25
|
+
/** Why a remote `work/<slug>` branch was RETAINED (not provably merged). */
|
|
26
|
+
export type RemoteRetainReason = 'not-merged' | 'main-unresolved';
|
|
27
|
+
/** Human-readable text for each remote-branch retain reason (`sweep` reports). */
|
|
28
|
+
export declare const REMOTE_RETAIN_REASON_TEXT: Record<RemoteRetainReason, string>;
|
|
29
|
+
/** A remote `work/<slug>` branch the sweep reaped (provably merged). */
|
|
30
|
+
export interface ReapedBranch {
|
|
31
|
+
/** The full branch ref (`work/<slug>`). */
|
|
32
|
+
branch: string;
|
|
33
|
+
/** The 40-hex tip the branch pointed at when it was deleted. */
|
|
34
|
+
tip: string;
|
|
35
|
+
}
|
|
36
|
+
/** A remote `work/<slug>` branch the sweep RETAINED, with the reason it kept it. */
|
|
37
|
+
export interface RetainedBranch {
|
|
38
|
+
branch: string;
|
|
39
|
+
tip: string;
|
|
40
|
+
reason: RemoteRetainReason;
|
|
41
|
+
/** Human-readable reason text (`REMOTE_RETAIN_REASON_TEXT[reason]`). */
|
|
42
|
+
reasonText: string;
|
|
43
|
+
}
|
|
44
|
+
export interface SweepRemoteBranchesInput {
|
|
45
|
+
/**
|
|
46
|
+
* A local repo (a checkout or a hub mirror) whose `<arbiter>` remote points at
|
|
47
|
+
* the arbiter to sweep. All git runs in here; nothing in the working tree is
|
|
48
|
+
* touched (only remote refs are read + deleted).
|
|
49
|
+
*/
|
|
50
|
+
cwd: string;
|
|
51
|
+
/** The arbiter remote name (default `origin`, as `requeue --arbiter` defaults). */
|
|
52
|
+
arbiter: string;
|
|
53
|
+
/** Sink for human-readable progress notes (per reaped / retained branch). */
|
|
54
|
+
note?: (message: string) => void;
|
|
55
|
+
/**
|
|
56
|
+
* Do NOT actually delete — only REPORT what WOULD be reaped vs retained. A
|
|
57
|
+
* read-only preview (`--dry-run`); the predicate still runs so the report is
|
|
58
|
+
* exact.
|
|
59
|
+
*/
|
|
60
|
+
dryRun?: boolean;
|
|
61
|
+
env?: NodeJS.ProcessEnv;
|
|
62
|
+
}
|
|
63
|
+
export interface SweepRemoteBranchesResult {
|
|
64
|
+
/** The remote branches reaped this sweep (provably merged). Empty on dry-run. */
|
|
65
|
+
reaped: ReapedBranch[];
|
|
66
|
+
/** The remote branches retained, each with a clear reason. */
|
|
67
|
+
retained: RetainedBranch[];
|
|
68
|
+
/** On `dryRun`, the branches that WOULD be reaped (not actually deleted). */
|
|
69
|
+
wouldReap: ReapedBranch[];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Sweep the arbiter's remote `work/*` branches and DELETE exactly those that are
|
|
73
|
+
* provably merged into `<arbiter>/main` (`git merge-base --is-ancestor`, REUSING
|
|
74
|
+
* `gc.ts`'s `isAncestor`), reporting each as deleted-merged / retained-with-
|
|
75
|
+
* reason. NEVER `--force` (a merged ref needs none); NEVER touches a branch that
|
|
76
|
+
* is not an ancestor of `main` (the in-flight recovery point the never-delete
|
|
77
|
+
* invariant protects). Provider-agnostic plain git, so it works on a `--bare`
|
|
78
|
+
* arbiter.
|
|
79
|
+
*
|
|
80
|
+
* The flow:
|
|
81
|
+
* 1. `git ls-remote --heads <arbiter> 'work/*'` — enumerate remote work
|
|
82
|
+
* branches + their tips (one network round-trip; no full fetch).
|
|
83
|
+
* 2. Fetch `<arbiter>/main` into a local tracking ref so the ancestor check
|
|
84
|
+
* resolves the descendant LOCALLY; fetch each candidate tip object too (so
|
|
85
|
+
* `merge-base` can read it) — best-effort, into a scratch ref.
|
|
86
|
+
* 3. For each branch whose tip `--is-ancestor` of the fetched main ⇒ delete via
|
|
87
|
+
* `git push <arbiter> --delete <branch>`; else retain with a reason.
|
|
88
|
+
*/
|
|
89
|
+
export declare function sweepRemoteMergedBranches(input: SweepRemoteBranchesInput): SweepRemoteBranchesResult;
|
|
90
|
+
/**
|
|
91
|
+
* Enumerate the arbiter's remote `work/*` heads + their tips via
|
|
92
|
+
* `git ls-remote --heads <arbiter> 'work/*'` (one round-trip, no full fetch).
|
|
93
|
+
* Only `work/<type>-<slug>` branches that {@link parseWorkBranchRef} recognises
|
|
94
|
+
* are returned (a stray `work/foo` that is not a namespaced work branch is
|
|
95
|
+
* ignored — the sweep only reaps the branches the protocol creates). Returns []
|
|
96
|
+
* when the arbiter is unreachable (the safe direction — nothing to reap).
|
|
97
|
+
*/
|
|
98
|
+
export declare function listRemoteWorkBranches(cwd: string, arbiter: string, env: NodeJS.ProcessEnv | undefined): Array<{
|
|
99
|
+
branch: string;
|
|
100
|
+
tip: string;
|
|
101
|
+
}>;
|
|
102
|
+
//# sourceMappingURL=reap-branches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reap-branches.d.ts","sourceRoot":"","sources":["../src/reap-branches.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,kBAAkB,GAC3B,YAAY,GACZ,iBAAiB,CAAC;AAErB,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAKxE,CAAC;AAEF,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,kBAAkB,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACzC,iFAAiF;IACjF,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,wBAAwB,GAC7B,yBAAyB,CA6E3B;AAeD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,GAChC,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAAC,CA4BtC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { run } from './git.js';
|
|
2
|
+
import { isAncestor } from './gc.js';
|
|
3
|
+
import { parseWorkBranchRef } from './slug-namespace.js';
|
|
4
|
+
/** Human-readable text for each remote-branch retain reason (`sweep` reports). */
|
|
5
|
+
export const REMOTE_RETAIN_REASON_TEXT = {
|
|
6
|
+
'not-merged': 'not merged (branch tip is not an ancestor of the arbiter main — still in-flight)',
|
|
7
|
+
'main-unresolved': 'arbiter main could not be resolved, so merge could not be proven (kept — safe direction)',
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Sweep the arbiter's remote `work/*` branches and DELETE exactly those that are
|
|
11
|
+
* provably merged into `<arbiter>/main` (`git merge-base --is-ancestor`, REUSING
|
|
12
|
+
* `gc.ts`'s `isAncestor`), reporting each as deleted-merged / retained-with-
|
|
13
|
+
* reason. NEVER `--force` (a merged ref needs none); NEVER touches a branch that
|
|
14
|
+
* is not an ancestor of `main` (the in-flight recovery point the never-delete
|
|
15
|
+
* invariant protects). Provider-agnostic plain git, so it works on a `--bare`
|
|
16
|
+
* arbiter.
|
|
17
|
+
*
|
|
18
|
+
* The flow:
|
|
19
|
+
* 1. `git ls-remote --heads <arbiter> 'work/*'` — enumerate remote work
|
|
20
|
+
* branches + their tips (one network round-trip; no full fetch).
|
|
21
|
+
* 2. Fetch `<arbiter>/main` into a local tracking ref so the ancestor check
|
|
22
|
+
* resolves the descendant LOCALLY; fetch each candidate tip object too (so
|
|
23
|
+
* `merge-base` can read it) — best-effort, into a scratch ref.
|
|
24
|
+
* 3. For each branch whose tip `--is-ancestor` of the fetched main ⇒ delete via
|
|
25
|
+
* `git push <arbiter> --delete <branch>`; else retain with a reason.
|
|
26
|
+
*/
|
|
27
|
+
export function sweepRemoteMergedBranches(input) {
|
|
28
|
+
const note = input.note ?? (() => { });
|
|
29
|
+
const env = input.env;
|
|
30
|
+
const dryRun = input.dryRun === true;
|
|
31
|
+
const reaped = [];
|
|
32
|
+
const retained = [];
|
|
33
|
+
const wouldReap = [];
|
|
34
|
+
const branches = listRemoteWorkBranches(input.cwd, input.arbiter, env);
|
|
35
|
+
// Resolve the arbiter's main tip LOCALLY (fetch it into a scratch tracking
|
|
36
|
+
// ref). If it cannot be resolved (unreachable arbiter / no main), we cannot
|
|
37
|
+
// PROVE any branch merged — retain everything (the safe direction).
|
|
38
|
+
const mainRef = fetchScratch(input.cwd, input.arbiter, 'main', env);
|
|
39
|
+
for (const { branch, tip } of branches) {
|
|
40
|
+
if (mainRef === undefined) {
|
|
41
|
+
retain(retained, note, branch, tip, 'main-unresolved');
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Make the candidate tip OBJECT readable locally so `merge-base` can use it
|
|
45
|
+
// (ls-remote gave us the sha, but the object may not be in the local repo).
|
|
46
|
+
fetchScratch(input.cwd, input.arbiter, branch, env);
|
|
47
|
+
if (!isAncestor(input.cwd, tip, mainRef, env)) {
|
|
48
|
+
// NOT an ancestor of main ⇒ still in-flight ⇒ NEVER delete (the invariant).
|
|
49
|
+
retain(retained, note, branch, tip, 'not-merged');
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// Provably merged. Report (dry-run) or delete (the real sweep). Deletion of
|
|
53
|
+
// a fully-merged ref needs NO force — and we NEVER force here. The deletion
|
|
54
|
+
// is WRITE-THROUGH: drop the LOCAL tracking ref FIRST, THEN `git push
|
|
55
|
+
// --delete`. An arbiter-delete failure thus leaves the local store BEHIND
|
|
56
|
+
// (self-healing on next fetch), never AHEAD (a stale tracking ref that
|
|
57
|
+
// drives a wrong "continue" — the permanent stale-continue bug today's
|
|
58
|
+
// arbiter-first ordering creates).
|
|
59
|
+
if (dryRun) {
|
|
60
|
+
wouldReap.push({ branch, tip });
|
|
61
|
+
note(`Would reap ${branch} (merged) on ${input.arbiter}.`);
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
run('git', ['update-ref', '-d', `refs/remotes/${input.arbiter}/${branch}`], input.cwd, { env });
|
|
65
|
+
const del = run('git', ['push', input.arbiter, '--delete', branch], input.cwd, { env });
|
|
66
|
+
if (del.status !== 0) {
|
|
67
|
+
// A failed delete is NOT a reap; surface it but keep sweeping the rest.
|
|
68
|
+
// Tolerate "already gone" (a concurrent reap) as a clean delete.
|
|
69
|
+
const stderr = del.stderr.trim();
|
|
70
|
+
const alreadyGone = /remote ref does not exist|unable to delete/i.test(stderr);
|
|
71
|
+
if (alreadyGone) {
|
|
72
|
+
reaped.push({ branch, tip });
|
|
73
|
+
note(`Reaped ${branch} (merged; remote ref was already gone).`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
retain(retained, note, branch, tip, 'not-merged');
|
|
77
|
+
note(`Failed to delete ${branch} on ${input.arbiter} (${stderr || 'unknown error'}); kept.`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
reaped.push({ branch, tip });
|
|
81
|
+
note(`Reaped ${branch} (merged) on ${input.arbiter}.`);
|
|
82
|
+
}
|
|
83
|
+
return { reaped, retained, wouldReap };
|
|
84
|
+
}
|
|
85
|
+
/** Push a retained branch into the result + emit its note. */
|
|
86
|
+
function retain(retained, note, branch, tip, reason) {
|
|
87
|
+
const reasonText = REMOTE_RETAIN_REASON_TEXT[reason];
|
|
88
|
+
retained.push({ branch, tip, reason, reasonText });
|
|
89
|
+
note(`Retained ${branch}: ${reasonText}.`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Enumerate the arbiter's remote `work/*` heads + their tips via
|
|
93
|
+
* `git ls-remote --heads <arbiter> 'work/*'` (one round-trip, no full fetch).
|
|
94
|
+
* Only `work/<type>-<slug>` branches that {@link parseWorkBranchRef} recognises
|
|
95
|
+
* are returned (a stray `work/foo` that is not a namespaced work branch is
|
|
96
|
+
* ignored — the sweep only reaps the branches the protocol creates). Returns []
|
|
97
|
+
* when the arbiter is unreachable (the safe direction — nothing to reap).
|
|
98
|
+
*/
|
|
99
|
+
export function listRemoteWorkBranches(cwd, arbiter, env) {
|
|
100
|
+
const res = run('git', ['ls-remote', '--heads', arbiter, 'work/*'], cwd, {
|
|
101
|
+
env,
|
|
102
|
+
});
|
|
103
|
+
if (res.status !== 0) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const out = [];
|
|
107
|
+
for (const line of res.stdout.split('\n')) {
|
|
108
|
+
const trimmed = line.trim();
|
|
109
|
+
if (trimmed === '') {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Each line is `<sha>\trefs/heads/<branch>`.
|
|
113
|
+
const m = /^([0-9a-f]{40})\s+refs\/heads\/(.+)$/.exec(trimmed);
|
|
114
|
+
if (!m) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const tip = m[1];
|
|
118
|
+
const branch = m[2];
|
|
119
|
+
// Only namespaced work branches (`work/<type>-<slug>`) — the protocol's own
|
|
120
|
+
// branches. A non-conforming `work/...` head is left untouched.
|
|
121
|
+
if (parseWorkBranchRef(branch) === undefined) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
out.push({ branch, tip });
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Fetch a single arbiter head into a SCRATCH remote-tracking ref
|
|
130
|
+
* (`refs/remotes/<arbiter>/<head>`) EXPLICITLY (a bare arbiter has no fetch
|
|
131
|
+
* refspec), so the object + ref resolve LOCALLY for the ancestor check. Returns
|
|
132
|
+
* the local ref name on success, or `undefined` when the head could not be
|
|
133
|
+
* fetched (unreachable arbiter / missing head) — the caller reads that as
|
|
134
|
+
* not-provable ⇒ retain (the safe direction). Best-effort; never throws.
|
|
135
|
+
*/
|
|
136
|
+
function fetchScratch(cwd, arbiter, head, env) {
|
|
137
|
+
const localRef = `refs/remotes/${arbiter}/${head}`;
|
|
138
|
+
const res = run('git', ['fetch', '--quiet', arbiter, `+refs/heads/${head}:${localRef}`], cwd, { env });
|
|
139
|
+
if (res.status !== 0) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
// Confirm the ref now resolves locally (an empty/odd fetch should read as
|
|
143
|
+
// unresolved → retain).
|
|
144
|
+
const verify = run('git', ['rev-parse', '--verify', '--quiet', localRef], cwd, {
|
|
145
|
+
env,
|
|
146
|
+
});
|
|
147
|
+
return verify.status === 0 ? localRef : undefined;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=reap-branches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reap-branches.js","sourceRoot":"","sources":["../src/reap-branches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { IntegrationMode } from './config.js';
|
|
2
|
+
import type { ReviewProvider } from './integrator.js';
|
|
3
|
+
export type RecoverIsolatedOutcome = 'completed' | 'already-integrated' | 'nothing-to-recover' | 'rebase-conflict' | 'usage-error';
|
|
4
|
+
export interface RecoverIsolatedOptions {
|
|
5
|
+
/** The slug to recover (its retained worktree is located by arbiter-URL + slug). */
|
|
6
|
+
slug: string;
|
|
7
|
+
/** The operator's checkout — its arbiter remote names the repo the worktree is off. */
|
|
8
|
+
cwd: string;
|
|
9
|
+
/** Name of the arbiter remote in {@link cwd}. Defaults to `origin`. */
|
|
10
|
+
arbiter?: string;
|
|
11
|
+
/** The execution working area (config `workspacesDir`); where job worktrees live. */
|
|
12
|
+
workspacesDir: string;
|
|
13
|
+
/** Integration mode: `propose` (default) or `merge`. */
|
|
14
|
+
integration?: IntegrationMode;
|
|
15
|
+
/** Suppress the PR on the propose path (push the branch, open no review request). */
|
|
16
|
+
noPR?: boolean;
|
|
17
|
+
/** Optional fully-formed provider used verbatim (test/embedding seam). */
|
|
18
|
+
providerInstance?: ReviewProvider;
|
|
19
|
+
/** Optional injectable PR opener (legacy bridge); used in `propose` mode. */
|
|
20
|
+
openPr?: (opts: {
|
|
21
|
+
cwd: string;
|
|
22
|
+
branch: string;
|
|
23
|
+
env?: NodeJS.ProcessEnv;
|
|
24
|
+
}) => void;
|
|
25
|
+
/** Environment for child git/provider processes (the identity-scoped env). */
|
|
26
|
+
env?: NodeJS.ProcessEnv;
|
|
27
|
+
/** Sink for human-readable progress notes. */
|
|
28
|
+
note?: (message: string) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface RecoverIsolatedResult {
|
|
31
|
+
exitCode: 0 | 1;
|
|
32
|
+
outcome: RecoverIsolatedOutcome;
|
|
33
|
+
/** The work branch that was recovered, when a worktree was located. */
|
|
34
|
+
branch?: string;
|
|
35
|
+
/** The retained worktree dir that was recovered from, when located. */
|
|
36
|
+
worktree?: string;
|
|
37
|
+
/** The review-request URL opened in propose mode, when a provider opened one. */
|
|
38
|
+
prUrl?: string;
|
|
39
|
+
/** Human-readable summary of the terminal condition. */
|
|
40
|
+
message: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The LOCATE-EXISTING resolver shared by `complete --isolated` and
|
|
44
|
+
* `resume --isolated`: resolve the arbiter URL from the operator's checkout, then
|
|
45
|
+
* the slug's retained job-worktree dir via `jobWorktreePath` (arbiter-URL-keyed —
|
|
46
|
+
* NOT a slug glob). Returns the resolved dir + arbiter URL when the worktree is
|
|
47
|
+
* PRESENT; an `error` (usage) when the arbiter is unresolvable; or
|
|
48
|
+
* `{present: false}` when no worktree is retained (the clean nothing-to-recover
|
|
49
|
+
* case). Pure resolution — no side effects.
|
|
50
|
+
*/
|
|
51
|
+
export declare function locateIsolatedRecovery(params: {
|
|
52
|
+
slug: string;
|
|
53
|
+
cwd: string;
|
|
54
|
+
arbiter: string;
|
|
55
|
+
workspacesDir: string;
|
|
56
|
+
env?: NodeJS.ProcessEnv;
|
|
57
|
+
}): {
|
|
58
|
+
dir: string;
|
|
59
|
+
arbiterUrl: string;
|
|
60
|
+
present: true;
|
|
61
|
+
} | {
|
|
62
|
+
present: false;
|
|
63
|
+
} | {
|
|
64
|
+
error: string;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Run the isolated recovery for a stranded, already-committed, already-done-moved
|
|
68
|
+
* worktree (the `complete --isolated <slug>` surface). Never throws for the
|
|
69
|
+
* expected cases — they are returned with a specific outcome + exit code.
|
|
70
|
+
*/
|
|
71
|
+
export declare function performRecoverIsolated(options: RecoverIsolatedOptions): Promise<RecoverIsolatedResult>;
|
|
72
|
+
//# sourceMappingURL=recover-isolated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-isolated.d.ts","sourceRoot":"","sources":["../src/recover-isolated.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,iBAAiB,CAAC;AA8BpD,MAAM,MAAM,sBAAsB,GAC/B,WAAW,GACX,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,aAAa,CAAC;AAEjB,MAAM,WAAW,sBAAsB;IACtC,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,qFAAqF;IACrF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;KACxB,KAAK,IAAI,CAAC;IACX,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,EAAE,sBAAsB,CAAC;IAChC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GACE;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAC,GAChD;IAAC,OAAO,EAAE,KAAK,CAAA;CAAC,GAChB;IACA,KAAK,EAAE,MAAM,CAAC;CACb,CAmBH;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,CA2GhC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { performIntegration } from './integration-core.js';
|
|
3
|
+
import { resolveArbiterUrlFromCheckout } from './do.js';
|
|
4
|
+
import { jobWorktreePath } from './workspace.js';
|
|
5
|
+
import { mirrorPath } from './repo-mirror.js';
|
|
6
|
+
import { reapJob } from './gc.js';
|
|
7
|
+
import { workBranchRef } from './slug-namespace.js';
|
|
8
|
+
import { run } from './git.js';
|
|
9
|
+
/**
|
|
10
|
+
* **`complete --isolated <slug>` — FINISH an already-committed, already-done-moved
|
|
11
|
+
* STRANDED isolated worktree** (prd `ledger-integrity` story 6, the
|
|
12
|
+
* `finish-already-committed-branch` task). The LOCATE-EXISTING inverse of
|
|
13
|
+
* `do --isolated` (which CREATES a worktree): it resolves the slug's RETAINED job
|
|
14
|
+
* worktree via the existing arbiter-URL-keyed naming
|
|
15
|
+
* (`jobWorktreePath`/`encodeWorkId` — NOT a slug glob, since two repos can share a
|
|
16
|
+
* slug), then runs the recover-already-committed integration path
|
|
17
|
+
* (`performIntegration({committedRecovery: true})`) from it: rebase the kept
|
|
18
|
+
* commit onto `<arbiter>/main` → integrate, SKIPPING the (already-done) gate /
|
|
19
|
+
* done-move / commit.
|
|
20
|
+
*
|
|
21
|
+
* IDEMPOTENT / HONEST: when NO worktree is retained for the slug, this is a clean
|
|
22
|
+
* "nothing to recover / already integrated" no-op (exit 0, no crash, no fresh
|
|
23
|
+
* worktree) — after a successful recovery the worktree is reaped, so a re-run
|
|
24
|
+
* correctly finds nothing. The integration core's own UNSPOOFABLE detection
|
|
25
|
+
* (`already-integrated`) covers the case where the worktree still exists but its
|
|
26
|
+
* tip is already on the arbiter (never a double-integrate).
|
|
27
|
+
*
|
|
28
|
+
* `resume --isolated <slug>` shares the SAME locate-existing resolver (see
|
|
29
|
+
* {@link locateIsolatedRecovery}) to re-engage the retained worktree WITHOUT
|
|
30
|
+
* claiming — it just reports the worktree path for the operator to cd into.
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_ARBITER = 'origin';
|
|
33
|
+
/** The arbiter remote name valid INSIDE a job worktree (cut from the bare hub mirror). */
|
|
34
|
+
const WORKTREE_ARBITER_REMOTE = 'origin';
|
|
35
|
+
/**
|
|
36
|
+
* The LOCATE-EXISTING resolver shared by `complete --isolated` and
|
|
37
|
+
* `resume --isolated`: resolve the arbiter URL from the operator's checkout, then
|
|
38
|
+
* the slug's retained job-worktree dir via `jobWorktreePath` (arbiter-URL-keyed —
|
|
39
|
+
* NOT a slug glob). Returns the resolved dir + arbiter URL when the worktree is
|
|
40
|
+
* PRESENT; an `error` (usage) when the arbiter is unresolvable; or
|
|
41
|
+
* `{present: false}` when no worktree is retained (the clean nothing-to-recover
|
|
42
|
+
* case). Pure resolution — no side effects.
|
|
43
|
+
*/
|
|
44
|
+
export function locateIsolatedRecovery(params) {
|
|
45
|
+
const arbiterUrl = resolveArbiterUrlFromCheckout(params.cwd, params.arbiter, params.env);
|
|
46
|
+
if (arbiterUrl === undefined) {
|
|
47
|
+
return {
|
|
48
|
+
error: `--isolated finishes a worktree off this repo's arbiter (inferred from ` +
|
|
49
|
+
`cwd), but no '${params.arbiter}' remote was found here (is this a git ` +
|
|
50
|
+
`repo? does the '${params.arbiter}' remote exist?).`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const dir = jobWorktreePath(params.workspacesDir, arbiterUrl, params.slug);
|
|
54
|
+
if (!existsSync(dir)) {
|
|
55
|
+
return { present: false };
|
|
56
|
+
}
|
|
57
|
+
return { dir, arbiterUrl, present: true };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Run the isolated recovery for a stranded, already-committed, already-done-moved
|
|
61
|
+
* worktree (the `complete --isolated <slug>` surface). Never throws for the
|
|
62
|
+
* expected cases — they are returned with a specific outcome + exit code.
|
|
63
|
+
*/
|
|
64
|
+
export async function performRecoverIsolated(options) {
|
|
65
|
+
const note = options.note ?? (() => { });
|
|
66
|
+
const env = options.env;
|
|
67
|
+
const arbiter = options.arbiter ?? DEFAULT_ARBITER;
|
|
68
|
+
const located = locateIsolatedRecovery({
|
|
69
|
+
slug: options.slug,
|
|
70
|
+
cwd: options.cwd,
|
|
71
|
+
arbiter,
|
|
72
|
+
workspacesDir: options.workspacesDir,
|
|
73
|
+
env,
|
|
74
|
+
});
|
|
75
|
+
if ('error' in located) {
|
|
76
|
+
return { exitCode: 1, outcome: 'usage-error', message: located.error };
|
|
77
|
+
}
|
|
78
|
+
if (!located.present) {
|
|
79
|
+
// No retained worktree — honest no-op: nothing to recover (already
|
|
80
|
+
// integrated + reaped, or never stranded). No crash, NO fresh worktree.
|
|
81
|
+
const message = `Nothing to recover for '${options.slug}': no retained isolated worktree ` +
|
|
82
|
+
'found (already integrated and reaped, or never stranded).';
|
|
83
|
+
note(message);
|
|
84
|
+
return { exitCode: 0, outcome: 'nothing-to-recover', message };
|
|
85
|
+
}
|
|
86
|
+
const dir = located.dir;
|
|
87
|
+
const branch = workBranchRef('task', options.slug);
|
|
88
|
+
// The strand left the worktree ON its `work/<slug>` branch; make sure we are on
|
|
89
|
+
// it (it carries the kept committed work + the done-move). Best-effort: if HEAD
|
|
90
|
+
// is already there this is a no-op; a missing branch surfaces as a usage error
|
|
91
|
+
// from the integration core's HEAD-resolution.
|
|
92
|
+
gitSoft(['switch', '--quiet', branch], dir, env);
|
|
93
|
+
note(`Recovering '${options.slug}' from the retained worktree ${dir}…`);
|
|
94
|
+
const core = await performIntegration({
|
|
95
|
+
cwd: dir,
|
|
96
|
+
// Inside a job worktree the arbiter remote is `origin` (the mirror's clone
|
|
97
|
+
// remote), NOT the operator's checkout arbiter name.
|
|
98
|
+
arbiter: WORKTREE_ARBITER_REMOTE,
|
|
99
|
+
slug: options.slug,
|
|
100
|
+
branch,
|
|
101
|
+
source: 'in-progress',
|
|
102
|
+
recovering: false,
|
|
103
|
+
committedRecovery: true,
|
|
104
|
+
mode: options.integration ?? 'propose',
|
|
105
|
+
noPR: options.noPR,
|
|
106
|
+
providerInstance: options.providerInstance,
|
|
107
|
+
openPr: options.openPr,
|
|
108
|
+
env,
|
|
109
|
+
note,
|
|
110
|
+
});
|
|
111
|
+
if (core.outcome === 'already-integrated') {
|
|
112
|
+
// The kept tip is already on the arbiter — a clean no-op. Reap the now-redundant
|
|
113
|
+
// worktree (its branch is provably on the arbiter), so a re-run finds nothing.
|
|
114
|
+
reapIfSafe(options.workspacesDir, located.arbiterUrl, branch, dir, env);
|
|
115
|
+
return {
|
|
116
|
+
exitCode: 0,
|
|
117
|
+
outcome: 'already-integrated',
|
|
118
|
+
branch,
|
|
119
|
+
worktree: dir,
|
|
120
|
+
message: core.reason ?? `'${options.slug}' is already integrated.`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (core.outcome === 'rebase-conflict') {
|
|
124
|
+
// A genuine code conflict — the kept commit stays intact on the branch
|
|
125
|
+
// (recoverable); the operator resolves it and re-runs. Worktree RETAINED.
|
|
126
|
+
return {
|
|
127
|
+
exitCode: 1,
|
|
128
|
+
outcome: 'rebase-conflict',
|
|
129
|
+
branch,
|
|
130
|
+
worktree: dir,
|
|
131
|
+
message: core.reason ?? `recovering '${options.slug}' hit a rebase conflict.`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (core.outcome === 'completed') {
|
|
135
|
+
// Integrated from the kept commit. The work is now on the arbiter, so the
|
|
136
|
+
// worktree is provably redundant — reap it (the same §4 predicate the build
|
|
137
|
+
// teardown uses; never lose work — reachability still gates).
|
|
138
|
+
reapIfSafe(options.workspacesDir, located.arbiterUrl, branch, dir, env);
|
|
139
|
+
const prUrl = core.integration?.url;
|
|
140
|
+
const message = prUrl
|
|
141
|
+
? `Recovered '${options.slug}': integrated the kept commit (${prUrl}).`
|
|
142
|
+
: `Recovered '${options.slug}': integrated the kept commit from ${branch}.`;
|
|
143
|
+
note(message);
|
|
144
|
+
return {
|
|
145
|
+
exitCode: 0,
|
|
146
|
+
outcome: 'completed',
|
|
147
|
+
branch,
|
|
148
|
+
worktree: dir,
|
|
149
|
+
prUrl,
|
|
150
|
+
message,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Any other core outcome (defensive — committed-recovery only returns the three
|
|
154
|
+
// above): surface it as a usage error rather than mis-reporting success.
|
|
155
|
+
return {
|
|
156
|
+
exitCode: 1,
|
|
157
|
+
outcome: 'usage-error',
|
|
158
|
+
branch,
|
|
159
|
+
worktree: dir,
|
|
160
|
+
message: core.reason ??
|
|
161
|
+
`recovering '${options.slug}' returned an unexpected outcome ` +
|
|
162
|
+
`'${core.outcome}'.`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Reap the recovered worktree iff its branch is provably on the arbiter (the §4
|
|
167
|
+
* predicate, reachable-only so incidental churn does not retain a worktree whose
|
|
168
|
+
* branch is already safe). Best-effort: never throws on this success path.
|
|
169
|
+
*/
|
|
170
|
+
function reapIfSafe(workspacesDir, arbiterUrl, branch, dir, env) {
|
|
171
|
+
try {
|
|
172
|
+
reapJob({
|
|
173
|
+
dir,
|
|
174
|
+
branch,
|
|
175
|
+
mirrorPath: mirrorPath(workspacesDir, arbiterUrl),
|
|
176
|
+
reachableOnly: true,
|
|
177
|
+
env,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// best-effort — the work is already on the arbiter; a reap failure is cosmetic.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** Run git, returning the raw result (no throw) — for soft checks. */
|
|
185
|
+
function gitSoft(args, cwd, env) {
|
|
186
|
+
return run('git', args, cwd, { env });
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=recover-isolated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recover-isolated.js","sourceRoot":"","sources":["../src/recover-isolated.ts"],"names":[],"mappings":"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"}
|