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
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import {runAsync} from './git.js';
|
|
2
|
+
import type {MergeQuestions} from './config.js';
|
|
3
|
+
import {listItemLockEntriesStrict, type LockEntry} from './item-lock.js';
|
|
4
|
+
import {
|
|
5
|
+
surfaceMergeQuestions,
|
|
6
|
+
type SurfaceMergeQuestionsOptions,
|
|
7
|
+
type SurfaceMergeQuestionsResult,
|
|
8
|
+
} from './merge-question-surfacer.js';
|
|
9
|
+
import {refWrite} from './ref-write.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The **merge-question TICK** (task `wire-merge-questions-into-the-advance-tick`):
|
|
13
|
+
* the one production caller of {@link surfaceMergeQuestions}, behind the
|
|
14
|
+
* `mergeQuestions: off | ask` gate. Surfacing is deterministic (it reads runner
|
|
15
|
+
* state, no agent), so it runs as its own step rather than as a rung of the
|
|
16
|
+
* per-item tick:
|
|
17
|
+
*
|
|
18
|
+
* - the laptop bare `advance` runs it before selecting (`advance-drivers.ts`);
|
|
19
|
+
* - CI runs it as the no-agent `surface-merge-questions` job of the generated
|
|
20
|
+
* `advance-lifecycle` workflow, through `dorfl surface-merge-questions`
|
|
21
|
+
* (decision 5). The read-only `enumerate` job does not run it.
|
|
22
|
+
*
|
|
23
|
+
* One pass: fetch the arbiter (so the listing sees its current work branches),
|
|
24
|
+
* read the held item locks STRICTLY (a lock that cannot be read must not look
|
|
25
|
+
* like "no live build"), run the surfacer in `cwd` (each question is its own
|
|
26
|
+
* local commit on `HEAD`, via `persistSurfacedQuestions`), then publish those
|
|
27
|
+
* commits to `<arbiter>/main` through the tree-less publish seam (re-fetch and
|
|
28
|
+
* rebase on a race, never `--force`).
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/** Options of {@link runMergeQuestionTick}. */
|
|
32
|
+
export interface MergeQuestionTickOptions {
|
|
33
|
+
/** The working clone (checked out on `main`) the questions are committed in. */
|
|
34
|
+
cwd: string;
|
|
35
|
+
/** The arbiter remote NAME in `cwd`. */
|
|
36
|
+
arbiter: string;
|
|
37
|
+
/** The resolved `mergeQuestions` gate. `off` ⇒ nothing runs. */
|
|
38
|
+
mergeQuestions: MergeQuestions;
|
|
39
|
+
/** The base branch. Default `main`. */
|
|
40
|
+
base?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Push the surfaced questions to `<arbiter>/main`. Default `true`. The laptop
|
|
43
|
+
* tick passes `false` when it has no arbiter configured (its checkout sits on
|
|
44
|
+
* the real `main`).
|
|
45
|
+
*/
|
|
46
|
+
publish?: boolean;
|
|
47
|
+
/** The `gh` binary for the open-PR listing (GitHub arbiters). */
|
|
48
|
+
ghBin?: string;
|
|
49
|
+
env?: NodeJS.ProcessEnv;
|
|
50
|
+
note?: (message: string) => void;
|
|
51
|
+
/** Seam: the surfacer (tests). */
|
|
52
|
+
surface?: (
|
|
53
|
+
options: SurfaceMergeQuestionsOptions,
|
|
54
|
+
) => SurfaceMergeQuestionsResult;
|
|
55
|
+
/** Seam: the strict lock read (tests). */
|
|
56
|
+
readLocks?: (
|
|
57
|
+
cwd: string,
|
|
58
|
+
arbiter: string,
|
|
59
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
60
|
+
) => Promise<LockEntry[]>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** What one {@link runMergeQuestionTick} pass did. */
|
|
64
|
+
export interface MergeQuestionTickResult {
|
|
65
|
+
/** `false` when the gate is `off` or a read failed (nothing surfaced). */
|
|
66
|
+
ran: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* `true` when a read the pass depends on failed (fetch, lock refs, or the
|
|
69
|
+
* open-PR listing of a GitHub arbiter).
|
|
70
|
+
*/
|
|
71
|
+
failed: boolean;
|
|
72
|
+
/** The surfacer's result, when it ran. */
|
|
73
|
+
result?: SurfaceMergeQuestionsResult;
|
|
74
|
+
/** A one-paragraph summary for the log. */
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Run one merge-question pass (see the module doc). Never throws. */
|
|
79
|
+
export async function runMergeQuestionTick(
|
|
80
|
+
options: MergeQuestionTickOptions,
|
|
81
|
+
): Promise<MergeQuestionTickResult> {
|
|
82
|
+
const {cwd, arbiter, env} = options;
|
|
83
|
+
const note = options.note ?? (() => {});
|
|
84
|
+
if (options.mergeQuestions === 'off') {
|
|
85
|
+
return {
|
|
86
|
+
ran: false,
|
|
87
|
+
failed: false,
|
|
88
|
+
message: 'mergeQuestions is off: no merge question is surfaced.',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const url = await runAsync('git', ['remote', 'get-url', arbiter], cwd, {
|
|
92
|
+
env,
|
|
93
|
+
});
|
|
94
|
+
const arbiterUrl = url.status === 0 ? url.stdout.trim() : undefined;
|
|
95
|
+
let locks: LockEntry[] = [];
|
|
96
|
+
if (arbiterUrl !== undefined) {
|
|
97
|
+
// The arbiter's CURRENT work branches (the floor reads the remote-tracking
|
|
98
|
+
// refs of a clone) and `main` (the reachability base).
|
|
99
|
+
const fetched = await runAsync(
|
|
100
|
+
'git',
|
|
101
|
+
['fetch', '--prune', '--quiet', arbiter],
|
|
102
|
+
cwd,
|
|
103
|
+
{env},
|
|
104
|
+
);
|
|
105
|
+
if (fetched.status !== 0) {
|
|
106
|
+
return {
|
|
107
|
+
ran: false,
|
|
108
|
+
failed: true,
|
|
109
|
+
message: `merge questions: fetching ${arbiter} failed (${fetched.stderr.trim()}); nothing surfaced.`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
locks = await (options.readLocks ?? listItemLockEntriesStrict)(
|
|
114
|
+
cwd,
|
|
115
|
+
arbiter,
|
|
116
|
+
env,
|
|
117
|
+
);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
120
|
+
return {
|
|
121
|
+
ran: false,
|
|
122
|
+
failed: true,
|
|
123
|
+
message: `merge questions: the item locks on ${arbiter} could not be read (${detail}); nothing surfaced.`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const result = (options.surface ?? surfaceMergeQuestions)({
|
|
128
|
+
cwd,
|
|
129
|
+
arbiterUrl,
|
|
130
|
+
arbiter,
|
|
131
|
+
base: options.base,
|
|
132
|
+
ghBin: options.ghBin,
|
|
133
|
+
env,
|
|
134
|
+
note,
|
|
135
|
+
locks,
|
|
136
|
+
});
|
|
137
|
+
for (const s of result.skipped) {
|
|
138
|
+
note(`merge question: not asked about ${s.ref} (${s.reason}).`);
|
|
139
|
+
}
|
|
140
|
+
for (const s of result.surfaced) {
|
|
141
|
+
note(`merge question: asked about ${s.ref} (${s.sidecarPath}).`);
|
|
142
|
+
}
|
|
143
|
+
// A GitHub arbiter whose open PRs could not be listed: the surfacer asked
|
|
144
|
+
// about no branch (it cannot tell which have an open PR). Report the pass as
|
|
145
|
+
// FAILED so it is visible (gate-3 of PR #459: an uncredentialed `gh` in CI
|
|
146
|
+
// otherwise skipped every branch as `pr-state-unknown` with exit 0).
|
|
147
|
+
if (result.prListingError !== undefined) {
|
|
148
|
+
return {
|
|
149
|
+
ran: true,
|
|
150
|
+
failed: true,
|
|
151
|
+
result,
|
|
152
|
+
message:
|
|
153
|
+
`merge questions: the open PRs on ${arbiter} could not be listed ` +
|
|
154
|
+
`(${result.prListingError}); no merge question was asked. Give gh a ` +
|
|
155
|
+
'credential (GH_TOKEN) that can read pull requests.',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
if (
|
|
159
|
+
result.surfaced.length > 0 &&
|
|
160
|
+
options.publish !== false &&
|
|
161
|
+
arbiterUrl !== undefined
|
|
162
|
+
) {
|
|
163
|
+
await refWrite.publishTreelessResult({
|
|
164
|
+
cwd,
|
|
165
|
+
arbiter,
|
|
166
|
+
// The same large liveness ceiling the in-place tree-less publish uses: a
|
|
167
|
+
// clean re-rebase never counts against a small budget.
|
|
168
|
+
retries: 1000,
|
|
169
|
+
env,
|
|
170
|
+
note,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
ran: true,
|
|
175
|
+
failed: false,
|
|
176
|
+
result,
|
|
177
|
+
message:
|
|
178
|
+
`merge questions: ${result.surfaced.length} surfaced, ` +
|
|
179
|
+
`${result.skipped.length} not asked, of ${result.considered} unmerged ` +
|
|
180
|
+
'work branch(es).',
|
|
181
|
+
};
|
|
182
|
+
}
|
package/src/mint-adr.ts
CHANGED
|
@@ -8,6 +8,11 @@ import {
|
|
|
8
8
|
} from './advancing-lock.js';
|
|
9
9
|
import {resolveSidecarIdentity, sidecarPathFor} from './sidecar.js';
|
|
10
10
|
import {ensureSafeSlug} from './slug-safety.js';
|
|
11
|
+
import {
|
|
12
|
+
assertFrontmatterFields,
|
|
13
|
+
quoteYamlScalar,
|
|
14
|
+
singleLineScalarProblem,
|
|
15
|
+
} from './frontmatter.js';
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
18
|
* The **ADR-MINT route** (spec
|
|
@@ -200,6 +205,18 @@ export async function mintAdr(options: MintAdrOptions): Promise<MintAdrResult> {
|
|
|
200
205
|
const adrPath = adrItemRel(adrSlug);
|
|
201
206
|
const by = options.by || resolveBy(cwd, env);
|
|
202
207
|
const title = (options.adrTitle ?? adrSlug).trim() || adrSlug;
|
|
208
|
+
// The drafted title comes from an agent verdict and is written into the ADR's
|
|
209
|
+
// frontmatter: a multi-line / control-character one is REFUSED before any
|
|
210
|
+
// write (task `intake-frontmatter-title-injection-strips-origin-stamp`),
|
|
211
|
+
// leaving the observation intact for a retry.
|
|
212
|
+
const titleProblem = singleLineScalarProblem(title);
|
|
213
|
+
if (titleProblem !== undefined) {
|
|
214
|
+
return {
|
|
215
|
+
outcome: 'usage-error',
|
|
216
|
+
exitCode: 1,
|
|
217
|
+
message: `mint-adr ${item}: the ADR title ${titleProblem}`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
203
220
|
const content =
|
|
204
221
|
options.adrBody !== undefined && options.adrBody.trim() !== ''
|
|
205
222
|
? renderAdrFile(adrSlug, title, options.adrBody.trim())
|
|
@@ -316,9 +333,11 @@ export function buildAdrBody(input: {
|
|
|
316
333
|
*/
|
|
317
334
|
function renderAdrFile(slug: string, title: string, body: string): string {
|
|
318
335
|
const date = new Date().toISOString().slice(0, 10);
|
|
319
|
-
|
|
336
|
+
// The agent-drafted title goes through the shared frontmatter quoter (it
|
|
337
|
+
// THROWS on a multi-line value; `mintAdr` refuses one before this point).
|
|
338
|
+
const rendered = [
|
|
320
339
|
'---',
|
|
321
|
-
`title: ${title}`,
|
|
340
|
+
`title: ${quoteYamlScalar(title)}`,
|
|
322
341
|
'status: accepted',
|
|
323
342
|
`created: ${date}`,
|
|
324
343
|
'---',
|
|
@@ -328,6 +347,13 @@ function renderAdrFile(slug: string, title: string, body: string): string {
|
|
|
328
347
|
body.replace(/\s*$/, ''),
|
|
329
348
|
'',
|
|
330
349
|
].join('\n');
|
|
350
|
+
// Re-parse what we rendered: the frontmatter is wholly runner-rendered.
|
|
351
|
+
assertFrontmatterFields(
|
|
352
|
+
rendered,
|
|
353
|
+
{title, status: 'accepted', created: date},
|
|
354
|
+
{exact: true},
|
|
355
|
+
);
|
|
356
|
+
return rendered;
|
|
331
357
|
}
|
|
332
358
|
|
|
333
359
|
/**
|