dorfl 0.14.2 → 0.15.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 +17 -16
- package/dist/advance-ci-template.d.ts.map +1 -1
- package/dist/advance-ci-template.js +42 -53
- package/dist/advance-ci-template.js.map +1 -1
- package/dist/advance-drivers.d.ts +8 -0
- package/dist/advance-drivers.d.ts.map +1 -1
- package/dist/advance-drivers.js +28 -4
- package/dist/advance-drivers.js.map +1 -1
- package/dist/advance-isolated.d.ts.map +1 -1
- package/dist/advance-isolated.js +3 -2
- package/dist/advance-isolated.js.map +1 -1
- package/dist/advance-lifecycle-template.d.ts +41 -40
- package/dist/advance-lifecycle-template.d.ts.map +1 -1
- package/dist/advance-lifecycle-template.js +309 -489
- package/dist/advance-lifecycle-template.js.map +1 -1
- package/dist/advance-loop-driver.d.ts.map +1 -1
- package/dist/advance-loop-driver.js +3 -2
- package/dist/advance-loop-driver.js.map +1 -1
- package/dist/advance-treeless-publish.d.ts +31 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -1
- package/dist/advance-treeless-publish.js +40 -0
- package/dist/advance-treeless-publish.js.map +1 -1
- package/dist/advance.d.ts +63 -3
- package/dist/advance.d.ts.map +1 -1
- package/dist/advance.js +80 -12
- package/dist/advance.js.map +1 -1
- package/dist/advancing-lock.d.ts +9 -0
- package/dist/advancing-lock.d.ts.map +1 -1
- package/dist/advancing-lock.js +21 -1
- package/dist/advancing-lock.js.map +1 -1
- package/dist/agent-env.d.ts +61 -0
- package/dist/agent-env.d.ts.map +1 -0
- package/dist/agent-env.js +144 -0
- package/dist/agent-env.js.map +1 -0
- package/dist/agent-stop.d.ts +35 -0
- package/dist/agent-stop.d.ts.map +1 -1
- package/dist/agent-stop.js +62 -0
- package/dist/agent-stop.js.map +1 -1
- package/dist/apply-merge-action.d.ts +76 -34
- package/dist/apply-merge-action.d.ts.map +1 -1
- package/dist/apply-merge-action.js +339 -129
- package/dist/apply-merge-action.js.map +1 -1
- package/dist/apply-stuck-action.js +2 -2
- package/dist/apply-stuck-action.js.map +1 -1
- package/dist/ci-agent-result.d.ts +151 -0
- package/dist/ci-agent-result.d.ts.map +1 -0
- package/dist/ci-agent-result.js +314 -0
- package/dist/ci-agent-result.js.map +1 -0
- package/dist/ci-handoff-apply.d.ts +162 -0
- package/dist/ci-handoff-apply.d.ts.map +1 -0
- package/dist/ci-handoff-apply.js +497 -0
- package/dist/ci-handoff-apply.js.map +1 -0
- package/dist/ci-handoff-format.d.ts +369 -0
- package/dist/ci-handoff-format.d.ts.map +1 -0
- package/dist/ci-handoff-format.js +646 -0
- package/dist/ci-handoff-format.js.map +1 -0
- package/dist/ci-handoff-lfs.d.ts +146 -0
- package/dist/ci-handoff-lfs.d.ts.map +1 -0
- package/dist/ci-handoff-lfs.js +397 -0
- package/dist/ci-handoff-lfs.js.map +1 -0
- package/dist/ci-handoff.d.ts +99 -0
- package/dist/ci-handoff.d.ts.map +1 -0
- package/dist/ci-handoff.js +277 -0
- package/dist/ci-handoff.js.map +1 -0
- package/dist/ci-lock-outputs.d.ts +93 -0
- package/dist/ci-lock-outputs.d.ts.map +1 -0
- package/dist/ci-lock-outputs.js +223 -0
- package/dist/ci-lock-outputs.js.map +1 -0
- package/dist/ci-phase-build.d.ts +178 -0
- package/dist/ci-phase-build.d.ts.map +1 -0
- package/dist/ci-phase-build.js +989 -0
- package/dist/ci-phase-build.js.map +1 -0
- package/dist/ci-phase-driver.d.ts +247 -0
- package/dist/ci-phase-driver.d.ts.map +1 -0
- package/dist/ci-phase-driver.js +370 -0
- package/dist/ci-phase-driver.js.map +1 -0
- package/dist/ci-phase-intake.d.ts +172 -0
- package/dist/ci-phase-intake.d.ts.map +1 -0
- package/dist/ci-phase-intake.js +555 -0
- package/dist/ci-phase-intake.js.map +1 -0
- package/dist/ci-phase-tasking.d.ts +205 -0
- package/dist/ci-phase-tasking.d.ts.map +1 -0
- package/dist/ci-phase-tasking.js +906 -0
- package/dist/ci-phase-tasking.js.map +1 -0
- package/dist/ci-phase-treeless.d.ts +224 -0
- package/dist/ci-phase-treeless.d.ts.map +1 -0
- package/dist/ci-phase-treeless.js +1482 -0
- package/dist/ci-phase-treeless.js.map +1 -0
- package/dist/ci-read-token.d.ts +47 -0
- package/dist/ci-read-token.d.ts.map +1 -0
- package/dist/ci-read-token.js +80 -0
- package/dist/ci-read-token.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +447 -22
- package/dist/cli.js.map +1 -1
- package/dist/close-job-template.d.ts +10 -1
- package/dist/close-job-template.d.ts.map +1 -1
- package/dist/close-job-template.js +46 -14
- package/dist/close-job-template.js.map +1 -1
- package/dist/close-job.d.ts +20 -5
- package/dist/close-job.d.ts.map +1 -1
- package/dist/close-job.js +65 -12
- package/dist/close-job.js.map +1 -1
- package/dist/complete.d.ts.map +1 -1
- package/dist/complete.js +20 -1
- package/dist/complete.js.map +1 -1
- package/dist/config.d.ts +41 -44
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -4
- package/dist/config.js.map +1 -1
- package/dist/continue-branch.d.ts +63 -15
- package/dist/continue-branch.d.ts.map +1 -1
- package/dist/continue-branch.js +75 -8
- package/dist/continue-branch.js.map +1 -1
- package/dist/crashed-run-save.d.ts +73 -0
- package/dist/crashed-run-save.d.ts.map +1 -0
- package/dist/crashed-run-save.js +86 -0
- package/dist/crashed-run-save.js.map +1 -0
- package/dist/cwd-section.d.ts.map +1 -1
- package/dist/cwd-section.js +10 -2
- package/dist/cwd-section.js.map +1 -1
- package/dist/decision-engine.d.ts +10 -0
- package/dist/decision-engine.d.ts.map +1 -1
- package/dist/decision-engine.js.map +1 -1
- package/dist/do-config.d.ts +2 -24
- package/dist/do-config.d.ts.map +1 -1
- package/dist/do-config.js +1 -33
- package/dist/do-config.js.map +1 -1
- package/dist/do.d.ts +149 -1
- package/dist/do.d.ts.map +1 -1
- package/dist/do.js +115 -25
- package/dist/do.js.map +1 -1
- package/dist/dorfl-item-template.d.ts +98 -0
- package/dist/dorfl-item-template.d.ts.map +1 -0
- package/dist/dorfl-item-template.js +504 -0
- package/dist/dorfl-item-template.js.map +1 -0
- package/dist/env-config.d.ts.map +1 -1
- package/dist/env-config.js +7 -5
- package/dist/env-config.js.map +1 -1
- package/dist/frontmatter.d.ts +52 -0
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +136 -2
- package/dist/frontmatter.js.map +1 -1
- package/dist/gc.d.ts +13 -0
- package/dist/gc.d.ts.map +1 -1
- package/dist/gc.js +16 -2
- package/dist/gc.js.map +1 -1
- package/dist/git.d.ts +18 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +70 -5
- package/dist/git.js.map +1 -1
- package/dist/harness.d.ts +44 -5
- package/dist/harness.d.ts.map +1 -1
- package/dist/harness.js +24 -1
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/install-ci-action-pins.d.ts +123 -0
- package/dist/install-ci-action-pins.d.ts.map +1 -0
- package/dist/install-ci-action-pins.js +190 -0
- package/dist/install-ci-action-pins.js.map +1 -0
- package/dist/install-ci-actions-pr-creation.d.ts +70 -0
- package/dist/install-ci-actions-pr-creation.d.ts.map +1 -0
- package/dist/install-ci-actions-pr-creation.js +106 -0
- package/dist/install-ci-actions-pr-creation.js.map +1 -0
- package/dist/install-ci-capabilities/dorfl-item.d.ts +12 -0
- package/dist/install-ci-capabilities/dorfl-item.d.ts.map +1 -0
- package/dist/install-ci-capabilities/dorfl-item.js +26 -0
- package/dist/install-ci-capabilities/dorfl-item.js.map +1 -0
- package/dist/install-ci-core.d.ts +155 -37
- package/dist/install-ci-core.d.ts.map +1 -1
- package/dist/install-ci-core.js +304 -200
- package/dist/install-ci-core.js.map +1 -1
- package/dist/install-ci-github.d.ts +47 -2
- package/dist/install-ci-github.d.ts.map +1 -1
- package/dist/install-ci-github.js +113 -1
- package/dist/install-ci-github.js.map +1 -1
- package/dist/install-ci.d.ts +25 -6
- package/dist/install-ci.d.ts.map +1 -1
- package/dist/install-ci.js +72 -36
- package/dist/install-ci.js.map +1 -1
- package/dist/intake-marker.d.ts +6 -1
- package/dist/intake-marker.d.ts.map +1 -1
- package/dist/intake-marker.js.map +1 -1
- package/dist/intake-triage.d.ts.map +1 -1
- package/dist/intake-triage.js +6 -2
- package/dist/intake-triage.js.map +1 -1
- package/dist/intake-trigger-template.d.ts +31 -25
- package/dist/intake-trigger-template.d.ts.map +1 -1
- package/dist/intake-trigger-template.js +107 -292
- package/dist/intake-trigger-template.js.map +1 -1
- package/dist/intake.d.ts +186 -4
- package/dist/intake.d.ts.map +1 -1
- package/dist/intake.js +533 -416
- package/dist/intake.js.map +1 -1
- package/dist/integration-core.d.ts +154 -1
- package/dist/integration-core.d.ts.map +1 -1
- package/dist/integration-core.js +759 -486
- package/dist/integration-core.js.map +1 -1
- package/dist/integrator.d.ts +12 -0
- package/dist/integrator.d.ts.map +1 -1
- package/dist/integrator.js +21 -0
- package/dist/integrator.js.map +1 -1
- package/dist/isolation.d.ts +12 -2
- package/dist/isolation.d.ts.map +1 -1
- package/dist/isolation.js +19 -8
- package/dist/isolation.js.map +1 -1
- package/dist/item-lock.d.ts +93 -11
- package/dist/item-lock.d.ts.map +1 -1
- package/dist/item-lock.js +233 -65
- package/dist/item-lock.js.map +1 -1
- package/dist/land-question-residue.d.ts +58 -0
- package/dist/land-question-residue.d.ts.map +1 -0
- package/dist/land-question-residue.js +95 -0
- package/dist/land-question-residue.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +16 -0
- package/dist/lifecycle-gather.d.ts.map +1 -1
- package/dist/lifecycle-gather.js +54 -6
- package/dist/lifecycle-gather.js.map +1 -1
- package/dist/merge-answer.d.ts +41 -0
- package/dist/merge-answer.d.ts.map +1 -0
- package/dist/merge-answer.js +60 -0
- package/dist/merge-answer.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +105 -30
- package/dist/merge-question-surfacer.d.ts.map +1 -1
- package/dist/merge-question-surfacer.js +202 -91
- package/dist/merge-question-surfacer.js.map +1 -1
- package/dist/merge-question-tick.d.ts +64 -0
- package/dist/merge-question-tick.d.ts.map +1 -0
- package/dist/merge-question-tick.js +96 -0
- package/dist/merge-question-tick.js.map +1 -0
- package/dist/mint-adr.d.ts.map +1 -1
- package/dist/mint-adr.js +20 -2
- package/dist/mint-adr.js.map +1 -1
- package/dist/needs-attention.d.ts +72 -2
- package/dist/needs-attention.d.ts.map +1 -1
- package/dist/needs-attention.js +275 -38
- package/dist/needs-attention.js.map +1 -1
- package/dist/phase-recorder.d.ts +168 -0
- package/dist/phase-recorder.d.ts.map +1 -0
- package/dist/phase-recorder.js +218 -0
- package/dist/phase-recorder.js.map +1 -0
- package/dist/phase.d.ts +94 -0
- package/dist/phase.d.ts.map +1 -0
- package/dist/phase.js +148 -0
- package/dist/phase.js.map +1 -0
- package/dist/pi-harness.d.ts.map +1 -1
- package/dist/pi-harness.js +19 -6
- package/dist/pi-harness.js.map +1 -1
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +4 -0
- package/dist/prepare.js.map +1 -1
- package/dist/prompt.d.ts +4 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +48 -1
- package/dist/prompt.js.map +1 -1
- package/dist/protocol/CLAIM-PROTOCOL.md +3 -1
- package/dist/protocol/WORK-CONTRACT.md +1 -1
- package/dist/reap-branches.d.ts +48 -0
- package/dist/reap-branches.d.ts.map +1 -1
- package/dist/reap-branches.js +64 -0
- package/dist/reap-branches.js.map +1 -1
- package/dist/ref-write.d.ts +198 -0
- package/dist/ref-write.d.ts.map +1 -0
- package/dist/ref-write.js +79 -0
- package/dist/ref-write.js.map +1 -0
- package/dist/repo-config.js +8 -8
- package/dist/repo-config.js.map +1 -1
- package/dist/repo-mirror.d.ts +36 -0
- package/dist/repo-mirror.d.ts.map +1 -1
- package/dist/repo-mirror.js +91 -1
- package/dist/repo-mirror.js.map +1 -1
- package/dist/review-verdict.d.ts +1 -1
- package/dist/review-verdict.js +1 -1
- package/dist/run.d.ts +7 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +28 -4
- package/dist/run.js.map +1 -1
- package/dist/scan.d.ts +19 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +21 -8
- package/dist/scan.js.map +1 -1
- package/dist/sidecar.d.ts +14 -0
- package/dist/sidecar.d.ts.map +1 -1
- package/dist/sidecar.js +21 -0
- package/dist/sidecar.js.map +1 -1
- package/dist/single-job-warning.d.ts +63 -0
- package/dist/single-job-warning.d.ts.map +1 -0
- package/dist/single-job-warning.js +110 -0
- package/dist/single-job-warning.js.map +1 -0
- package/dist/skills/setup/protocol/CLAIM-PROTOCOL.md +3 -1
- package/dist/skills/setup/protocol/WORK-CONTRACT.md +1 -1
- package/dist/spec-complete.d.ts +13 -6
- package/dist/spec-complete.d.ts.map +1 -1
- package/dist/spec-complete.js +23 -11
- package/dist/spec-complete.js.map +1 -1
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +47 -14
- package/dist/start.js.map +1 -1
- package/dist/status.d.ts +12 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +11 -3
- package/dist/status.js.map +1 -1
- package/dist/tasking.d.ts +246 -1
- package/dist/tasking.d.ts.map +1 -1
- package/dist/tasking.js +452 -358
- package/dist/tasking.js.map +1 -1
- package/dist/triage-persist.d.ts.map +1 -1
- package/dist/triage-persist.js +21 -2
- package/dist/triage-persist.js.map +1 -1
- package/dist/verify-workflow-template.d.ts.map +1 -1
- package/dist/verify-workflow-template.js +8 -4
- package/dist/verify-workflow-template.js.map +1 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +4 -0
- package/dist/verify.js.map +1 -1
- package/dist/watch-session.d.ts +42 -13
- package/dist/watch-session.d.ts.map +1 -1
- package/dist/watch-session.js +52 -23
- package/dist/watch-session.js.map +1 -1
- package/dist/work-layout.d.ts +10 -4
- package/dist/work-layout.d.ts.map +1 -1
- package/dist/work-layout.js +11 -3
- package/dist/work-layout.js.map +1 -1
- package/dist/workspace.d.ts +65 -4
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +159 -11
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
- package/src/advance-ci-template.ts +80 -81
- package/src/advance-drivers.ts +45 -6
- package/src/advance-isolated.ts +3 -5
- package/src/advance-lifecycle-template.ts +375 -538
- package/src/advance-loop-driver.ts +3 -5
- package/src/advance-treeless-publish.ts +61 -0
- package/src/advance.ts +145 -15
- package/src/advancing-lock.ts +36 -1
- package/src/agent-env.ts +174 -0
- package/src/agent-stop.ts +81 -0
- package/src/apply-merge-action.ts +401 -154
- package/src/apply-stuck-action.ts +2 -2
- package/src/ci-agent-result.ts +421 -0
- package/src/ci-handoff-apply.ts +737 -0
- package/src/ci-handoff-format.ts +926 -0
- package/src/ci-handoff-lfs.ts +519 -0
- package/src/ci-handoff.ts +392 -0
- package/src/ci-lock-outputs.ts +273 -0
- package/src/ci-phase-build.ts +1328 -0
- package/src/ci-phase-driver.ts +548 -0
- package/src/ci-phase-intake.ts +861 -0
- package/src/ci-phase-tasking.ts +1255 -0
- package/src/ci-phase-treeless.ts +2028 -0
- package/src/ci-read-token.ts +90 -0
- package/src/cli.ts +591 -29
- package/src/close-job-template.ts +52 -15
- package/src/close-job.ts +77 -12
- package/src/complete.ts +19 -1
- package/src/config.ts +43 -48
- package/src/continue-branch.ts +121 -16
- package/src/crashed-run-save.ts +162 -0
- package/src/cwd-section.ts +10 -0
- package/src/decision-engine.ts +10 -0
- package/src/do-config.ts +2 -57
- package/src/do.ts +170 -28
- package/src/dorfl-item-template.ts +556 -0
- package/src/env-config.ts +7 -5
- package/src/frontmatter.ts +155 -2
- package/src/gc.ts +27 -2
- package/src/git.ts +83 -5
- package/src/harness.ts +58 -6
- package/src/index.ts +50 -1
- package/src/install-ci-action-pins.ts +209 -0
- package/src/install-ci-actions-pr-creation.ts +186 -0
- package/src/install-ci-capabilities/dorfl-item.ts +33 -0
- package/src/install-ci-core.ts +388 -233
- package/src/install-ci-github.ts +149 -1
- package/src/install-ci.ts +83 -37
- package/src/intake-marker.ts +6 -1
- package/src/intake-triage.ts +7 -3
- package/src/intake-trigger-template.ts +126 -327
- package/src/intake.ts +725 -544
- package/src/integration-core.ts +975 -523
- package/src/integrator.ts +28 -0
- package/src/isolation.ts +29 -10
- package/src/item-lock.ts +308 -92
- package/src/land-question-residue.ts +122 -0
- package/src/lifecycle-gather.ts +82 -10
- package/src/merge-answer.ts +82 -0
- package/src/merge-question-surfacer.ts +320 -112
- package/src/merge-question-tick.ts +182 -0
- package/src/mint-adr.ts +28 -2
- package/src/needs-attention.ts +350 -42
- package/src/phase-recorder.ts +350 -0
- package/src/phase.ts +177 -0
- package/src/pi-harness.ts +25 -5
- package/src/prepare.ts +4 -0
- package/src/prompt.ts +68 -1
- package/src/reap-branches.ts +107 -0
- package/src/ref-write.ts +324 -0
- package/src/repo-config.ts +8 -8
- package/src/repo-mirror.ts +107 -1
- package/src/review-verdict.ts +1 -1
- package/src/run.ts +47 -6
- package/src/scan.ts +37 -7
- package/src/sidecar.ts +36 -0
- package/src/single-job-warning.ts +135 -0
- package/src/spec-complete.ts +36 -14
- package/src/start.ts +55 -16
- package/src/status.ts +29 -3
- package/src/tasking.ts +593 -378
- package/src/triage-persist.ts +24 -2
- package/src/verify-workflow-template.ts +8 -4
- package/src/verify.ts +4 -0
- package/src/watch-session.ts +86 -28
- package/src/work-layout.ts +11 -3
- package/src/workspace.ts +210 -14
|
@@ -4,6 +4,7 @@ import { run } from './git.js';
|
|
|
4
4
|
import { isGitHubArbiterUrl, DEFAULT_GH_BIN } from './github.js';
|
|
5
5
|
import { parseSidecar, sidecarPathFor, isEntryAnswered, } from './sidecar.js';
|
|
6
6
|
import { persistSurfacedQuestions, } from './surface-persist.js';
|
|
7
|
+
import { parseWorkBranchRef } from './slug-namespace.js';
|
|
7
8
|
import { workItemRel } from './work-layout.js';
|
|
8
9
|
/** Raised for fatal usage errors (a missing repo, etc.). */
|
|
9
10
|
export class MergeQuestionSurfacerError extends Error {
|
|
@@ -13,21 +14,17 @@ export class MergeQuestionSurfacerError extends Error {
|
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
|
-
* The lifecycle folders {@link findTaskItemPath}
|
|
17
|
-
* `
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* - OMITS `in-progress` (and `needs-attention`): an unmerged `work/<slug>`
|
|
21
|
-
* branch whose body is mid-build should NOT trigger a merge-question — the
|
|
22
|
-
* build is still active, and surfacing a land-decision now would race the
|
|
23
|
-
* builder. Such tasks fall through to the `no-item-body` skip.
|
|
24
|
-
* - ADDS `cancelled`: a cancelled task with a lingering unmerged `work/*`
|
|
25
|
-
* branch SHOULD surface a merge-question so the operator explicitly decides
|
|
26
|
-
* whether to merge the branch or drop it.
|
|
17
|
+
* The lifecycle folders {@link findTaskItemPath} asks about (task
|
|
18
|
+
* `wire-merge-questions-into-the-advance-tick`, decision 6): the pool and
|
|
19
|
+
* staging. `in-progress` / `needs-attention` no longer exist as folders (a
|
|
20
|
+
* build in flight is a held lock, filtered separately).
|
|
27
21
|
*/
|
|
28
22
|
const TASK_FOLDERS = [
|
|
29
23
|
'tasks-ready',
|
|
30
24
|
'tasks-backlog',
|
|
25
|
+
];
|
|
26
|
+
/** A body in one of these is TERMINAL: its branch is never asked about. */
|
|
27
|
+
const TERMINAL_TASK_FOLDERS = [
|
|
31
28
|
'done',
|
|
32
29
|
'cancelled',
|
|
33
30
|
];
|
|
@@ -35,9 +32,10 @@ const TASK_FOLDERS = [
|
|
|
35
32
|
* Surface merge-questions for every unmerged `work/*` branch in `cwd`.
|
|
36
33
|
*
|
|
37
34
|
* The FLOOR (git reachability) is authoritative; the CEILING (`gh pr list`)
|
|
38
|
-
* runs only when {@link isGitHubArbiterUrl} accepts the arbiter URL
|
|
39
|
-
*
|
|
40
|
-
*
|
|
35
|
+
* runs only when {@link isGitHubArbiterUrl} accepts the arbiter URL. On GitHub
|
|
36
|
+
* it is load-bearing (an open PR is the land decision), so a failed listing
|
|
37
|
+
* asks about NO branch and is reported on
|
|
38
|
+
* {@link SurfaceMergeQuestionsResult.prListingError}.
|
|
41
39
|
*
|
|
42
40
|
* Idempotency: a branch whose sidecar ALREADY carries a PENDING `kind: merge`
|
|
43
41
|
* entry is SKIPPED (with `already-pending-merge-question`). A branch with no
|
|
@@ -53,10 +51,14 @@ export function surfaceMergeQuestions(options) {
|
|
|
53
51
|
const note = options.note ?? (() => { });
|
|
54
52
|
const persist = options.persist ?? persistSurfacedQuestions;
|
|
55
53
|
const listBranches = options.listUnmergedWorkBranches ?? listUnmergedWorkBranchesViaGit;
|
|
56
|
-
const branches = listBranches({ cwd, base, env });
|
|
54
|
+
const branches = listBranches({ cwd, base, arbiter: options.arbiter, env });
|
|
57
55
|
// CEILING: only consult `gh pr list` when the arbiter is GitHub-shaped. A
|
|
58
56
|
// bare / non-GitHub arbiter never spawns `gh` (the floor is sufficient).
|
|
57
|
+
// On GitHub an open PR is the land decision, so a branch with one is not
|
|
58
|
+
// asked about; a failed listing asks about NOTHING this pass (a question on
|
|
59
|
+
// a branch with an open PR would land it behind the PR's back).
|
|
59
60
|
let prs = new Map();
|
|
61
|
+
let prListingError;
|
|
60
62
|
const ghEnabled = options.arbiterUrl !== undefined && isGitHubArbiterUrl(options.arbiterUrl);
|
|
61
63
|
if (ghEnabled && branches.length > 0) {
|
|
62
64
|
const listPRs = options.listOpenPullRequests ?? listOpenPullRequestsViaGh;
|
|
@@ -69,45 +71,76 @@ export function surfaceMergeQuestions(options) {
|
|
|
69
71
|
});
|
|
70
72
|
}
|
|
71
73
|
catch (err) {
|
|
72
|
-
// `gh` is the ENRICHMENT layer — a failure must NEVER suppress the
|
|
73
|
-
// floor's surfacing. Note it and proceed with an empty PR map.
|
|
74
74
|
const detail = err instanceof Error ? err.message : String(err);
|
|
75
|
-
note(`merge-question surfacer: gh pr list failed (${detail})
|
|
76
|
-
prs =
|
|
75
|
+
note(`merge-question surfacer: gh pr list failed (${detail}); asking about no branch this pass.`);
|
|
76
|
+
prs = undefined;
|
|
77
|
+
prListingError = detail;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// The item locks by task slug (`task-<slug>` entries only).
|
|
81
|
+
const locks = new Map();
|
|
82
|
+
for (const lock of options.locks ?? []) {
|
|
83
|
+
if (lock.entry.startsWith('task-')) {
|
|
84
|
+
locks.set(lock.entry.slice('task-'.length), lock);
|
|
77
85
|
}
|
|
78
86
|
}
|
|
79
87
|
const surfaced = [];
|
|
80
88
|
const skipped = [];
|
|
89
|
+
const skip = (branch, reason) => {
|
|
90
|
+
skipped.push({ ref: branch.ref, slug: branch.slug, reason });
|
|
91
|
+
};
|
|
92
|
+
// The `main` every question of this pass is asked against: recorded on the
|
|
93
|
+
// entry so a `strictMergeApproval` apply can tell whether `main` moved since
|
|
94
|
+
// (task `strict-merge-approval-restale-check-runs-before-the-continue-rebase`).
|
|
95
|
+
// Unresolvable (a test seam over a non-repo) ⇒ no base recorded.
|
|
96
|
+
const askedAtMain = branches.length > 0 ? resolveCommit(cwd, base, env) : undefined;
|
|
81
97
|
for (const branch of branches) {
|
|
82
98
|
const item = `task:${branch.slug}`;
|
|
83
|
-
// Idempotency: if the sidecar already carries a PENDING `kind: merge`
|
|
84
|
-
// entry, this surfacer must not append a duplicate. (An ANSWERED merge
|
|
85
|
-
// entry is fine — apply will dispatch it; appending a new entry would
|
|
86
|
-
// re-pause the sidecar unnecessarily.)
|
|
87
|
-
if (alreadyHasPendingMergeQuestion(cwd, item)) {
|
|
88
|
-
skipped.push({
|
|
89
|
-
ref: branch.ref,
|
|
90
|
-
slug: branch.slug,
|
|
91
|
-
reason: 'already-pending-merge-question',
|
|
92
|
-
});
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
99
|
const itemPath = findTaskItemPath(cwd, branch.slug);
|
|
96
100
|
if (itemPath === undefined) {
|
|
101
|
+
// A terminal body (done / cancelled): its branch is finished business
|
|
102
|
+
// (a squash-merged PR whose branch was not deleted rests here too).
|
|
103
|
+
if (isTerminalTask(cwd, branch.slug)) {
|
|
104
|
+
skip(branch, 'terminal');
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
97
107
|
// The `branch:`/`ref:`-keyed sidecar identity (SPEC sidecar Q5-i, the
|
|
98
108
|
// cross-cutting open question SHARED with the stuck-lock surfacer) is
|
|
99
|
-
// OUT OF SCOPE
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
// OUT OF SCOPE: without a body to flip `needsAnswers` on, persist would
|
|
110
|
+
// tear the invariant. Skip with the reason so the case is visible.
|
|
111
|
+
skip(branch, 'no-item-body');
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
// Idempotency: never append a second merge question. A PENDING one is
|
|
115
|
+
// awaiting its answer; an ANSWERED one awaits its apply (appending would
|
|
116
|
+
// re-pause the sidecar and strand the answer).
|
|
117
|
+
const existing = existingMergeQuestion(cwd, item);
|
|
118
|
+
if (existing === 'pending') {
|
|
119
|
+
skip(branch, 'already-pending-merge-question');
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (existing === 'answered') {
|
|
123
|
+
skip(branch, 'merge-question-answered');
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (prs === undefined) {
|
|
127
|
+
skip(branch, 'pr-state-unknown');
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (prs.has(branch.ref)) {
|
|
131
|
+
skip(branch, 'open-pr');
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const lock = locks.get(branch.slug);
|
|
135
|
+
if (lock !== undefined && lock.keptFor !== 'propose-pr') {
|
|
136
|
+
skip(branch, 'lock-held');
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!tipHasDoneMove(cwd, branch, env)) {
|
|
140
|
+
skip(branch, 'no-done-move');
|
|
107
141
|
continue;
|
|
108
142
|
}
|
|
109
|
-
const
|
|
110
|
-
const question = buildMergeQuestion(branch, pr);
|
|
143
|
+
const question = buildMergeQuestion(branch, ghEnabled, askedAtMain);
|
|
111
144
|
const result = persist({
|
|
112
145
|
cwd,
|
|
113
146
|
item,
|
|
@@ -117,11 +150,7 @@ export function surfaceMergeQuestions(options) {
|
|
|
117
150
|
note,
|
|
118
151
|
});
|
|
119
152
|
if (result.outcome === 'nothing') {
|
|
120
|
-
|
|
121
|
-
ref: branch.ref,
|
|
122
|
-
slug: branch.slug,
|
|
123
|
-
reason: 'persist-nothing',
|
|
124
|
-
});
|
|
153
|
+
skip(branch, 'persist-nothing');
|
|
125
154
|
continue;
|
|
126
155
|
}
|
|
127
156
|
surfaced.push({
|
|
@@ -130,10 +159,14 @@ export function surfaceMergeQuestions(options) {
|
|
|
130
159
|
ref: branch.ref,
|
|
131
160
|
sidecarPath: result.sidecarPath,
|
|
132
161
|
commit: result.commit,
|
|
133
|
-
prUrl: pr?.url,
|
|
134
162
|
});
|
|
135
163
|
}
|
|
136
|
-
return {
|
|
164
|
+
return {
|
|
165
|
+
considered: branches.length,
|
|
166
|
+
surfaced,
|
|
167
|
+
skipped,
|
|
168
|
+
...(prListingError === undefined ? {} : { prListingError }),
|
|
169
|
+
};
|
|
137
170
|
}
|
|
138
171
|
/**
|
|
139
172
|
* Build the merge-question for ONE unmerged branch.
|
|
@@ -148,19 +181,13 @@ export function surfaceMergeQuestions(options) {
|
|
|
148
181
|
* `kind: merge` is what the apply rung reads to route the answer to the
|
|
149
182
|
* deterministic land primitive.
|
|
150
183
|
*/
|
|
151
|
-
function buildMergeQuestion(branch,
|
|
184
|
+
function buildMergeQuestion(branch, ghEnabled, askedAtMain) {
|
|
152
185
|
const contextLines = [
|
|
153
186
|
`The branch \`${branch.ref}\` is not reachable from \`main\` — it carries pushed work that has not yet landed.`,
|
|
187
|
+
ghEnabled
|
|
188
|
+
? 'It has no open PR (none was opened, or its PR was closed without merging).'
|
|
189
|
+
: 'No host PR metadata available (git-alone floor: the branch is the source of truth).',
|
|
154
190
|
];
|
|
155
|
-
if (pr !== undefined) {
|
|
156
|
-
const titleSuffix = pr.title ? `: ${pr.title}` : '';
|
|
157
|
-
const urlSuffix = pr.url ? ` (${pr.url})` : '';
|
|
158
|
-
const stateSuffix = pr.state ? ` [${pr.state}]` : '';
|
|
159
|
-
contextLines.push(`Open PR #${pr.number}${stateSuffix}${titleSuffix}${urlSuffix}.`);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
contextLines.push(`No host PR metadata available (git-alone floor — the branch is the source of truth).`);
|
|
163
|
-
}
|
|
164
191
|
return {
|
|
165
192
|
question: `Land \`${branch.ref}\`? An unmerged \`work/*\` branch is awaiting an integration decision.`,
|
|
166
193
|
context: contextLines.join('\n'),
|
|
@@ -168,25 +195,62 @@ function buildMergeQuestion(branch, pr) {
|
|
|
168
195
|
default: 'merge | hold | drop',
|
|
169
196
|
// MACHINE dispatch signal — the apply layer routes on this, not on `default`.
|
|
170
197
|
kind: 'merge',
|
|
198
|
+
...(askedAtMain === undefined ? {} : { askedAtMain }),
|
|
171
199
|
};
|
|
172
200
|
}
|
|
173
|
-
/**
|
|
174
|
-
function
|
|
201
|
+
/** The full sha `rev` names in `cwd`, or `undefined` when it does not resolve. */
|
|
202
|
+
function resolveCommit(cwd, rev, env) {
|
|
203
|
+
let res;
|
|
204
|
+
try {
|
|
205
|
+
res = gitSoft(['rev-parse', '--verify', '--quiet', `${rev}^{commit}`], cwd, env);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (res.status !== 0)
|
|
211
|
+
return undefined;
|
|
212
|
+
const sha = res.stdout.trim();
|
|
213
|
+
return sha === '' ? undefined : sha;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Probe the sidecar for an existing `kind: merge` entry: `pending` when one is
|
|
217
|
+
* unanswered, `answered` when every one is answered, `undefined` when there is
|
|
218
|
+
* none.
|
|
219
|
+
*/
|
|
220
|
+
function existingMergeQuestion(cwd, item) {
|
|
175
221
|
const rel = sidecarPathFor(item);
|
|
176
222
|
const abs = join(cwd, rel);
|
|
177
223
|
if (!existsSync(abs)) {
|
|
178
|
-
return
|
|
224
|
+
return undefined;
|
|
179
225
|
}
|
|
180
226
|
try {
|
|
181
|
-
const
|
|
182
|
-
|
|
227
|
+
const merge = parseSidecar(readFileSync(abs, 'utf8')).entries.filter((e) => e.kind === 'merge');
|
|
228
|
+
if (merge.length === 0)
|
|
229
|
+
return undefined;
|
|
230
|
+
return merge.some((e) => !isEntryAnswered(e)) ? 'pending' : 'answered';
|
|
183
231
|
}
|
|
184
232
|
catch {
|
|
185
233
|
// A malformed sidecar is not THIS surfacer's problem — pretend there is
|
|
186
|
-
// no
|
|
187
|
-
return
|
|
234
|
+
// no merge-question and let the persist write surface the issue.
|
|
235
|
+
return undefined;
|
|
188
236
|
}
|
|
189
237
|
}
|
|
238
|
+
/** Does the body of `slug` rest in a terminal task folder? */
|
|
239
|
+
function isTerminalTask(cwd, slug) {
|
|
240
|
+
return TERMINAL_TASK_FOLDERS.some((folder) => existsSync(join(cwd, workItemRel(folder, `${slug}.md`))));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Does the branch tip carry the task's done-move (its body at
|
|
244
|
+
* `work/tasks/done/<slug>.md`)? The answered-merge land is the
|
|
245
|
+
* committed-recovery tail, which presupposes it. Read at the tip sha the
|
|
246
|
+
* listing gave; a branch listed without one is not asked about.
|
|
247
|
+
*/
|
|
248
|
+
function tipHasDoneMove(cwd, branch, env) {
|
|
249
|
+
if (branch.sha === undefined)
|
|
250
|
+
return false;
|
|
251
|
+
const done = workItemRel('done', `${branch.slug}.md`);
|
|
252
|
+
return (gitSoft(['cat-file', '-e', `${branch.sha}:${done}`], cwd, env).status === 0);
|
|
253
|
+
}
|
|
190
254
|
/** Locate the task body `work/<folder>/<slug>.md` across lifecycle folders. */
|
|
191
255
|
function findTaskItemPath(cwd, slug) {
|
|
192
256
|
for (const folder of TASK_FOLDERS) {
|
|
@@ -202,23 +266,51 @@ function gitSoft(args, cwd, env) {
|
|
|
202
266
|
return run('git', args, cwd, { env });
|
|
203
267
|
}
|
|
204
268
|
/**
|
|
205
|
-
* Production FLOOR: enumerate
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
269
|
+
* Production FLOOR: enumerate the ARBITER's task build branches
|
|
270
|
+
* (`work/task-<slug>`, the {@link workBranchRef} form) whose tip is NOT
|
|
271
|
+
* reachable from the arbiter's `<base>`.
|
|
272
|
+
*
|
|
273
|
+
* WHERE the arbiter's refs live depends on the repo `cwd` is:
|
|
274
|
+
*
|
|
275
|
+
* - A **clone** (non-bare, with an `<arbiter>` remote): the arbiter's branches
|
|
276
|
+
* are the remote-tracking refs `refs/remotes/<arbiter>/work/*`, checked
|
|
277
|
+
* against `refs/remotes/<arbiter>/<base>`. Local `refs/heads/work/*` in a
|
|
278
|
+
* clone are this machine's own (possibly unpushed or stale) heads, not the
|
|
279
|
+
* arbiter's, so they are NOT listed.
|
|
280
|
+
* - The **hub mirror** (a `--bare` clone, or a worktree added from one, where
|
|
281
|
+
* `core.bare` reads `true`) or a repo with no `<arbiter>` remote (the repo IS
|
|
282
|
+
* the arbiter's ref store): the local heads `refs/heads/work/*`, checked
|
|
283
|
+
* against the local `<base>`.
|
|
284
|
+
*
|
|
285
|
+
* The item slug comes from {@link parseWorkBranchRef}, never from slicing the
|
|
286
|
+
* ref. Only the plain BUILD branch of a task (`namespace: 'task'`, no producer)
|
|
287
|
+
* is listed: an intake branch (`work/intake-*`) creates an item rather than
|
|
288
|
+
* building one, a spec branch (`work/spec-*`) carries tasking, and an
|
|
289
|
+
* un-namespaced `work/<slug>` is a pre-cutover ref `parseWorkBranchRef` refuses
|
|
290
|
+
* (the clean-break stance). None of those is what a `kind: merge` answer lands.
|
|
291
|
+
*
|
|
292
|
+
* Purely local: it reads refs already in `cwd` (no fetch, no `ls-remote`); the
|
|
293
|
+
* caller refreshes them. A repo whose `<base>` does not resolve (e.g. a fresh
|
|
294
|
+
* init before the first commit, or a clone that never fetched `<base>`) yields
|
|
295
|
+
* the empty list: without a base, "unmerged" is meaningless and every branch
|
|
296
|
+
* would over-surface.
|
|
209
297
|
*/
|
|
210
298
|
export function listUnmergedWorkBranchesViaGit(input) {
|
|
211
299
|
const { cwd, base, env } = input;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const
|
|
300
|
+
const arbiter = input.arbiter ?? 'origin';
|
|
301
|
+
const source = arbiterRefSource(cwd, arbiter, env);
|
|
302
|
+
const baseRef = source === 'remote-tracking'
|
|
303
|
+
? `refs/remotes/${arbiter}/${base}`
|
|
304
|
+
: `refs/heads/${base}`;
|
|
305
|
+
const branchPrefix = source === 'remote-tracking' ? `refs/remotes/${arbiter}/` : 'refs/heads/';
|
|
306
|
+
const haveBase = gitSoft(['rev-parse', '--verify', '--quiet', `${baseRef}^{commit}`], cwd, env);
|
|
215
307
|
if (haveBase.status !== 0) {
|
|
216
308
|
return [];
|
|
217
309
|
}
|
|
218
310
|
const refs = gitSoft([
|
|
219
311
|
'for-each-ref',
|
|
220
|
-
'--format=%(refname
|
|
221
|
-
|
|
312
|
+
'--format=%(refname) %(objectname)',
|
|
313
|
+
`${branchPrefix}work/`,
|
|
222
314
|
], cwd, env);
|
|
223
315
|
if (refs.status !== 0) {
|
|
224
316
|
return [];
|
|
@@ -233,34 +325,53 @@ export function listUnmergedWorkBranchesViaGit(input) {
|
|
|
233
325
|
if (space === -1) {
|
|
234
326
|
continue;
|
|
235
327
|
}
|
|
236
|
-
const
|
|
328
|
+
const fullRef = line.slice(0, space);
|
|
237
329
|
const sha = line.slice(space + 1).trim();
|
|
238
|
-
if (!
|
|
330
|
+
if (!fullRef.startsWith(branchPrefix)) {
|
|
239
331
|
continue;
|
|
240
332
|
}
|
|
241
|
-
|
|
242
|
-
|
|
333
|
+
// The branch name AS IT IS ON THE ARBITER (`work/task-<slug>`), whichever
|
|
334
|
+
// local namespace it was read from.
|
|
335
|
+
const ref = fullRef.slice(branchPrefix.length);
|
|
336
|
+
const parsed = parseWorkBranchRef(ref);
|
|
337
|
+
if (parsed === undefined ||
|
|
338
|
+
parsed.namespace !== 'task' ||
|
|
339
|
+
parsed.producer !== undefined) {
|
|
243
340
|
continue;
|
|
244
341
|
}
|
|
245
|
-
// `git merge-base --is-ancestor <sha> <base
|
|
342
|
+
// `git merge-base --is-ancestor <sha> <base>`: exit 0 ⇒ reachable
|
|
246
343
|
// (merged), exit 1 ⇒ unmerged.
|
|
247
|
-
const reach = gitSoft(['merge-base', '--is-ancestor', sha,
|
|
344
|
+
const reach = gitSoft(['merge-base', '--is-ancestor', sha, baseRef], cwd, env);
|
|
248
345
|
if (reach.status !== 0) {
|
|
249
|
-
unmerged.push({ ref, slug, sha });
|
|
346
|
+
unmerged.push({ ref, slug: parsed.slug, sha });
|
|
250
347
|
}
|
|
251
348
|
}
|
|
252
349
|
return unmerged;
|
|
253
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* Which local ref namespace holds the arbiter's branches in `cwd`: the local
|
|
353
|
+
* heads for the bare hub mirror (and its worktrees, which share its
|
|
354
|
+
* `core.bare = true` config) or for a repo with no `<arbiter>` remote; the
|
|
355
|
+
* remote-tracking refs for an ordinary clone.
|
|
356
|
+
*/
|
|
357
|
+
function arbiterRefSource(cwd, arbiter, env) {
|
|
358
|
+
const bare = gitSoft(['config', '--bool', 'core.bare'], cwd, env);
|
|
359
|
+
if (bare.status === 0 && bare.stdout.trim() === 'true') {
|
|
360
|
+
return 'local-heads';
|
|
361
|
+
}
|
|
362
|
+
const remote = gitSoft(['remote', 'get-url', arbiter], cwd, env);
|
|
363
|
+
return remote.status === 0 ? 'remote-tracking' : 'local-heads';
|
|
364
|
+
}
|
|
254
365
|
/**
|
|
255
366
|
* Production CEILING: shell `gh pr list --state open --json …` and index the
|
|
256
|
-
* results by their `headRefName
|
|
257
|
-
*
|
|
258
|
-
*
|
|
367
|
+
* results by their `headRefName`, so the surfacer can skip a branch with an
|
|
368
|
+
* open PR. A non-zero `gh` (or output that is not a JSON array) THROWS: the
|
|
369
|
+
* surfacer then asks about no branch this pass, rather than asking about
|
|
370
|
+
* branches whose PR it cannot see.
|
|
259
371
|
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
* of >200 open PRs degrades to floor-only output, never corrupts it.
|
|
372
|
+
* The `--state open`, `--base <base>`, and `--limit 200` arguments are
|
|
373
|
+
* DELIBERATE ceilings: a PR targeting a non-`main` base (e.g. a stacked PR) or
|
|
374
|
+
* the case of >200 open PRs is not seen, so its branch may still be asked about.
|
|
264
375
|
*/
|
|
265
376
|
export function listOpenPullRequestsViaGh(input) {
|
|
266
377
|
const { cwd, ghBin, base, env } = input;
|
|
@@ -277,17 +388,17 @@ export function listOpenPullRequestsViaGh(input) {
|
|
|
277
388
|
'number,url,title,headRefName,state',
|
|
278
389
|
], cwd, { env });
|
|
279
390
|
if (result.status !== 0) {
|
|
280
|
-
|
|
391
|
+
throw new Error(`${ghBin} pr list exited ${result.status}: ${result.stderr.trim().slice(0, 300)}`);
|
|
281
392
|
}
|
|
282
393
|
let parsed;
|
|
283
394
|
try {
|
|
284
395
|
parsed = JSON.parse(result.stdout);
|
|
285
396
|
}
|
|
286
397
|
catch {
|
|
287
|
-
|
|
398
|
+
throw new Error(`${ghBin} pr list printed no JSON`);
|
|
288
399
|
}
|
|
289
400
|
if (!Array.isArray(parsed)) {
|
|
290
|
-
|
|
401
|
+
throw new Error(`${ghBin} pr list printed no JSON array`);
|
|
291
402
|
}
|
|
292
403
|
const out = new Map();
|
|
293
404
|
for (const raw of parsed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-question-surfacer.js","sourceRoot":"","sources":["../src/merge-question-surfacer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"merge-question-surfacer.js","sourceRoot":"","sources":["../src/merge-question-surfacer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { MergeQuestions } from './config.js';
|
|
2
|
+
import { type LockEntry } from './item-lock.js';
|
|
3
|
+
import { type SurfaceMergeQuestionsOptions, type SurfaceMergeQuestionsResult } from './merge-question-surfacer.js';
|
|
4
|
+
/**
|
|
5
|
+
* The **merge-question TICK** (task `wire-merge-questions-into-the-advance-tick`):
|
|
6
|
+
* the one production caller of {@link surfaceMergeQuestions}, behind the
|
|
7
|
+
* `mergeQuestions: off | ask` gate. Surfacing is deterministic (it reads runner
|
|
8
|
+
* state, no agent), so it runs as its own step rather than as a rung of the
|
|
9
|
+
* per-item tick:
|
|
10
|
+
*
|
|
11
|
+
* - the laptop bare `advance` runs it before selecting (`advance-drivers.ts`);
|
|
12
|
+
* - CI runs it as the no-agent `surface-merge-questions` job of the generated
|
|
13
|
+
* `advance-lifecycle` workflow, through `dorfl surface-merge-questions`
|
|
14
|
+
* (decision 5). The read-only `enumerate` job does not run it.
|
|
15
|
+
*
|
|
16
|
+
* One pass: fetch the arbiter (so the listing sees its current work branches),
|
|
17
|
+
* read the held item locks STRICTLY (a lock that cannot be read must not look
|
|
18
|
+
* like "no live build"), run the surfacer in `cwd` (each question is its own
|
|
19
|
+
* local commit on `HEAD`, via `persistSurfacedQuestions`), then publish those
|
|
20
|
+
* commits to `<arbiter>/main` through the tree-less publish seam (re-fetch and
|
|
21
|
+
* rebase on a race, never `--force`).
|
|
22
|
+
*/
|
|
23
|
+
/** Options of {@link runMergeQuestionTick}. */
|
|
24
|
+
export interface MergeQuestionTickOptions {
|
|
25
|
+
/** The working clone (checked out on `main`) the questions are committed in. */
|
|
26
|
+
cwd: string;
|
|
27
|
+
/** The arbiter remote NAME in `cwd`. */
|
|
28
|
+
arbiter: string;
|
|
29
|
+
/** The resolved `mergeQuestions` gate. `off` ⇒ nothing runs. */
|
|
30
|
+
mergeQuestions: MergeQuestions;
|
|
31
|
+
/** The base branch. Default `main`. */
|
|
32
|
+
base?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Push the surfaced questions to `<arbiter>/main`. Default `true`. The laptop
|
|
35
|
+
* tick passes `false` when it has no arbiter configured (its checkout sits on
|
|
36
|
+
* the real `main`).
|
|
37
|
+
*/
|
|
38
|
+
publish?: boolean;
|
|
39
|
+
/** The `gh` binary for the open-PR listing (GitHub arbiters). */
|
|
40
|
+
ghBin?: string;
|
|
41
|
+
env?: NodeJS.ProcessEnv;
|
|
42
|
+
note?: (message: string) => void;
|
|
43
|
+
/** Seam: the surfacer (tests). */
|
|
44
|
+
surface?: (options: SurfaceMergeQuestionsOptions) => SurfaceMergeQuestionsResult;
|
|
45
|
+
/** Seam: the strict lock read (tests). */
|
|
46
|
+
readLocks?: (cwd: string, arbiter: string, env: NodeJS.ProcessEnv | undefined) => Promise<LockEntry[]>;
|
|
47
|
+
}
|
|
48
|
+
/** What one {@link runMergeQuestionTick} pass did. */
|
|
49
|
+
export interface MergeQuestionTickResult {
|
|
50
|
+
/** `false` when the gate is `off` or a read failed (nothing surfaced). */
|
|
51
|
+
ran: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* `true` when a read the pass depends on failed (fetch, lock refs, or the
|
|
54
|
+
* open-PR listing of a GitHub arbiter).
|
|
55
|
+
*/
|
|
56
|
+
failed: boolean;
|
|
57
|
+
/** The surfacer's result, when it ran. */
|
|
58
|
+
result?: SurfaceMergeQuestionsResult;
|
|
59
|
+
/** A one-paragraph summary for the log. */
|
|
60
|
+
message: string;
|
|
61
|
+
}
|
|
62
|
+
/** Run one merge-question pass (see the module doc). Never throws. */
|
|
63
|
+
export declare function runMergeQuestionTick(options: MergeQuestionTickOptions): Promise<MergeQuestionTickResult>;
|
|
64
|
+
//# sourceMappingURL=merge-question-tick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-question-tick.d.ts","sourceRoot":"","sources":["../src/merge-question-tick.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAChD,OAAO,EAA4B,KAAK,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAEN,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,MAAM,8BAA8B,CAAC;AAGtC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACxC,gFAAgF;IAChF,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,cAAc,EAAE,cAAc,CAAC;IAC/B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,kCAAkC;IAClC,OAAO,CAAC,EAAE,CACT,OAAO,EAAE,4BAA4B,KACjC,2BAA2B,CAAC;IACjC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,KAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC1B;AAED,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACvC,0EAA0E;IAC1E,GAAG,EAAE,OAAO,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,sEAAsE;AACtE,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAqGlC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { runAsync } from './git.js';
|
|
2
|
+
import { listItemLockEntriesStrict } from './item-lock.js';
|
|
3
|
+
import { surfaceMergeQuestions, } from './merge-question-surfacer.js';
|
|
4
|
+
import { refWrite } from './ref-write.js';
|
|
5
|
+
/** Run one merge-question pass (see the module doc). Never throws. */
|
|
6
|
+
export async function runMergeQuestionTick(options) {
|
|
7
|
+
const { cwd, arbiter, env } = options;
|
|
8
|
+
const note = options.note ?? (() => { });
|
|
9
|
+
if (options.mergeQuestions === 'off') {
|
|
10
|
+
return {
|
|
11
|
+
ran: false,
|
|
12
|
+
failed: false,
|
|
13
|
+
message: 'mergeQuestions is off: no merge question is surfaced.',
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const url = await runAsync('git', ['remote', 'get-url', arbiter], cwd, {
|
|
17
|
+
env,
|
|
18
|
+
});
|
|
19
|
+
const arbiterUrl = url.status === 0 ? url.stdout.trim() : undefined;
|
|
20
|
+
let locks = [];
|
|
21
|
+
if (arbiterUrl !== undefined) {
|
|
22
|
+
// The arbiter's CURRENT work branches (the floor reads the remote-tracking
|
|
23
|
+
// refs of a clone) and `main` (the reachability base).
|
|
24
|
+
const fetched = await runAsync('git', ['fetch', '--prune', '--quiet', arbiter], cwd, { env });
|
|
25
|
+
if (fetched.status !== 0) {
|
|
26
|
+
return {
|
|
27
|
+
ran: false,
|
|
28
|
+
failed: true,
|
|
29
|
+
message: `merge questions: fetching ${arbiter} failed (${fetched.stderr.trim()}); nothing surfaced.`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
locks = await (options.readLocks ?? listItemLockEntriesStrict)(cwd, arbiter, env);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
37
|
+
return {
|
|
38
|
+
ran: false,
|
|
39
|
+
failed: true,
|
|
40
|
+
message: `merge questions: the item locks on ${arbiter} could not be read (${detail}); nothing surfaced.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const result = (options.surface ?? surfaceMergeQuestions)({
|
|
45
|
+
cwd,
|
|
46
|
+
arbiterUrl,
|
|
47
|
+
arbiter,
|
|
48
|
+
base: options.base,
|
|
49
|
+
ghBin: options.ghBin,
|
|
50
|
+
env,
|
|
51
|
+
note,
|
|
52
|
+
locks,
|
|
53
|
+
});
|
|
54
|
+
for (const s of result.skipped) {
|
|
55
|
+
note(`merge question: not asked about ${s.ref} (${s.reason}).`);
|
|
56
|
+
}
|
|
57
|
+
for (const s of result.surfaced) {
|
|
58
|
+
note(`merge question: asked about ${s.ref} (${s.sidecarPath}).`);
|
|
59
|
+
}
|
|
60
|
+
// A GitHub arbiter whose open PRs could not be listed: the surfacer asked
|
|
61
|
+
// about no branch (it cannot tell which have an open PR). Report the pass as
|
|
62
|
+
// FAILED so it is visible (gate-3 of PR #459: an uncredentialed `gh` in CI
|
|
63
|
+
// otherwise skipped every branch as `pr-state-unknown` with exit 0).
|
|
64
|
+
if (result.prListingError !== undefined) {
|
|
65
|
+
return {
|
|
66
|
+
ran: true,
|
|
67
|
+
failed: true,
|
|
68
|
+
result,
|
|
69
|
+
message: `merge questions: the open PRs on ${arbiter} could not be listed ` +
|
|
70
|
+
`(${result.prListingError}); no merge question was asked. Give gh a ` +
|
|
71
|
+
'credential (GH_TOKEN) that can read pull requests.',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (result.surfaced.length > 0 &&
|
|
75
|
+
options.publish !== false &&
|
|
76
|
+
arbiterUrl !== undefined) {
|
|
77
|
+
await refWrite.publishTreelessResult({
|
|
78
|
+
cwd,
|
|
79
|
+
arbiter,
|
|
80
|
+
// The same large liveness ceiling the in-place tree-less publish uses: a
|
|
81
|
+
// clean re-rebase never counts against a small budget.
|
|
82
|
+
retries: 1000,
|
|
83
|
+
env,
|
|
84
|
+
note,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
ran: true,
|
|
89
|
+
failed: false,
|
|
90
|
+
result,
|
|
91
|
+
message: `merge questions: ${result.surfaced.length} surfaced, ` +
|
|
92
|
+
`${result.skipped.length} not asked, of ${result.considered} unmerged ` +
|
|
93
|
+
'work branch(es).',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=merge-question-tick.js.map
|