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,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CI CLOSE-JOB driver (prd `runner-in-ci`, capability E; task
|
|
3
|
+
* `install-ci-close-job-workflow`). When work lands on `main`, this resolves which
|
|
4
|
+
* source issue(s) the landed work closes and closes them — but it OWNS none of the
|
|
5
|
+
* machinery it relies on. It is the thin JOB that WIRES three UNCHANGED engine
|
|
6
|
+
* pieces together (the Out-of-Scope fence: do NOT re-build them):
|
|
7
|
+
*
|
|
8
|
+
* - the RESOLUTION — {@link resolveClosingIssue} (`frontmatter.ts`): an artifact
|
|
9
|
+
* uses `issue:` XOR `prd:`; a lone task closes its own `issue:` directly, a
|
|
10
|
+
* fanned task reaches the number via `task.prd: → work/prds/<prd>.md prd
|
|
11
|
+
* issue:`, and `prd:` WINS on a (hand-edited) conflict;
|
|
12
|
+
* - the QUERY — {@link isSpecComplete} (`spec-complete.ts`, task
|
|
13
|
+
* `prd-complete-query`, done): a spec is COMPLETE iff ≥1 `spec:<slug>` task AND
|
|
14
|
+
* all such tasks are in `work/done/`;
|
|
15
|
+
* - the CLOSE — {@link IssueProvider.closeIssue} (`issue-provider.ts`, the atomic
|
|
16
|
+
* comment+close seam intake already uses): NO direct `gh` in this core; any
|
|
17
|
+
* informational comment rides the SAME close call (never the PR seam
|
|
18
|
+
* `postPRComment`).
|
|
19
|
+
*
|
|
20
|
+
* The closure conditions, per artifact kind:
|
|
21
|
+
*
|
|
22
|
+
* - a **lone task** (`issue:`, no `prd:`) that resides in `work/done/` — its PR
|
|
23
|
+
* merged, so its own issue closes (reason `completed`);
|
|
24
|
+
* - a **prd** (`issue:`) — closes ONLY when {@link isSpecComplete} says ALL its
|
|
25
|
+
* `spec:<slug>` tasks are in `work/done/` (reason `completed`).
|
|
26
|
+
*
|
|
27
|
+
* A prd whose query is NOT yet complete is left OPEN (the final fanned task's
|
|
28
|
+
* merge tick closes it). A lone task still outside `work/done/` is skipped. The
|
|
29
|
+
* close DEGRADES (never throws) on a missing/unauthenticated provider, exactly
|
|
30
|
+
* like intake's bounce close — the run reports the real cause and stays exit-0.
|
|
31
|
+
*
|
|
32
|
+
* This is the JOB the close-job WORKFLOW (capability E) invokes via
|
|
33
|
+
* `dorfl close-merged-issues`; the workflow is triggered on a merge to
|
|
34
|
+
* `main` (`push: {branches: [main]}`). The driver itself is provider-pluggable
|
|
35
|
+
* (it takes an {@link IssueProvider}) and reads only the `work/` tree.
|
|
36
|
+
*/
|
|
37
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
38
|
+
import { basename, join } from 'node:path';
|
|
39
|
+
import { TASK_LIFECYCLE_FOLDERS, SPEC_FOLDERS, workFolderPath, workItemRel, isWorkItemFile, } from './work-layout.js';
|
|
40
|
+
import { parseFrontmatter, resolveClosingIssue } from './frontmatter.js';
|
|
41
|
+
import { isSpecComplete } from './spec-complete.js';
|
|
42
|
+
import { GitHubIssueProvider, } from './issue-provider.js';
|
|
43
|
+
/** The task lifecycle folders a lone-task `issue:` can reside in. */
|
|
44
|
+
const TASK_FOLDERS = TASK_LIFECYCLE_FOLDERS;
|
|
45
|
+
/** The spec folders an `issue:`-bearing spec can reside in. */
|
|
46
|
+
const SPEC_LIFECYCLE_FOLDERS = SPEC_FOLDERS;
|
|
47
|
+
/** List the `.md` filenames in `<repoPath>/work/<folder>/`, sorted; `[]` if absent. */
|
|
48
|
+
function listMarkdown(repoPath, folder) {
|
|
49
|
+
const dir = workFolderPath(repoPath, folder);
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = readdirSync(dir);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
return entries.filter((name) => isWorkItemFile(name)).sort();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Read a prd's `issue:` number by slug, scanning the prd folders. Returns
|
|
61
|
+
* `undefined` when no prd with that slug carries an `issue:` (a prd with no source
|
|
62
|
+
* issue, or a typo'd `prd:` hop — degrades to "no issue to close", never crashes).
|
|
63
|
+
*/
|
|
64
|
+
function specIssueNumber(repoPath, specSlug) {
|
|
65
|
+
for (const folder of SPEC_LIFECYCLE_FOLDERS) {
|
|
66
|
+
for (const file of listMarkdown(repoPath, folder)) {
|
|
67
|
+
const fm = parseFrontmatter(readFileSync(join(repoPath, workItemRel(folder, file)), 'utf8'));
|
|
68
|
+
const slug = fm.slug ?? basename(file, '.md');
|
|
69
|
+
if (slug === specSlug && fm.issue !== undefined) {
|
|
70
|
+
return fm.issue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve the DEDUPLICATED set of closure candidates from the `work/` tree, each
|
|
78
|
+
* via the UNCHANGED {@link resolveClosingIssue}:
|
|
79
|
+
*
|
|
80
|
+
* - every prd carrying `issue:` (in `work/prds/ready/` or `work/prds/tasked/`) is a
|
|
81
|
+
* prd-kind candidate keyed on its own `prd:` query;
|
|
82
|
+
* - every LONE task (`issue:` and NO `prd:`) is an `issue`-kind candidate.
|
|
83
|
+
*
|
|
84
|
+
* A fanned task carries `prd:` (NOT its own `issue:`), so it reaches the number
|
|
85
|
+
* through its prd's candidate, never as its own — the issue number lives ONLY on
|
|
86
|
+
* the prd. Deduplicated by issue number: a prd enumerated once even though many
|
|
87
|
+
* tasks point at it. Prd candidates are listed before lone-task candidates, each
|
|
88
|
+
* group slug-sorted, for a deterministic log.
|
|
89
|
+
*/
|
|
90
|
+
function resolveCandidates(repoPath) {
|
|
91
|
+
const seen = new Set();
|
|
92
|
+
const specCandidates = [];
|
|
93
|
+
const taskCandidates = [];
|
|
94
|
+
// Spec candidates: a spec's `issue:` closes when ITS query is complete.
|
|
95
|
+
for (const folder of SPEC_LIFECYCLE_FOLDERS) {
|
|
96
|
+
for (const file of listMarkdown(repoPath, folder)) {
|
|
97
|
+
const fm = parseFrontmatter(readFileSync(join(repoPath, workItemRel(folder, file)), 'utf8'));
|
|
98
|
+
const slug = fm.slug ?? basename(file, '.md');
|
|
99
|
+
const closing = resolveClosingIssue(fm);
|
|
100
|
+
// A prd's own closing link is its `issue:` (a prd has no `prd:`); on the
|
|
101
|
+
// hand-edit conflict `prd:` wins via resolveClosingIssue, so only a true
|
|
102
|
+
// `issue:`-bearing prd becomes a candidate here.
|
|
103
|
+
if (closing?.via === 'issue' && !seen.has(closing.issue)) {
|
|
104
|
+
seen.add(closing.issue);
|
|
105
|
+
specCandidates.push({ issueNumber: closing.issue, via: 'spec', slug });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Lone-task candidates: a task with `issue:` and NO `prd:` closes its OWN
|
|
110
|
+
// issue directly when it lands in work/done/.
|
|
111
|
+
for (const folder of TASK_FOLDERS) {
|
|
112
|
+
for (const file of listMarkdown(repoPath, folder)) {
|
|
113
|
+
const fm = parseFrontmatter(readFileSync(join(repoPath, workItemRel(folder, file)), 'utf8'));
|
|
114
|
+
const slug = fm.slug ?? basename(file, '.md');
|
|
115
|
+
const closing = resolveClosingIssue(fm);
|
|
116
|
+
// `resolveClosingIssue` returns `via: 'issue'` ONLY when there is no `prd:`
|
|
117
|
+
// (prd wins on conflict), so a fanned task never lands here — it reaches
|
|
118
|
+
// its issue through the prd candidate above.
|
|
119
|
+
if (closing?.via === 'issue' && !seen.has(closing.issue)) {
|
|
120
|
+
seen.add(closing.issue);
|
|
121
|
+
taskCandidates.push({ issueNumber: closing.issue, via: 'issue', slug });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
specCandidates.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
126
|
+
taskCandidates.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
127
|
+
return [...specCandidates, ...taskCandidates];
|
|
128
|
+
}
|
|
129
|
+
/** True iff the lone task with this slug resides in `work/done/`. */
|
|
130
|
+
function loneTaskLanded(repoPath, taskSlug) {
|
|
131
|
+
for (const file of listMarkdown(repoPath, 'done')) {
|
|
132
|
+
const fm = parseFrontmatter(readFileSync(join(repoPath, workItemRel('done', file)), 'utf8'));
|
|
133
|
+
const slug = fm.slug ?? basename(file, '.md');
|
|
134
|
+
if (slug === taskSlug) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
/** The closing comment posted (atomically, on the close call) for each kind. */
|
|
141
|
+
function closeComment(via, slug) {
|
|
142
|
+
return via === 'spec'
|
|
143
|
+
? `Closed by dorfl: every task of spec \`${slug}\` has landed in \`work/done/\`.`
|
|
144
|
+
: `Closed by dorfl: the task \`${slug}\` has landed in \`work/done/\`.`;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Run the close-job over a repo's `work/` tree: resolve the closure candidates,
|
|
148
|
+
* apply the per-kind closure condition (a landed lone task; a prd whose
|
|
149
|
+
* {@link isSpecComplete} query holds), and close the qualifying issues through the
|
|
150
|
+
* {@link IssueProvider.closeIssue} seam (reason `completed`, an informational
|
|
151
|
+
* comment riding the SAME atomic close). REUSES the unchanged resolution + query +
|
|
152
|
+
* close — it re-implements NONE of them. NEVER throws: a degraded provider close
|
|
153
|
+
* is reported as `close-failed`, not a crash (the terminal CI tick stays exit-0).
|
|
154
|
+
*/
|
|
155
|
+
export async function runCloseJob(options) {
|
|
156
|
+
const { repoPath, issueProvider, env } = options;
|
|
157
|
+
const candidates = [];
|
|
158
|
+
const closed = [];
|
|
159
|
+
const completedReason = 'completed';
|
|
160
|
+
for (const cand of resolveCandidates(repoPath)) {
|
|
161
|
+
// The closure CONDITION per kind — the only place this job decides; the
|
|
162
|
+
// computation of "complete" / "landed" is the UNCHANGED engine query.
|
|
163
|
+
let shouldClose;
|
|
164
|
+
let notReady;
|
|
165
|
+
if (cand.via === 'spec') {
|
|
166
|
+
shouldClose = isSpecComplete({ repoPath, slug: cand.slug }).complete;
|
|
167
|
+
notReady = 'not-complete';
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
shouldClose = loneTaskLanded(repoPath, cand.slug);
|
|
171
|
+
notReady = 'not-landed';
|
|
172
|
+
}
|
|
173
|
+
if (!shouldClose) {
|
|
174
|
+
candidates.push({
|
|
175
|
+
issueNumber: cand.issueNumber,
|
|
176
|
+
via: cand.via,
|
|
177
|
+
slug: cand.slug,
|
|
178
|
+
decision: notReady,
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// CLOSE via the provider seam (NO direct `gh`): comment + reason + close in
|
|
183
|
+
// ONE atomic call, exactly the seam intake's bounce uses.
|
|
184
|
+
const result = await issueProvider.closeIssue({
|
|
185
|
+
cwd: repoPath,
|
|
186
|
+
issueNumber: cand.issueNumber,
|
|
187
|
+
comment: closeComment(cand.via, cand.slug),
|
|
188
|
+
reason: completedReason,
|
|
189
|
+
env,
|
|
190
|
+
});
|
|
191
|
+
if (result.closed) {
|
|
192
|
+
closed.push(cand.issueNumber);
|
|
193
|
+
candidates.push({
|
|
194
|
+
issueNumber: cand.issueNumber,
|
|
195
|
+
via: cand.via,
|
|
196
|
+
slug: cand.slug,
|
|
197
|
+
decision: 'closed',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
candidates.push({
|
|
202
|
+
issueNumber: cand.issueNumber,
|
|
203
|
+
via: cand.via,
|
|
204
|
+
slug: cand.slug,
|
|
205
|
+
decision: 'close-failed',
|
|
206
|
+
reason: result.reason ?? result.instruction,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return { candidates, closed };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The CLI entry the close-job WORKFLOW invokes (`dorfl
|
|
214
|
+
* close-merged-issues`): construct the GitHub issue provider and run the
|
|
215
|
+
* close-job over the checkout's `work/` tree. Provider-pluggable via
|
|
216
|
+
* {@link runCloseJob}; this wrapper only picks the default (GitHub) adapter.
|
|
217
|
+
*/
|
|
218
|
+
export async function performCloseMergedIssues(options) {
|
|
219
|
+
const issueProvider = new GitHubIssueProvider({ ghBin: options.ghBin });
|
|
220
|
+
return runCloseJob({
|
|
221
|
+
repoPath: options.repoPath,
|
|
222
|
+
issueProvider,
|
|
223
|
+
env: options.env,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=close-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-job.js","sourceRoot":"","sources":["../src/close-job.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import type { VerifyConfig } from './verify.js';
|
|
2
|
+
import type { ReviewGate } from './review-gate.js';
|
|
3
|
+
import { synthesiseProposeTitle, composeProposeBody, PR_TITLE_MAX } from './integration-core.js';
|
|
4
|
+
import type { ReviewProvider } from './integrator.js';
|
|
5
|
+
import type { IntegrationMode } from './config.js';
|
|
6
|
+
export { synthesiseProposeTitle, composeProposeBody, PR_TITLE_MAX };
|
|
7
|
+
/**
|
|
8
|
+
* `dorfl complete [<slug>] [--skip-verify] [--type <t>] [--message <s>]
|
|
9
|
+
* [--arbiter <remote>]` — the human "finish this" command that runs the same
|
|
10
|
+
* back-half the autonomous runner runs: gate → mark done → commit → integrate.
|
|
11
|
+
*
|
|
12
|
+
* It runs on a `work/<slug>` branch (slug inferred from the branch if omitted).
|
|
13
|
+
* The build agent leaves its work UNCOMMITTED (it does no git), so `complete`
|
|
14
|
+
* `git add -A`s the agent's work AND the done-move into ONE atomic commit. This
|
|
15
|
+
* is the same finish/integration logic `run-once`/`watch` reuse; here it is
|
|
16
|
+
* human-driven and so allows a `--skip-verify` escape hatch the autonomous
|
|
17
|
+
* runner never uses (ADR §8).
|
|
18
|
+
*
|
|
19
|
+
* The item's SOURCE folder is normally `work/tasks/ready/` (the pool — claim
|
|
20
|
+
* leaves the body there, task
|
|
21
|
+
* `cutover-claim-body-stays-and-complete-sources-from-backlog`). A RUNNER-OWNED
|
|
22
|
+
* RECOVERY of a SPURIOUSLY-stuck item (env-polluted gate, transient flake,
|
|
23
|
+
* since-fixed cause) sources from the SAME pool location: the per-item-lock
|
|
24
|
+
* cutover (`cutover-needs-attention-becomes-lock-stuck-recovery-surface`)
|
|
25
|
+
* retired the `work/needs-attention/` folder — stuck is the lock `state: stuck`
|
|
26
|
+
* and the body stays in `tasks/ready/` while claimed, so a recovery `complete`
|
|
27
|
+
* is structurally a normal build. The gate is RE-RUN and authoritative (only a
|
|
28
|
+
* GREEN re-gate completes; a still-red item stays stuck on the lock).
|
|
29
|
+
* `--skip-verify` stays the only, human-only, loud override.
|
|
30
|
+
*
|
|
31
|
+
* The integration step is split by mode (config `integration`, ADR §6):
|
|
32
|
+
* merge — push the rebased branch to `<arbiter>/main`, then sync the LOCAL
|
|
33
|
+
* clone to that new main (the push is authoritative; the local sync
|
|
34
|
+
* is the ergonomic finish so the user ends on an up-to-date main).
|
|
35
|
+
* propose — push the `work/<slug>` branch (the safety-bearing step) and report
|
|
36
|
+
* the next step. Full provider-driven PR/MR creation lands with the
|
|
37
|
+
* integration seam; until then `complete` pushes + tells the human.
|
|
38
|
+
*
|
|
39
|
+
* In BOTH modes `complete` lands the human back on local `main` by default
|
|
40
|
+
* ("finish, ready for the next thing") — but the move differs because the work's
|
|
41
|
+
* location differs: `merge` switches to `main` AND fast-forwards it to the just-
|
|
42
|
+
* pushed `<arbiter>/main` (the work landed there); `propose` ONLY `git switch
|
|
43
|
+
* main` (arbiter main has not moved, so there is nothing to ff). `--no-switch`
|
|
44
|
+
* opts out in either mode (stay on `work/<slug>` to keep iterating).
|
|
45
|
+
*
|
|
46
|
+
* After landing on `main`, the LOCAL `work/<slug>` branch is deleted iff its work
|
|
47
|
+
* is provably on the arbiter (the SAME predicate as worktree deletion, ADR §4,
|
|
48
|
+
* mode-agnostic): its tip is an ancestor of `<arbiter>/main` (merged) OR
|
|
49
|
+
* `<arbiter>/work/<slug>` exists with its tip == the local tip (pushed & up-to-
|
|
50
|
+
* date). Otherwise the branch is KEPT (unmerged / unpushed / a diverged un-pushed
|
|
51
|
+
* amend = not safe). The REMOTE branch is NEVER deleted (a propose PR is built
|
|
52
|
+
* from it). `--no-switch` keeps the branch too.
|
|
53
|
+
*
|
|
54
|
+
* Before integrating, the work branch is rebased onto the latest `<arbiter>/main`
|
|
55
|
+
* (ADR §10): a clean rebase continues; a conflicting rebase is `--abort`ed and
|
|
56
|
+
* surfaced as needs-attention — `complete` NEVER auto-resolves. It NEVER
|
|
57
|
+
* `--force`es to main.
|
|
58
|
+
*
|
|
59
|
+
* Exit codes:
|
|
60
|
+
* 0 completed (done-move + commit + integrate succeeded)
|
|
61
|
+
* 1 usage/environment error, or a refusal (gate failed, nothing to commit,
|
|
62
|
+
* not on a work branch, rebase conflict needs the human)
|
|
63
|
+
*
|
|
64
|
+
* On the two FAILURE paths the human can't paper over — a red gate (without
|
|
65
|
+
* `--skip-verify`) and a rebase conflict (ADR §10) — `complete` no longer leaves
|
|
66
|
+
* the item dangling. Instead it routes the item through the shared
|
|
67
|
+
* `needs-attention` mechanism (ADR §12): record the reason on the per-item lock
|
|
68
|
+
* entry (`state: stuck`, post-cutover task
|
|
69
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`) so the stuck
|
|
70
|
+
* item is surfaced by `status` and returnable to `backlog/`. The success and
|
|
71
|
+
* `--skip-verify` paths are unchanged. The exit code stays 1 (the work did NOT
|
|
72
|
+
* complete); the outcome still names WHY (gate-failed / rebase-conflict) and
|
|
73
|
+
* `routedToNeedsAttention` records that the lock amend happened.
|
|
74
|
+
*/
|
|
75
|
+
export type CompleteOutcome = 'completed' | 'already-integrated' | 'prepare-failed' | 'gate-failed' | 'review-blocked' | 'review-unparseable' | 'rebase-conflict' | 'invariant-violation' | 'strand-surfaced' | 'surface-unmoved' | 'refused' | 'usage-error';
|
|
76
|
+
export interface CompleteOptions {
|
|
77
|
+
/** The slug to complete. If omitted, inferred from a `work/<slug>` branch. */
|
|
78
|
+
slug?: string;
|
|
79
|
+
/** The working clone/checkout the work branch lives in. */
|
|
80
|
+
cwd: string;
|
|
81
|
+
/** Name of the arbiter git remote. Defaults to `origin`. */
|
|
82
|
+
arbiter?: string;
|
|
83
|
+
/** Integration mode: `propose` (default) or `merge`. */
|
|
84
|
+
integration?: IntegrationMode;
|
|
85
|
+
/**
|
|
86
|
+
* **The explicit `--merge` override** for the untrusted-origin build-propose rule
|
|
87
|
+
* (task `untrusted-origin-forces-build-propose`). `true` iff the operator
|
|
88
|
+
* EXPLICITLY typed `--merge` on this invocation (vs `merge` resolved from
|
|
89
|
+
* config). Forwarded to {@link performIntegration}'s `explicitMerge`: an explicit
|
|
90
|
+
* `--merge` OVERRIDES the untrusted-origin build-propose rule (the operator is
|
|
91
|
+
* present; CLI always wins). Unset on the autonomous path ⇒ an untrusted-origin
|
|
92
|
+
* task reliably forces `propose`.
|
|
93
|
+
*/
|
|
94
|
+
explicitMerge?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Override the pre-flight DIVERGENCE guard (`--ignore-diverged-main`, mirroring
|
|
97
|
+
* `--ignore-not-ready`): proceed even when local `main` is ahead of
|
|
98
|
+
* `<arbiter>/main` (has unpushed commits). MERGE MODE ONLY (only merge mode ff's
|
|
99
|
+
* local `main`). When overridden and the divergence persists, the now-NON-FATAL
|
|
100
|
+
* {@link syncLocalMain} reports it honestly (work on the arbiter; local `main`
|
|
101
|
+
* left to rebase). Loud, never the default.
|
|
102
|
+
*/
|
|
103
|
+
ignoreDivergedMain?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Leave the human ON the `work/<slug>` branch (and KEEP it) in either mode,
|
|
106
|
+
* instead of switching back to `main` + deleting the provably-landed branch.
|
|
107
|
+
* For "I'll keep iterating on this branch" (e.g. addressing review feedback).
|
|
108
|
+
*/
|
|
109
|
+
noSwitch?: boolean;
|
|
110
|
+
/** The declared per-repo ENV-PREP step (string | list), run ONCE before the
|
|
111
|
+
* first `verify` to make the env ready. Unset ⇒ a no-op (NO default install). */
|
|
112
|
+
prepare?: VerifyConfig;
|
|
113
|
+
/** The declared per-repo gate (string | list). Unset ⇒ the default command. */
|
|
114
|
+
verify?: VerifyConfig;
|
|
115
|
+
/**
|
|
116
|
+
* Run the acceptance gate (`prepare` then `verify`) against the REBASED tip
|
|
117
|
+
* in a CLEAN throwaway worktree (the tree that integrates) when `true` (the
|
|
118
|
+
* default), rather than the current checkout (the pre-rebase tree) when
|
|
119
|
+
* `false`. `complete` is a SINGLE-JOB path, so this is the resolved flag
|
|
120
|
+
* passed UNCONDITIONALLY (no `run`-fleet downgrade). Forwarded verbatim to
|
|
121
|
+
* {@link performIntegration}.
|
|
122
|
+
*/
|
|
123
|
+
freshWorktreeGate?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* **The cross-job merge-serialiser CAS-retry cap** (config `mergeRetries`, prd
|
|
126
|
+
* `land-time-reverify-and-parallel-merge-ceiling` Story 5 / Applied Answer q1
|
|
127
|
+
* (a)). Threaded verbatim into {@link performIntegration} as `mergeRetries` so
|
|
128
|
+
* the resolved per-repo value controls how many re-rebase-and-retry attempts
|
|
129
|
+
* the merge-mode `${branch}:main` push makes before a contender bounces to
|
|
130
|
+
* needs-attention. Resolved ONCE per `performComplete` call — the same
|
|
131
|
+
* per-item resolution as `freshWorktreeGate` / `reviewMaxRounds`.
|
|
132
|
+
*/
|
|
133
|
+
mergeRetries?: number;
|
|
134
|
+
/** Skip the acceptance gate (human-only escape hatch; never used unattended). */
|
|
135
|
+
skipVerify?: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* **`--allow-backlog`** (prd
|
|
138
|
+
* `do-allow-backlog-drive-staged-tasks-without-promotion`): TREAT a
|
|
139
|
+
* `tasks/backlog/`-resident body (staging) as a VALID build source, so a
|
|
140
|
+
* staged task driven in place done-moves `tasks/backlog/ → tasks/done/`
|
|
141
|
+
* directly. GATED on the explicit flag: WITHOUT it, a body resting in
|
|
142
|
+
* `tasks/backlog/` is NOT a sanctioned completion position (a corrupt/wip
|
|
143
|
+
* strand) and `complete` still REFUSES honestly — only the deliberate drive
|
|
144
|
+
* promotes from staging. Default off ⇒ today's refusal-on-staging behaviour.
|
|
145
|
+
* Threaded only by the `do … --allow-backlog` task-build path; no autonomous
|
|
146
|
+
* caller sets it.
|
|
147
|
+
*/
|
|
148
|
+
allowBacklog?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* **Gate 2 — the PR/code review gate** (GATES prd `work/prds/tasked/review.md`). When
|
|
151
|
+
* `true`, after the green `verify` and BEFORE the done-move, run the `review`
|
|
152
|
+
* SKILL as a FRESH-CONTEXT agent (its own harness launch) and route its verdict:
|
|
153
|
+
* `approve` → proceed to done-move/commit/integrate; `block` → route to
|
|
154
|
+
* needs-attention (NEVER merge). `verify` is the non-skippable floor; review is
|
|
155
|
+
* a JUDGEMENT gate ON TOP (ADR §8), never a replacement. Default OFF.
|
|
156
|
+
*/
|
|
157
|
+
review?: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* The model the REVIEW agent runs on (de-correlation from the builder). Flows
|
|
160
|
+
* to the review-agent launch through the EXISTING harness seam
|
|
161
|
+
* (`LaunchInput.model` / `substituteModel`). Unset ⇒ no forced review model.
|
|
162
|
+
*/
|
|
163
|
+
reviewModel?: string;
|
|
164
|
+
/**
|
|
165
|
+
* Bound the revise↔review loop (Gate 2). On exhaustion the gate ERRORS OUT and
|
|
166
|
+
* forces needs-attention (never silently merges or loops). Defaults to 2.
|
|
167
|
+
*/
|
|
168
|
+
reviewMaxRounds?: number;
|
|
169
|
+
/**
|
|
170
|
+
* The review-gate SEAM (injectable, like `do`'s `dorfl`): a fresh-context
|
|
171
|
+
* review that returns a parsed `{verdict, findings}`. Tests inject a canned
|
|
172
|
+
* verdict (no real model); production wires the harness-backed gate
|
|
173
|
+
* (`harnessReviewGate`). Required when `review` is on (a missing gate with
|
|
174
|
+
* `review` on is a usage error — the floor must not be silently skipped).
|
|
175
|
+
*/
|
|
176
|
+
reviewGate?: ReviewGate;
|
|
177
|
+
/**
|
|
178
|
+
* `--watch`: tail the Gate-2 REVIEW agent's pi session `.jsonl` live, the SAME
|
|
179
|
+
* way `do --watch` tails the build agent's (task `watch-review-session`).
|
|
180
|
+
* Threaded into the `reviewGate` invocation below so the production gate
|
|
181
|
+
* (`harnessReviewGate`) routes its launch through the shared
|
|
182
|
+
* `launchWithOptionalWatch` helper. OFF (the default) ⇒ the review path is
|
|
183
|
+
* byte-for-byte unchanged (sync launch, no tailer). Observability only — it
|
|
184
|
+
* never changes the verdict/routing.
|
|
185
|
+
*/
|
|
186
|
+
watch?: boolean;
|
|
187
|
+
/** Where the tailed review lines are written (defaults to stderr). */
|
|
188
|
+
watchSink?: (line: string) => void;
|
|
189
|
+
/**
|
|
190
|
+
* The HOST-ONLY sessions root the review session FILE is generated under
|
|
191
|
+
* (resolved `config.sessionsDir`). Threaded to the review-agent launch so its
|
|
192
|
+
* (distinct `<slug>-review`) session lands under the same root as the build's.
|
|
193
|
+
*/
|
|
194
|
+
sessionsDir?: string;
|
|
195
|
+
/** Conventional-commit type for the completion commit. Defaults to `feat`. */
|
|
196
|
+
type?: string;
|
|
197
|
+
/** Commit summary. Defaults to the task `title` minus a leading `slug — `. */
|
|
198
|
+
message?: string;
|
|
199
|
+
/**
|
|
200
|
+
* Optional review-request BODY (propose mode) — the PR/MR DESCRIPTION, DISTINCT
|
|
201
|
+
* from {@link message} (which is the COMMIT summary). Advisory prose that gates
|
|
202
|
+
* nothing. The autonomous `do` path passes the build agent's final summary
|
|
203
|
+
* (`LaunchResult.output`); a human `complete --propose` may pass one via a NEW
|
|
204
|
+
* `--body` flag (NOT `--message`). The runner scaffolds a deterministic header
|
|
205
|
+
* (a pointer to `work/done/<slug>.md`) above it. Absent ⇒ today's `gh pr create
|
|
206
|
+
* --fill` empty/commit-derived body (no regression). Ignored in `merge` mode.
|
|
207
|
+
*/
|
|
208
|
+
body?: string;
|
|
209
|
+
/** Optional injectable PR opener (e.g. `gh pr create`); used in `propose` mode. */
|
|
210
|
+
openPr?: (opts: {
|
|
211
|
+
cwd: string;
|
|
212
|
+
branch: string;
|
|
213
|
+
env?: NodeJS.ProcessEnv;
|
|
214
|
+
}) => void;
|
|
215
|
+
/**
|
|
216
|
+
* Optional FULLY-FORMED review provider INSTANCE used VERBATIM (the SAME seam
|
|
217
|
+
* `run` exposes via `RunOptions.provider`; forwarded to `performIntegration` as
|
|
218
|
+
* `providerInstance`). Tests/embeddings inject a stubbed `GitHubProvider` (a
|
|
219
|
+
* custom `gh` path) to drive the full propose pipeline OFFLINE without a real
|
|
220
|
+
* GitHub arbiter. This is the resolved provider OBJECT — NOT a config override
|
|
221
|
+
* (there is none; the provider is purely arbiter-derived). Unset ⇒ the core
|
|
222
|
+
* selects the provider from the arbiter URL as normal.
|
|
223
|
+
*/
|
|
224
|
+
providerInstance?: ReviewProvider;
|
|
225
|
+
/**
|
|
226
|
+
* **The PR-INTENT axis** (config `noPR`, ADR §6). When `true` on the propose
|
|
227
|
+
* path, push the branch but SKIP the review request (the explicit suppress-PR
|
|
228
|
+
* intent, re-homing the old `provider: none` use). NOT a provider choice — the
|
|
229
|
+
* provider is purely arbiter-derived. Threaded verbatim into
|
|
230
|
+
* {@link performIntegration}. Ignored in `merge` mode and when `openPr` is
|
|
231
|
+
* injected. Unset/false ⇒ propose opens the PR via the arbiter-derived provider.
|
|
232
|
+
*/
|
|
233
|
+
noPR?: boolean;
|
|
234
|
+
/**
|
|
235
|
+
* Surface a needs-attention bounce ON THE ARBITER (the AUTONOMOUS variant of
|
|
236
|
+
* the failure path). When set, the two FAILURE routings (`gate-failed` /
|
|
237
|
+
* `rebase-conflict`) pass this arbiter remote into the ledger write seam's
|
|
238
|
+
* `applyNeedsAttentionTransition`, which (mode M) cherry-picks the move-only
|
|
239
|
+
* commit onto the arbiter's `main` — making the stuck state observable to
|
|
240
|
+
* `scan`/`status`/another machine. This is exactly what `run`'s `runOneItem`
|
|
241
|
+
* does (it passes `arbiter: job.arbiterRemote`).
|
|
242
|
+
*
|
|
243
|
+
* Unset (the default) keeps `complete`'s HUMAN behaviour: route LOCALLY only
|
|
244
|
+
* (no on-`main` surfacing) — a human is right there, so no cross-machine
|
|
245
|
+
* surfacing is needed. The unattended `do` worker (the CI command) sets this
|
|
246
|
+
* so a stuck CI run is NOT invisible.
|
|
247
|
+
*/
|
|
248
|
+
surfaceArbiter?: string;
|
|
249
|
+
/** Environment for child git/provider processes (the identity-scoped env). */
|
|
250
|
+
env?: NodeJS.ProcessEnv;
|
|
251
|
+
/**
|
|
252
|
+
* Environment for the REVIEW-AGENT launch (Gate 2) — the AMBIENT env, never the
|
|
253
|
+
* identity-scoped {@link env} (an agent must not act as the bot). Threaded to
|
|
254
|
+
* {@link performIntegration}'s `agentEnv`. Unset ⇒ falls back to {@link env}
|
|
255
|
+
* (byte-for-byte unchanged for non-identity callers, e.g. the human `complete`).
|
|
256
|
+
*/
|
|
257
|
+
agentEnv?: NodeJS.ProcessEnv;
|
|
258
|
+
/** Sink for human-readable progress notes. */
|
|
259
|
+
note?: (message: string) => void;
|
|
260
|
+
/**
|
|
261
|
+
* Sink for a pre-formatted block printed VERBATIM (no `>> ` prefix), used for
|
|
262
|
+
* the visually-distinct propose-mode next-step block so its blank lines and
|
|
263
|
+
* heading stand out cleanly. Defaults to `note` when not supplied.
|
|
264
|
+
*/
|
|
265
|
+
noteBlock?: (message: string) => void;
|
|
266
|
+
/**
|
|
267
|
+
* Emit ANSI color in the (cosmetic) propose-mode next-step block. Defaults
|
|
268
|
+
* to the TTY/`NO_COLOR` rule against `process.stdout`; injectable so tests
|
|
269
|
+
* can simulate a TTY (color) vs. a pipe / `NO_COLOR` (plain) without a real
|
|
270
|
+
* terminal. Color-only — it changes no gate/done-move/commit/integrate logic.
|
|
271
|
+
*/
|
|
272
|
+
color?: boolean;
|
|
273
|
+
}
|
|
274
|
+
export interface CompleteResult {
|
|
275
|
+
exitCode: 0 | 1;
|
|
276
|
+
outcome: CompleteOutcome;
|
|
277
|
+
/**
|
|
278
|
+
* True iff a FAILURE outcome (gate-failed / rebase-conflict) was routed to
|
|
279
|
+
* `work/needs-attention/` via the shared mechanism (ADR §12), rather than left
|
|
280
|
+
* dangling. Undefined/false on the success, `--skip-verify`, refused, and
|
|
281
|
+
* usage-error paths (none of which move the item to needs-attention).
|
|
282
|
+
*/
|
|
283
|
+
routedToNeedsAttention?: boolean;
|
|
284
|
+
/** The work branch that was completed, when one was resolved. */
|
|
285
|
+
branch?: string;
|
|
286
|
+
/** The completion commit message that was authored, on success. */
|
|
287
|
+
commitMessage?: string;
|
|
288
|
+
/** True when the work landed on the arbiter's `main` (merge mode). */
|
|
289
|
+
mergedToMain?: boolean;
|
|
290
|
+
/**
|
|
291
|
+
* Merge mode only: whether the LOCAL `main` was fast-forwarded to the
|
|
292
|
+
* just-pushed `<arbiter>/main` (the ergonomic courtesy AFTER the authoritative
|
|
293
|
+
* push). `true` on the normal ff path; `false` when local `main` had DIVERGED
|
|
294
|
+
* and the ff could not apply — a NON-FATAL skip (the arbiter push already
|
|
295
|
+
* defined success, so `outcome` stays `completed` / exit 0; the operator is told
|
|
296
|
+
* to `git rebase` to sync). Undefined outside merge mode / `--no-switch`.
|
|
297
|
+
*/
|
|
298
|
+
localMainSynced?: boolean;
|
|
299
|
+
/** The branch HEAD ended on after completing (`main`, or the work branch). */
|
|
300
|
+
switchedTo?: string;
|
|
301
|
+
/** True iff the local `work/<slug>` branch was deleted (provably on arbiter). */
|
|
302
|
+
deletedLocalBranch?: boolean;
|
|
303
|
+
/**
|
|
304
|
+
* The review-request URL (e.g. a GitHub PR) opened in `propose` mode, when a
|
|
305
|
+
* provider opened one and reported it (ADR §6). Absent in merge mode and on
|
|
306
|
+
* the push-only / degraded path.
|
|
307
|
+
*/
|
|
308
|
+
prUrl?: string;
|
|
309
|
+
/** Human-readable summary of the terminal condition. */
|
|
310
|
+
message: string;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Resolve the integration mode the human asked for ON THIS invocation from the
|
|
314
|
+
* mutually-exclusive `--merge` / `--propose` flags. Returns the explicit mode,
|
|
315
|
+
* or `undefined` when neither flag was given (per-repo > global > default then
|
|
316
|
+
* decides). Throws when BOTH are given (they are mutually exclusive). This is
|
|
317
|
+
* the TOP of the complete-time precedence chain (flag > per-repo > global >
|
|
318
|
+
* default); the autonomous runner uses no flag and so resolves the same
|
|
319
|
+
* underlying order.
|
|
320
|
+
*/
|
|
321
|
+
export declare function integrationFromFlags(flags: {
|
|
322
|
+
merge?: boolean;
|
|
323
|
+
propose?: boolean;
|
|
324
|
+
}): IntegrationMode | undefined;
|
|
325
|
+
/**
|
|
326
|
+
* Run the complete ritual. Never throws for the expected gate-failed /
|
|
327
|
+
* rebase-conflict / refused cases — those are returned with exit 1 and a
|
|
328
|
+
* specific outcome. Usage/environment problems also surface as exit 1.
|
|
329
|
+
*/
|
|
330
|
+
export declare function performComplete(options: CompleteOptions): Promise<CompleteResult>;
|
|
331
|
+
/**
|
|
332
|
+
* Sync the local `main` to the just-pushed `<arbiter>/main`: switch to main and
|
|
333
|
+
* fast-forward it. We fetch the arbiter's main (we just pushed our rebased work
|
|
334
|
+
* there) then `merge --ff-only` so the user lands on an up-to-date local main
|
|
335
|
+
* without merge noise.
|
|
336
|
+
*
|
|
337
|
+
* The ff is a COURTESY, NOT the safety-bearing step — the authoritative push to
|
|
338
|
+
* `<arbiter>/main` already defined `complete`'s success. So the ff is NON-FATAL:
|
|
339
|
+
* if local `main` has DIVERGED (unpushed commits the arbiter lacks) the ff cannot
|
|
340
|
+
* apply; rather than throw (which would make `complete` exit non-zero even though
|
|
341
|
+
* the merge ALREADY LANDED on the arbiter), we print a clear "rebase to sync"
|
|
342
|
+
* message and return `false` (the caller records `localMainSynced: false` and
|
|
343
|
+
* keeps `outcome: completed` / exit 0). Returns `true` on a normal ff.
|
|
344
|
+
*
|
|
345
|
+
* Only the diverged / ff-cannot-apply case is softened — the `fetch` and `switch`
|
|
346
|
+
* stay `gitHard` (a genuinely different failure is NOT masked, per the task).
|
|
347
|
+
* Exported for direct testing of the softened-vs-fatal boundary in isolation.
|
|
348
|
+
*/
|
|
349
|
+
export declare function syncLocalMain(cwd: string, arbiter: string, env: NodeJS.ProcessEnv | undefined, note: (m: string) => void): Promise<boolean>;
|
|
350
|
+
/**
|
|
351
|
+
* The provably-safe predicate (ADR §4), mode-agnostic, applied to a LOCAL
|
|
352
|
+
* `branch` in `cwd`: true iff its tip is an ancestor of `<arbiter>/main` (merged)
|
|
353
|
+
* OR `<arbiter>/<branch>` exists with its tip == the local tip (pushed &
|
|
354
|
+
* up-to-date). False when the local branch is absent, or its work is unmerged /
|
|
355
|
+
* unpushed / a diverged un-pushed amend (remote tip != local tip). A `git fetch`
|
|
356
|
+
* refreshes the remote-tracking refs; an unreachable arbiter reads as not-
|
|
357
|
+
* provable → false (the safe direction). Exported for direct testing of the
|
|
358
|
+
* kept-vs-deleted decision in isolation.
|
|
359
|
+
*/
|
|
360
|
+
export declare function isLocalBranchProvablyOnArbiter(cwd: string, arbiter: string, branch: string, env: NodeJS.ProcessEnv | undefined): Promise<boolean>;
|
|
361
|
+
//# sourceMappingURL=complete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../src/complete.ts"],"names":[],"mappings":"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"}
|