@overdeck/desktop 0.45.22 → 0.45.23
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/package.json +1 -1
- package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DOA0KgXx.js} +5 -5
- package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BBu6DSNm.js} +6 -6
- package/server/{agent-gc-Dj2gncak.js → agent-gc-BV1q_2EV.js} +4 -4
- package/server/agent-state-Bg0lhqwj.js +3 -0
- package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-CnzFKSAQ.js} +1 -1
- package/server/{agent-state-service-DistflNn.js → agent-state-service-HoK8U4jW.js} +5 -5
- package/server/{agents-DXdHmRTC.js → agents-B4Bjbkfv.js} +4 -4
- package/server/agents-FlIgQ3ql.js +3 -0
- package/server/{archive-planning-BvDuWNMo.js → archive-planning-DYrYojxl.js} +30 -6
- package/server/{archive-planning-Cp_DC1j-.js → archive-planning-zkJb3BeM.js} +1 -1
- package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
- package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
- package/server/{behavior-CGj16clS.js → behavior-B_-4EKF3.js} +2 -2
- package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-DWdW7vUm.js} +2 -2
- package/server/{build-info-NU3KbXYw.js → build-info-BT096lEl.js} +3 -3
- package/server/{build-info-BRpqQvNd.js → build-info-DgTqZkL5.js} +1 -1
- package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-B7Bt29J0.js} +1 -1
- package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-DDqcGyu8.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-BJum14fs.js → checkpoints-C-AXLfYT.js} +2 -2
- package/server/{checkpoints-B5jFNi2G.js → checkpoints-CpgCjAlN.js} +1 -1
- package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
- package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-but-_qGY.js} +2 -2
- package/server/{claude-permissions-nSFKH78M.js → claude-permissions-H_5wHQZQ.js} +2 -2
- package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-BTENVmYf.js} +1 -1
- package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
- package/server/cli-BsVIHwzC.js +3 -0
- package/server/{cli-CbKNkFE5.js → cli-vBeXbPrq.js} +9 -9
- package/server/{cliproxy-Brf_5MuG.js → cliproxy-Bgb2XCqi.js} +2 -2
- package/server/{cliproxy-bONZDBbC.js → cliproxy-DW0V86F8.js} +1 -1
- package/server/{close-issue-CxReRxIc.js → close-issue-Dn_4c4G8.js} +5 -5
- package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
- package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-hANY_ehE.js} +9 -9
- package/server/codex-Dg7Is5yb.js +3 -0
- package/server/{codex-CbmztVcc.js → codex-TmSi-yTv.js} +27 -8
- package/server/{codex-parser-jl8AeAmB.js → codex-parser-C4gSH-IR.js} +2 -2
- package/server/{config-q4Gvd8dq.js → config-CCvjQf27.js} +2 -2
- package/server/{config-BJKocXKd.js → config-DUIhMN_T.js} +1 -1
- package/server/{config-DeTsoZdR.js → config-DjLOdbgT.js} +2 -2
- package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DvyMuOle.js} +55 -186
- package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BSJkNTdp.js} +1 -1
- package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-CmrYpa47.js} +3 -3
- package/server/{context-layers-DlQKkHH2.js → context-layers-B3Nt58jl.js} +2 -2
- package/server/{context-layers-15gDOk20.js → context-layers-ZYFcWiyc.js} +3 -3
- package/server/{control-settings-D_odMIaC.js → control-settings-aP1ANIlI.js} +4 -4
- package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CNbTLB86.js} +8 -8
- package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-DiG5zWQq.js} +1 -1
- package/server/{conversation-service-C3avRVEr.js → conversation-service-Du-MTNpJ.js} +6 -6
- package/server/{conversation-service-Dq33SYEj.js → conversation-service-Up7FEzIC.js} +1 -1
- package/server/{conversations-H9if0bCQ.js → conversations-6mPANqvL.js} +1 -1
- package/server/{conversations-bYpM9-kZ.js → conversations-DbOs1e9Q.js} +4 -4
- package/server/{cost-wH46-WsJ.js → cost-CW4WSe72.js} +3 -3
- package/server/{cost-Codk1pc2.js → cost-Ca0YTWDw.js} +18 -2
- package/server/{cost-sync-D_cre6WM.js → cost-sync-C0VdGme1.js} +3 -3
- package/server/{dag-CJpgf9A3.js → dag-CdOjJVDT.js} +9 -9
- package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-CT-IypG3.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-B8HbQdqU.js → deacon-DYSEJb48.js} +3 -3
- package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
- package/server/{deacon-CkT_kznS.js → deacon-pRnyD5w9.js} +266 -577
- package/server/deacon-swarm-9jRLS5Ke.js +2 -0
- package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-DftYRDo8.js} +17 -17
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-Bjsho_ha.js} +136 -19
- package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-CM6W1-c6.js} +1 -1
- package/server/{deploy-window-wDf4UgHt.js → deploy-window-DeP_OIRk.js} +77 -10
- package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-BpMoHlkR.js} +2 -2
- package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
- package/server/dist-Bd3vn0Hw.js +3 -0
- package/server/{dist-D-Ed5yVw.js → dist-DyRx4cI7.js} +1 -1
- package/server/{docker-BCZ89M9X.js → docker-BK7HIcBj.js} +2 -2
- package/server/{dod-DbJLYcHv.js → dod-BrSfUHm0.js} +1 -1
- package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
- package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DseivYEy.js} +4 -4
- package/server/{esm-shims-dTeNdq7X.js → esm-shims-CbI3BVkl.js} +1 -1
- package/server/{event-store-CpBGsO6_.js → event-store-Cr5PQwFC.js} +1 -1
- package/server/{event-store-TnWdydfB.js → event-store-tdiY5eDZ.js} +3 -3
- package/server/{events-DSUdR-04.js → events-CC1dgUpx.js} +3 -3
- package/server/{events-Dsuv6qyB.js → events-CvvGK6LT.js} +1 -1
- package/server/{factory-BMrK4TrE.js → factory-CynerjXO.js} +50 -13
- package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-B0pmAz0a.js} +4 -4
- package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-_wUBRD3J.js} +2 -2
- package/server/{features-Bc-Bmiye.js → features-Dhxz-wLc.js} +2 -2
- package/server/{feedback-target-DZ-iAnAa.js → feedback-target-CPS15Vte.js} +7 -7
- package/server/{feedback-target-DS6NUuSs.js → feedback-target-iygZwmMc.js} +1 -1
- package/server/{feedback-writer-BXP6g75N.js → feedback-writer-C9b6ccN1.js} +6 -5
- package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-qmiMbqTZ.js} +1 -1
- package/server/{flywheel-Ctr5uuvo.js → flywheel-DMCUzDWg.js} +1 -1
- package/server/{flywheel-COR0mbRI.js → flywheel-DSSpWmqF.js} +13 -13
- package/server/{flywheel-6WHU4O7A.js → flywheel-DcBkQvgE.js} +14 -14
- package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
- package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
- package/server/forge-B-ZWyTRm.js +2 -0
- package/server/{forge-B1S_KZv4.js → forge-Ch9gCFod.js} +2 -2
- package/server/{from-DpwQ-sc3.js → from-CJ_aH5jD.js} +1 -1
- package/server/{fts-db-DmAcuCkV.js → fts-db-CKgg0VKg.js} +2 -2
- package/server/{fts-operations-7d_RkmWp.js → fts-operations-BrL_VTRr.js} +2 -2
- package/server/{git-utils-Cc3FHDKd.js → git-utils-BVa07a4a.js} +2 -2
- package/server/{git-utils-CsKGnzFA.js → git-utils-Dry_Ka_D.js} +1 -1
- package/server/{github-app-CDPtGF7J.js → github-app-CMBdIFBQ.js} +11 -3
- package/server/{github-app-CU14oYzP.js → github-app-CPfoFAdV.js} +1 -1
- package/server/{github-client-XjTJbBm7.js → github-client--XVlDpwM.js} +2 -2
- package/server/{github-client-CwBZZ3t7.js → github-client-B4QsdE-X.js} +1 -1
- package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-BRbDW-qk.js} +2 -2
- package/server/{harness-binary-B2CTcD84.js → harness-binary-CVio2m-u.js} +1 -1
- package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-qHJBhy3Z.js} +4 -4
- package/server/{health-events-DREeevle.js → health-events-C9B8y1Hm.js} +2 -2
- package/server/{health-events-C1whmd58.js → health-events-CpfvuVmm.js} +1 -1
- package/server/{hooks-yxRsjk-z.js → hooks-DUXw8A0-.js} +2 -2
- package/server/{hooks-B-HItBiS.js → hooks-ltecuFqZ.js} +1 -1
- package/server/{hume-Dz_OymXE.js → hume-BEq0bUDg.js} +2 -2
- package/server/hume-B_DbflNM.js +3 -0
- package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
- package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
- package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-aQ1IxeI3.js} +2 -2
- package/server/{infra-D4iNWMA5.js → infra-CzaSOgul.js} +4 -4
- package/server/{injection-D7T75Pye.js → injection-DZ0PfYa4.js} +7 -7
- package/server/{injection-BVNa4MQW.js → injection-oNZeoDhL.js} +1 -1
- package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-DJKLWcVT.js} +12 -12
- package/server/inspect-agent-ch-F-5Ci.js +2 -0
- package/server/{internal-token-CXsfxslp.js → internal-token-Bb4XeV2x.js} +2 -2
- package/server/{internal-token-C9DdEOKY.js → internal-token-DXdfprGr.js} +1 -1
- package/server/{io-DQR9PMgS.js → io-B3_AHDfr.js} +160 -184
- package/server/{issue-closed-DtmJM0D0.js → issue-closed-zhdvQicO.js} +7 -7
- package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-CreaCkjW.js} +22 -22
- package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
- package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-B5ushCvE.js} +8 -8
- package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-DabvBWUp.js} +1 -1
- package/server/{issues-pDW9VUNz.js → issues-B6ToV6x1.js} +2 -2
- package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-Dhflo1SH.js} +3 -3
- package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-BKPJm4Hv.js} +3 -3
- package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-DdWbHEBu.js} +4 -4
- package/server/{launcher-generator-COgR2By1.js → launcher-generator-CHVm7bGT.js} +10 -9
- package/server/{layers-Cp1To4L8.js → layers-DzxSTGNA.js} +2 -2
- package/server/lifecycle-DfeyBDwA.js +121 -0
- package/server/lifecycle-io-Bsnr2K4F.js +3 -0
- package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-D8iNBcux.js} +37 -37
- package/server/{lifecycle-CtPDcZ9u.js → lifecycle-sycO16hj.js} +6 -6
- package/server/{linear-client-DsFkIxee.js → linear-client-D4zqMnX7.js} +2 -2
- package/server/{linear-client-YwZMDIwQ.js → linear-client-DqhDQO9k.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-C1t-bspg.js → merge-C_ZEhbqI.js} +3 -3
- package/server/{merge-BwsyNRJV.js → merge-DK23JEdS.js} +1 -1
- package/server/{merge-agent-B-SnXOoc.js → merge-agent-BQM3a8z5.js} +1 -1
- package/server/{merge-agent-DDiIjzk-.js → merge-agent-XrB80vfT.js} +28 -28
- package/server/{merge-batch-Byt-QnEl.js → merge-batch-Bwoyr8Je.js} +1 -1
- package/server/{merge-blockers-BYjeXrVN.js → merge-blockers-BsFjGrQ8.js} +2 -2
- package/server/merge-ops-DlB1IM0Y.js +2 -0
- package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-C1KIVr0s.js} +2 -2
- package/server/{merge-set-DiISXcC-.js → merge-set-DLz0MkGT.js} +3 -3
- package/server/{merge-set-6LEglm6o.js → merge-set-DnSYdBEp.js} +1 -1
- package/server/{merge-sync-Do8_q32h.js → merge-sync-DZ9dojJn.js} +2 -2
- package/server/{merge-sync-B95_4in_.js → merge-sync-SSv3E-pl.js} +1 -1
- package/server/{merge-train-CKana8EH.js → merge-train-DxDfBTjr.js} +3 -3
- package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-CyYQUksx.js} +4 -4
- package/server/{merge-verification-CqnUzGEK.js → merge-verification-CSizH3HY.js} +4 -4
- package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-Dt8YPN5S.js} +2 -2
- package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Cx3K0hHi.js} +11 -8
- package/server/node_modules/.package-lock.json +1 -1
- package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
- package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-neK8dHQk.js} +15 -13
- package/server/package-lock.json +2 -2
- package/server/package.json +1 -1
- package/server/{pan-dir-DOcf6ug3.js → pan-dir-DeVUgwA7.js} +78 -58
- package/server/{paths-DooHpt9p.js → paths-_zEts6wc.js} +2 -2
- package/server/{pickup-CaskQ7j6.js → pickup-Dd0Znxxy.js} +1 -1
- package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-0HaEGDlH.js} +186 -67
- package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-6iCJplFZ.js} +1 -1
- package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-D0ykk59O.js} +2 -2
- package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-2sK1apsO.js} +2 -2
- package/server/projects-9SkRpES9.js +3 -0
- package/server/{prompts-EvhMeeHG.js → prompts-Dp4Tpk39.js} +2 -2
- package/server/{providers-DNSQqy2V.js → providers-DKkBXhxU.js} +1 -1
- package/server/{providers-BDDPULlp.js → providers-DV7ec8l7.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
- package/server/public/assets/{dist-Bio7THQU.js → dist-BWR4qFiV.js} +1 -1
- package/server/public/assets/{dist-DukGS2YZ.js → dist-DEmlBBNQ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
- package/server/public/assets/index-CUr1xv8w.css +1 -0
- package/server/public/assets/{index-Bwejq-5s.js → index-CsSuZQBI.js} +145 -144
- package/server/public/assets/{linear-qUWmMZ-c.js → linear-C9zFQpkX.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
- package/server/public/assets/{prod-C8VtLuWC.js → prod-B1jCQihw.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-By_BteaL.js → pull-requests--Ib2jTgy.js} +1 -1
- package/server/{pull-requests-8z2N1UOV.js → pull-requests-CXIhdCYD.js} +13 -11
- package/server/{queries-ZABd5aXP.js → queries-6d7Cdtm7.js} +693 -104
- package/server/{rally-i_goYmiA.js → rally-B708-nZn.js} +3 -3
- package/server/{rally-api-DqKqIMNR.js → rally-api-nY0ZANw3.js} +2 -2
- package/server/{rally-api-xHazRk0d.js → rally-api-yjQ0TfHd.js} +1 -1
- package/server/{rally-client-COYz1vYR.js → rally-client-B1EJhfV0.js} +4 -4
- package/server/{rally-client-CGWEHaPd.js → rally-client-CULK2XAY.js} +1 -1
- package/server/rally-njs_mJrt.js +3 -0
- package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-MWnqdLCJ.js} +1 -1
- package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-N3BTkmX_.js} +1 -1
- package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-Dp4eLkt4.js} +6 -6
- package/server/{rebuild-stack-CKjJAI8L.js → rebuild-stack-kA7XngID.js} +1 -1
- package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-uWbZfjms.js} +6 -6
- package/server/record-t6V-3Dcj.js +3 -0
- package/server/{record-update-D3N6WMFR.js → record-update-DACtKh6_.js} +1 -1
- package/server/record-update-Dq0t2uBG.js +310 -0
- package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BJtIQuag.js} +2 -2
- package/server/{release-engine-DMINVN8S.js → release-engine-DZpmGGzb.js} +5 -5
- package/server/{release-set-DeUSOEHy.js → release-set-hnXd_kga.js} +3 -3
- package/server/{remote-Dr5kGYSZ.js → remote-4tiENDaI.js} +3 -3
- package/server/{remote-b-c5bOce.js → remote-Br-ZWVIP.js} +3 -3
- package/server/{remote-agents-D6O_zETW.js → remote-agents-CRCg1L4H.js} +1 -1
- package/server/{remote-agents-Ct_WOyke.js → remote-agents-nmty1mLu.js} +6 -6
- package/server/{remote-completion-Dca3hAaa.js → remote-completion-BbWNd10K.js} +12 -12
- package/server/resume-CcKqnTvE.js +3 -0
- package/server/{review-agent-CCum8sGe.js → review-agent-DJRO8EG8.js} +1 -1
- package/server/{review-agent-CThvgK2r.js → review-agent-sKkE1FEL.js} +22 -22
- package/server/{review-artifacts-CXywD0F2.js → review-artifacts-BLbSC4ke.js} +5 -5
- package/server/{review-context-OYfKUprb.js → review-context-BgX3lcCx.js} +8 -8
- package/server/{review-status-DFRjDFef.js → review-status-A7quS5KJ.js} +54 -21
- package/server/review-status-C6n6-9f_.js +3 -0
- package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-tbOn_A_u.js} +3 -3
- package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BhSQ0d0l.js} +2 -2
- package/server/{review-status-sync-D60PJWNL.js → review-status-sync-To3-iS-N.js} +1 -1
- package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
- package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CTRNtzXO.js} +6 -6
- package/server/{rollup-CZ02qgxk.js → rollup-B53Y81xK.js} +1 -1
- package/server/{rollup-SyuF09e4.js → rollup-WA0VD-Rr.js} +8 -8
- package/server/{scanner-Br0Z5S6R.js → scanner-D2743cp8.js} +11 -7
- package/server/{sequence-io-fxU0DlwW.js → sequence-io-Cg0zYj_E.js} +4 -4
- package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-BGY8gjg-.js} +5 -5
- package/server/server.js +941 -752
- package/server/{service-Bagb90KZ.js → service-DCpB_SGd.js} +53 -53
- package/server/{session-fork-BqQxd-V6.js → session-fork-BQ8_6H32.js} +2 -2
- package/server/{session-history-XdS0JKp3.js → session-history-CVZDpS3c.js} +4 -4
- package/server/{settings-BNbocWOg.js → settings-BZ5m1UCl.js} +3 -3
- package/server/settings-D0OSwos5.js +2 -0
- package/server/{settings-uLc6DEYI.js → settings-ylxwqwQG.js} +2 -2
- package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BlxG6Xye.js} +2 -2
- package/server/{shadow-state-CbvsN3qG.js → shadow-state-C2_epgx2.js} +1 -1
- package/server/{shadow-state-C_NkP-sa.js → shadow-state-Dh-HzF2J.js} +2 -2
- package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-4bvjn9b3.js} +2 -2
- package/server/{ship-log-__QtAFXG.js → ship-log-ClSMIzZX.js} +1 -1
- package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CHIxLr_d.js} +1 -1
- package/server/{smart-compaction-CLZOWin1.js → smart-compaction-r4pHQBIr.js} +7 -7
- package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DWAorh2B.js} +22 -21
- package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-KC_UduxD.js} +1 -1
- package/server/{specialist-completion-CqmduO92.js → specialist-completion-BXhav38U.js} +1 -1
- package/server/{specialist-context-CJ-QjFR-.js → specialist-context-DtrYvGJ-.js} +5 -5
- package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
- package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-DJ3RzKxW.js} +3 -3
- package/server/{specialists-D0gGXMZx.js → specialists-D5fRZXmN.js} +1 -1
- package/server/specialists-DVj0hvaL.js +3 -0
- package/server/{specialists-CwZHb5cb.js → specialists-DyFeedjn.js} +66 -76
- package/server/{specialists-Bg9v4z3F.js → specialists-JVO00bs7.js} +340 -214
- package/server/specs-nN45DG2X.js +3 -0
- package/server/{src-BMMoA_ba.js → src-CG9mCkP6.js} +6 -6
- package/server/{src-Bqdtd6po.js → src-CMTQGyCK.js} +3 -3
- package/server/{src-k039WVYY.js → src-U7_kTPEE.js} +2 -1
- package/server/{stack-health-Bd06frFn.js → stack-health-Df0YEZKa.js} +1 -1
- package/server/{stack-health-C-ifC7b0.js → stack-health-puygdaMd.js} +2 -2
- package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-BbFwCTb0.js} +4 -4
- package/server/{staleness-BID1BKdr.js → staleness-Bpy41ngS.js} +15 -3
- package/server/{staleness-_Tr-GwdA.js → staleness-Cbl_w4Bw.js} +1 -1
- package/server/{state-home-CONQvZR0.js → state-home-CIGjwNfJ.js} +96 -44
- package/server/{state-migrate-BeBW0KXA.js → state-migrate-Dkzaxvny.js} +12 -3
- package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-CzEov_fq.js} +26 -22
- package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-sY_MHHgQ.js} +1 -1
- package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
- package/server/{summary-fork-agEMsPSo.js → summary-fork-D8bXjCr7.js} +2 -2
- package/server/{summary-fork-bX6ax6X7.js → summary-fork-DHhJIsAL.js} +8 -8
- package/server/{supervisor-Ctt4eRYz.js → supervisor-BO-Zk_h-.js} +3 -3
- package/server/supervisor-BPy-o1A8.js +2 -0
- package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-CQ_fwUWF.js} +4 -4
- package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-Bza0ffAh.js} +2 -2
- package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-CEgauF4U.js} +15 -15
- package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-DXDt0Xa-.js} +7 -7
- package/server/{test-verdict-Cp5tljlJ.js → test-verdict-CmUBK5cT.js} +1 -1
- package/server/{test-verdict-D_-sXIz_.js → test-verdict-DFjjIHR5.js} +1 -1
- package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-BDtLOIlO.js} +2 -2
- package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-DL566HbH.js} +1 -1
- package/server/tmux-DoThH6aj.js +3 -0
- package/server/{tmux-L5LgvGLp.js → tmux-ftABRAmc.js} +76 -44
- package/server/{token-BkQLy4yS.js → token-CsOhvw42.js} +2 -2
- package/server/{token-util-DI8sGlmF.js → token-util-CTmczIfW.js} +1 -1
- package/server/token-util-DrHg8abn.js +3 -0
- package/server/{tracker-config-DdT-nUAM.js → tracker-config-B4itFzDo.js} +2 -2
- package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-BePq_oj-.js} +1 -1
- package/server/{tracker-utils-CawsPSS2.js → tracker-utils-tnxxqROg.js} +2 -2
- package/server/{traefik-connect-C6mJckNs.js → traefik-connect-m73vGebA.js} +1 -1
- package/server/{tunnel-IdK1iTHx.js → tunnel-B2vxjx_b.js} +3 -3
- package/server/{tunnel-BIFl98rc.js → tunnel-Cgj-IGIl.js} +1 -1
- package/server/{types-7-GnJn0t.js → types-BBNjPcqU.js} +1 -1
- package/server/{uat-train-j0cPeMSj.js → uat-train-CuEn0t9M.js} +28 -28
- package/server/{uat-train-0Ujk8GCv.js → uat-train-cKfM-_WW.js} +1 -1
- package/server/{validation-CabEISJT.js → validation-B5JxoPUS.js} +259 -9
- package/server/{validation-DcAgXTQp.js → validation-CIi6pnI2.js} +1 -1
- package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-BcnIbigL.js} +1 -1
- package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-C-lIHfUa.js} +1 -1
- package/server/{verification-runner-FiuAZ-H2.js → verification-runner-Br0S_Ous.js} +102 -37
- package/server/{verification-runner-DlJezzef.js → verification-runner-CDj4lD4t.js} +1 -1
- package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DKpNNW5i.js} +1 -1
- package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Yb2bd3Fq.js} +13 -13
- package/server/{workflows-BZNNYkGC.js → workflows-C9WmILql.js} +39 -77
- package/server/workflows-D90rMOya.js +2 -0
- package/server/{workspace-D9ppycdg.js → workspace-BVl4rihN.js} +3 -3
- package/server/{workspace-3IC-UkAi.js → workspace-DuUdndHe.js} +1 -1
- package/server/{workspace-config-Bigl_-Lk.js → workspace-config-cEGcO6UT.js} +1 -1
- package/server/{workspace-manager-B1WOfKvB.js → workspace-manager-ZTdJAy9M.js} +1 -1
- package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-hLUv3ADC.js} +22 -15
- package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-CskwzzhL.js} +2 -2
- package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-DNpMixRq.js} +1 -1
- package/server/{workspaces-CFPcL0vl.js → workspaces-hWvy9eKs.js} +275 -109
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +363 -71
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +3 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/server/agent-state-Co5Sy2Fw.js +0 -3
- package/server/agents-DyHKlq1I.js +0 -3
- package/server/cli-BRORS9qY.js +0 -3
- package/server/codex-DNyiQDKW.js +0 -3
- package/server/deacon-swarm-CV54eNmU.js +0 -2
- package/server/dist-j64RzSrQ.js +0 -3
- package/server/forge-B0_opi-V.js +0 -2
- package/server/hume-BmhvfVbV.js +0 -3
- package/server/inspect-agent-Dq0z1k3H.js +0 -2
- package/server/lifecycle-io-DmY2qwCn.js +0 -3
- package/server/merge-ops-DwWCkSgo.js +0 -2
- package/server/projects-BKkwpH6q.js +0 -3
- package/server/public/assets/index-Bdc4V9ba.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
- package/server/rally-OSJXdiHK.js +0 -3
- package/server/record-rwK-nKv_.js +0 -3
- package/server/record-update-Crz74r-6.js +0 -168
- package/server/resume-wZZsWtzz.js +0 -3
- package/server/review-status-Bnh-rdkY.js +0 -3
- package/server/settings-BlUsVaUc.js +0 -2
- package/server/specialists-Dqe6_HE5.js +0 -3
- package/server/specs-BhOKBzqk.js +0 -3
- package/server/supervisor-COVHrBTg.js +0 -2
- package/server/tmux-BAvtac_u.js +0 -3
- package/server/token-util-BArZLN6w.js +0 -3
- package/server/workflows-C4mR0Reb.js +0 -2
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as init_tracker_utils } from "./tracker-utils-
|
|
1
|
+
import { Br as getOverdeckHome, Tn as init_projects, Ur as packageRoot, Vr as init_paths, Yn as init_issue_id, Yt as init_state_plane, fn as findProjectByPathSync, mr as init_errors, zn as resolveProjectFromIssueSync } from "./config-yaml-DvyMuOle.js";
|
|
2
|
+
import { b as setReviewStatusSync, c as getReviewStatusSync, l as init_review_status, p as markWorkspaceStuck } from "./review-status-A7quS5KJ.js";
|
|
3
|
+
import { X as messageAgent, ar as setAgentPaused, b as init_agents, ft as stopAgent } from "./queries-6d7Cdtm7.js";
|
|
4
|
+
import { n as init_tracker_utils } from "./tracker-utils-tnxxqROg.js";
|
|
5
5
|
import { i as readReviewStatusMap, n as init_review_status_source } from "./review-status-source-CxuEjLGg.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { n as
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
6
|
+
import { o as init_lifecycle, s as isXBriefFilename } from "./lifecycle-DfeyBDwA.js";
|
|
7
|
+
import { m as readWorkspacePlanSync, o as init_io, t as XBriefMergeConflictError, v as init_types, y as subItemsOf } from "./io-B3_AHDfr.js";
|
|
8
|
+
import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-C9b6ccN1.js";
|
|
9
|
+
import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-CPS15Vte.js";
|
|
10
|
+
import { n as init_shadow_utils } from "./shadow-utils-4bvjn9b3.js";
|
|
11
|
+
import { i as runQualityGates, n as init_validation, t as DEFAULT_GATES } from "./validation-B5JxoPUS.js";
|
|
12
|
+
import { r as writeVerificationArtifact, t as readVerificationArtifact } from "./verification-artifact-BcnIbigL.js";
|
|
13
|
+
import { n as getXBriefACStatusSync } from "./acceptance-criteria-DOA0KgXx.js";
|
|
13
14
|
import { join } from "node:path";
|
|
14
15
|
import { Data, Effect } from "effect";
|
|
15
16
|
import { existsSync } from "fs";
|
|
@@ -58,7 +59,18 @@ function isProcessAlive(pid) {
|
|
|
58
59
|
function readVerificationWorkerState(issueId) {
|
|
59
60
|
try {
|
|
60
61
|
const parsed = JSON.parse(readFileSync$1(statePath(issueId), "utf8"));
|
|
61
|
-
|
|
62
|
+
if (parsed.issueId !== issueId || !Number.isInteger(parsed.pid) || typeof parsed.runId !== "string" || typeof parsed.workspacePath !== "string" || typeof parsed.startedAt !== "string" || typeof parsed.resultPath !== "string") return null;
|
|
63
|
+
return {
|
|
64
|
+
...parsed,
|
|
65
|
+
runId: parsed.runId,
|
|
66
|
+
issueId,
|
|
67
|
+
workspacePath: parsed.workspacePath,
|
|
68
|
+
pid: parsed.pid,
|
|
69
|
+
startedAt: parsed.startedAt,
|
|
70
|
+
resultPath: parsed.resultPath,
|
|
71
|
+
phase: parsed.phase === "queued" ? "queued" : "running",
|
|
72
|
+
admittedAt: parsed.admittedAt === void 0 ? parsed.startedAt : parsed.admittedAt
|
|
73
|
+
};
|
|
62
74
|
} catch {
|
|
63
75
|
return null;
|
|
64
76
|
}
|
|
@@ -72,20 +84,36 @@ function writeJsonAtomic(path, value) {
|
|
|
72
84
|
writeFileSync$1(temp, `${JSON.stringify(value, null, 2)}\n`);
|
|
73
85
|
renameSync$1(temp, path);
|
|
74
86
|
}
|
|
87
|
+
function verificationWorkerDeadline(state) {
|
|
88
|
+
if (!state.admittedAt) return null;
|
|
89
|
+
const admittedAt = Date.parse(state.admittedAt);
|
|
90
|
+
return Number.isFinite(admittedAt) ? admittedAt + MAX_RUN_MS : null;
|
|
91
|
+
}
|
|
92
|
+
function markVerificationWorkerAdmissionPhase(issueId, update) {
|
|
93
|
+
const state = readVerificationWorkerState(issueId);
|
|
94
|
+
if (!state || state.pid !== process.pid) return;
|
|
95
|
+
writeJsonAtomic(statePath(issueId), {
|
|
96
|
+
...state,
|
|
97
|
+
phase: update.phase,
|
|
98
|
+
admittedAt: state.admittedAt ?? update.admittedAt ?? null,
|
|
99
|
+
currentGate: update.gateName,
|
|
100
|
+
currentAttempt: update.attempt
|
|
101
|
+
});
|
|
102
|
+
}
|
|
75
103
|
async function waitForResult(state) {
|
|
76
|
-
|
|
77
|
-
while (Date.now() < deadline) {
|
|
104
|
+
for (;;) {
|
|
78
105
|
if (existsSync$1(state.resultPath)) return JSON.parse(readFileSync$1(state.resultPath, "utf8"));
|
|
79
106
|
if (!isProcessAlive(state.pid)) return {
|
|
80
107
|
outcome: "error",
|
|
81
108
|
message: `Verification worker ${state.pid} exited before writing a result`
|
|
82
109
|
};
|
|
110
|
+
const deadline = verificationWorkerDeadline(readVerificationWorkerState(state.issueId) ?? state);
|
|
111
|
+
if (deadline !== null && Date.now() >= deadline) return {
|
|
112
|
+
outcome: "error",
|
|
113
|
+
message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms after CPU admission`
|
|
114
|
+
};
|
|
83
115
|
await new Promise((resolve) => setTimeout(resolve, POLL_MS));
|
|
84
116
|
}
|
|
85
|
-
return {
|
|
86
|
-
outcome: "error",
|
|
87
|
-
message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms`
|
|
88
|
-
};
|
|
89
117
|
}
|
|
90
118
|
async function runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
91
119
|
const existing = readVerificationWorkerState(issueId);
|
|
@@ -135,7 +163,9 @@ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo,
|
|
|
135
163
|
workspacePath,
|
|
136
164
|
pid: child.pid,
|
|
137
165
|
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
138
|
-
resultPath
|
|
166
|
+
resultPath,
|
|
167
|
+
phase: "queued",
|
|
168
|
+
admittedAt: null
|
|
139
169
|
};
|
|
140
170
|
writeJsonAtomic(statePath(issueId), state);
|
|
141
171
|
child.unref();
|
|
@@ -146,6 +176,7 @@ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo,
|
|
|
146
176
|
//#region ../../lib/work/test-requirement-gate.ts
|
|
147
177
|
init_projects();
|
|
148
178
|
init_state_plane();
|
|
179
|
+
init_lifecycle();
|
|
149
180
|
init_types();
|
|
150
181
|
init_io();
|
|
151
182
|
init_agents();
|
|
@@ -170,7 +201,7 @@ promisify(exec);
|
|
|
170
201
|
const terminal = new Set(["completed", "cancelled"]);
|
|
171
202
|
function checkIncompletePlanItemsSync(workspacePath) {
|
|
172
203
|
const doc = readWorkspacePlanSync(workspacePath);
|
|
173
|
-
if (!doc) return [" The required
|
|
204
|
+
if (!doc) return [" The required xBRIEF checklist is missing or unreadable; return the issue to planning before completion."];
|
|
174
205
|
const incomplete = doc.plan.items.flatMap((item) => {
|
|
175
206
|
const lines = [];
|
|
176
207
|
if (!terminal.has(item.status)) lines.push(` - ${item.id} ${item.title} (${item.status})`);
|
|
@@ -196,6 +227,19 @@ async function checkIncompletePlanItemsPromise(workspacePath, _issueId) {
|
|
|
196
227
|
init_io();
|
|
197
228
|
const execAsync = promisify$1(exec$1);
|
|
198
229
|
const NO_PROGRESS_REPEAT_THRESHOLD = 2;
|
|
230
|
+
const MERGED_VERIFICATION_REASON = "Merge already landed; verify-on-main owns post-merge validation.";
|
|
231
|
+
function skipMergedVerification(issueId, logPrefix, status = getReviewStatusSync(issueId)) {
|
|
232
|
+
if (status?.mergeStatus !== "merged") return null;
|
|
233
|
+
setReviewStatusSync(issueId, {
|
|
234
|
+
verificationStatus: "skipped",
|
|
235
|
+
verificationNotes: MERGED_VERIFICATION_REASON
|
|
236
|
+
});
|
|
237
|
+
console.log(`[${logPrefix}] Skipping pre-merge verification for ${issueId}: ${MERGED_VERIFICATION_REASON}`);
|
|
238
|
+
return {
|
|
239
|
+
outcome: "skipped",
|
|
240
|
+
reason: MERGED_VERIFICATION_REASON
|
|
241
|
+
};
|
|
242
|
+
}
|
|
199
243
|
function isFinalVerificationAttempt(cycleCount) {
|
|
200
244
|
return cycleCount >= 3;
|
|
201
245
|
}
|
|
@@ -222,6 +266,7 @@ function setStateDerivedVerificationFailure(issueId, failedCheck, summary, cycle
|
|
|
222
266
|
console.warn(`[verification-runner] ${issueId} review is passed but held by state-derived gate ${failedCheck}: ${summary}`);
|
|
223
267
|
}
|
|
224
268
|
async function escalateVerificationStuck(issueId, failedCheck, cycleCount, summary, logPrefix) {
|
|
269
|
+
if (skipMergedVerification(issueId, logPrefix)) return;
|
|
225
270
|
const agentId = `agent-${issueId.toLowerCase()}`;
|
|
226
271
|
const reason = `needs-you: verification stuck after ${cycleCount}/3 attempts (${failedCheck})`;
|
|
227
272
|
markWorkspaceStuck(issueId, "verification_stuck", {
|
|
@@ -287,7 +332,9 @@ function reconcileInterruptedVerifications(logPrefix = "boot-reconciliation") {
|
|
|
287
332
|
return reset;
|
|
288
333
|
}
|
|
289
334
|
async function deliverVerificationFeedback(issueId, message, details, logPrefix) {
|
|
335
|
+
if (skipMergedVerification(issueId, logPrefix)) return;
|
|
290
336
|
const target = await resolveIssueFeedbackTarget(issueId);
|
|
337
|
+
if (skipMergedVerification(issueId, logPrefix)) return;
|
|
291
338
|
if ("agentId" in target) {
|
|
292
339
|
await messageAgent(target.agentId, message, "internal", { owesRework: true });
|
|
293
340
|
console.log(`[${logPrefix}] Sent verification feedback for ${issueId} to ${target.agentId}`);
|
|
@@ -399,17 +446,19 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
|
|
|
399
446
|
}
|
|
400
447
|
/**
|
|
401
448
|
* PAN-2179: detect a "plan-only" / zombie changeset — one whose only changes are
|
|
402
|
-
* pipeline artifacts (.pan/,
|
|
449
|
+
* pipeline artifacts (.pan/, task state, xBRIEF) with no actual implementation. A work
|
|
403
450
|
* agent that never received its kickoff produces exactly this. The verification
|
|
404
451
|
* gate uses it to bounce the branch back instead of letting an empty "completion"
|
|
405
452
|
* advance to review/merge. A legit non-code change (docs, rules under
|
|
406
453
|
* sync-sources/, config) counts as content and is NOT flagged.
|
|
407
454
|
*/
|
|
408
455
|
function changesetHasNoContent(changedFiles) {
|
|
409
|
-
return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f
|
|
456
|
+
return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !isXBriefFilename(f)).length === 0;
|
|
410
457
|
}
|
|
411
458
|
async function runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
|
|
412
459
|
const currentStatus = getReviewStatusSync(issueId);
|
|
460
|
+
const mergedOutcome = skipMergedVerification(issueId, logPrefix, currentStatus);
|
|
461
|
+
if (mergedOutcome) return mergedOutcome;
|
|
413
462
|
const currentCycles = currentStatus?.verificationCycleCount ?? 0;
|
|
414
463
|
if (currentCycles >= 3) {
|
|
415
464
|
const reason = `Circuit breaker: ${currentCycles}/3 cycles exceeded — skipping verification`;
|
|
@@ -435,6 +484,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
435
484
|
console.log(`[${logPrefix}] Syncing ${targetBranch} into ${displayName} for ${issueId}...`);
|
|
436
485
|
syncResults.push(await syncSingleRepo(gitDir, targetBranch));
|
|
437
486
|
}
|
|
487
|
+
const postSyncMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
488
|
+
if (postSyncMergedOutcome) return postSyncMergedOutcome;
|
|
438
489
|
const failures = syncResults.filter((r) => !r.success);
|
|
439
490
|
if (failures.length > 0) {
|
|
440
491
|
const newCycleCount = currentCycles + 1;
|
|
@@ -482,6 +533,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
482
533
|
}
|
|
483
534
|
}
|
|
484
535
|
else console.log(`[${logPrefix}] Skipping target-branch sync for ${issueId}; verifying current workspace state`);
|
|
536
|
+
const postSyncMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
537
|
+
if (postSyncMergedOutcome) return postSyncMergedOutcome;
|
|
485
538
|
const gates = projectConfig?.quality_gates && Object.keys(projectConfig.quality_gates).length > 0 ? projectConfig.quality_gates : DEFAULT_GATES;
|
|
486
539
|
console.log(`[${logPrefix}] Project: ${projectConfig?.name || "NOT FOUND"}, gates: [${Object.keys(gates).join(", ")}], workspace: ${workspacePath}`);
|
|
487
540
|
const featureFolder = basename$1(workspacePath);
|
|
@@ -545,10 +598,12 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
545
598
|
};
|
|
546
599
|
writeLiveArtifact();
|
|
547
600
|
const gateResults = await Effect.runPromise(runQualityGates(gates, workspacePath, "pre_push", {
|
|
601
|
+
issueId,
|
|
548
602
|
isRemote: workspaceInfo.isRemote,
|
|
549
603
|
vmName: workspaceInfo.vmName,
|
|
550
604
|
placeholders,
|
|
551
605
|
...options.onGateLog ? { onLog: options.onGateLog } : {},
|
|
606
|
+
onAdmissionPhase: (state) => markVerificationWorkerAdmissionPhase(issueId, state),
|
|
552
607
|
onGateStart: (name) => {
|
|
553
608
|
liveGateName = name;
|
|
554
609
|
liveGateTail = "";
|
|
@@ -569,6 +624,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
569
624
|
writeLiveArtifact();
|
|
570
625
|
}
|
|
571
626
|
}));
|
|
627
|
+
const postGateMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
628
|
+
if (postGateMergedOutcome) return postGateMergedOutcome;
|
|
572
629
|
const failedGate = gateResults.find((r) => !r.passed && r.required !== false);
|
|
573
630
|
if (failedGate?.infraUnavailable) {
|
|
574
631
|
try {
|
|
@@ -580,7 +637,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
580
637
|
verificationNotes: `Verification deferred: ${failedGate.error}. Workspace stack rebuild triggered; verification re-runs on the next cycle.`
|
|
581
638
|
});
|
|
582
639
|
try {
|
|
583
|
-
const { rebuildWorkspaceStack } = await import("./rebuild-stack-
|
|
640
|
+
const { rebuildWorkspaceStack } = await import("./rebuild-stack-kA7XngID.js");
|
|
584
641
|
Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[${logPrefix}] ${issueId} stack rebuild: ${m}`) })).then((r) => {
|
|
585
642
|
if (!r.success) console.warn(`[${logPrefix}] Stack rebuild for ${issueId} failed: ${r.error}`);
|
|
586
643
|
});
|
|
@@ -640,30 +697,30 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
640
697
|
}
|
|
641
698
|
let acStatus;
|
|
642
699
|
try {
|
|
643
|
-
acStatus =
|
|
644
|
-
} catch (
|
|
645
|
-
if (
|
|
700
|
+
acStatus = getXBriefACStatusSync(workspacePath);
|
|
701
|
+
} catch (xbriefErr) {
|
|
702
|
+
if (xbriefErr instanceof XBriefMergeConflictError) {
|
|
646
703
|
const newCycleCount = currentCycles + 1;
|
|
647
704
|
const failedCheck = "vbrief-conflicts";
|
|
648
|
-
const summary = `
|
|
705
|
+
const summary = `xBRIEF spec has unresolved git merge conflict markers. Resolve all conflict markers in the spec file and commit before resubmitting.`;
|
|
649
706
|
setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
|
|
650
707
|
if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
|
|
651
|
-
const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Fix merge conflicts in
|
|
708
|
+
const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Fix merge conflicts in xBRIEF spec BEFORE resubmitting\n\n1. Open the xBRIEF spec (on main in .pan/specs/)\n2. Find and resolve all <<<<<<< HEAD / ======= / >>>>>>> conflict markers\n3. Ensure the file is valid JSON (only keep ONE version of each conflicted block)\n4. Commit the fixed file on main\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Resolved spec merge conflict"\n\nDo NOT resubmit until the spec parses cleanly.`;
|
|
652
709
|
try {
|
|
653
710
|
const fileResult = await Effect.runPromise(writeFeedbackFile({
|
|
654
711
|
issueId,
|
|
655
712
|
workspacePath,
|
|
656
713
|
specialist: "verification-gate",
|
|
657
714
|
outcome: "failed",
|
|
658
|
-
summary: `
|
|
715
|
+
summary: `xBRIEF plan has merge conflicts (attempt ${newCycleCount}/3)`,
|
|
659
716
|
markdownBody: feedbackBody
|
|
660
717
|
}));
|
|
661
|
-
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} —
|
|
718
|
+
if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — the xBRIEF document has merge conflict markers.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, resolve the merge conflict markers, commit and push the fix, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
|
|
662
719
|
failedCheck,
|
|
663
720
|
feedbackPath: fileResult.filePath
|
|
664
721
|
}, logPrefix);
|
|
665
722
|
} catch (feedbackErr) {
|
|
666
|
-
console.error(`[${logPrefix}] Failed to write
|
|
723
|
+
console.error(`[${logPrefix}] Failed to write xBRIEF conflict feedback for ${issueId}:`, feedbackErr);
|
|
667
724
|
}
|
|
668
725
|
return {
|
|
669
726
|
outcome: "failed",
|
|
@@ -672,7 +729,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
672
729
|
maxCycles: 3
|
|
673
730
|
};
|
|
674
731
|
}
|
|
675
|
-
throw
|
|
732
|
+
throw xbriefErr;
|
|
676
733
|
}
|
|
677
734
|
if (acStatus && !acStatus.allCompleted) {
|
|
678
735
|
const newCycleCount = currentCycles + 1;
|
|
@@ -708,7 +765,9 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
708
765
|
maxCycles: 3
|
|
709
766
|
};
|
|
710
767
|
}
|
|
711
|
-
const taskBlockers = await checkIncompletePlanItemsPromise(workspacePath, issueId);
|
|
768
|
+
const taskBlockers = options.skipPlanChecklist ? [] : await checkIncompletePlanItemsPromise(workspacePath, issueId);
|
|
769
|
+
const postChecklistMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
770
|
+
if (postChecklistMergedOutcome) return postChecklistMergedOutcome;
|
|
712
771
|
if (taskBlockers.length > 0) {
|
|
713
772
|
const newCycleCount = currentCycles + 1;
|
|
714
773
|
const failedCheck = "incomplete-plan-items";
|
|
@@ -746,10 +805,12 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
746
805
|
encoding: "utf-8",
|
|
747
806
|
timeout: 15e3
|
|
748
807
|
});
|
|
808
|
+
const postDiffMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
809
|
+
if (postDiffMergedOutcome) return postDiffMergedOutcome;
|
|
749
810
|
if (changesetHasNoContent(changedOut.split("\n"))) {
|
|
750
811
|
const newCycleCount = currentCycles + 1;
|
|
751
812
|
const failedCheck = "empty-changeset";
|
|
752
|
-
const summary = `Branch has no implementation — only pipeline artifacts (.pan/
|
|
813
|
+
const summary = `Branch has no implementation — only pipeline artifacts (.pan/xBRIEF task state) changed vs ${changedBase}. The work agent produced no code (likely a kickoff-delivery zombie — PAN-2179).`;
|
|
753
814
|
setReviewStatusSync(issueId, {
|
|
754
815
|
reviewStatus: "pending",
|
|
755
816
|
verificationStatus: "failed",
|
|
@@ -759,7 +820,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
759
820
|
});
|
|
760
821
|
if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
|
|
761
822
|
try {
|
|
762
|
-
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/
|
|
823
|
+
await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/xBRIEF task state changed vs ${changedBase}).\n\nYou must actually implement the issue: read the plan (.pan/spec.vbrief.json + the issue body), write and commit the code, push, then run pan review request. Do NOT stop at the prompt — keep working until pan review request completes.`, {
|
|
763
824
|
failedCheck,
|
|
764
825
|
changedBase
|
|
765
826
|
}, logPrefix);
|
|
@@ -786,6 +847,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
786
847
|
});
|
|
787
848
|
lastVerifiedCommit = stdout.trim();
|
|
788
849
|
} catch {}
|
|
850
|
+
const prePassMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
851
|
+
if (prePassMergedOutcome) return prePassMergedOutcome;
|
|
789
852
|
setReviewStatusSync(issueId, {
|
|
790
853
|
verificationStatus: "passed",
|
|
791
854
|
verificationNotes: void 0,
|
|
@@ -797,7 +860,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
797
860
|
const repo = findProjectByPathSync(workspacePath)?.github_repo;
|
|
798
861
|
if (!repo || !repo.includes("/")) return;
|
|
799
862
|
const [owner, name] = repo.split("/");
|
|
800
|
-
const { postOverdeckTestsStatus } = await import("./github-app-
|
|
863
|
+
const { postOverdeckTestsStatus } = await import("./github-app-CPfoFAdV.js");
|
|
801
864
|
await postOverdeckTestsStatus(workspacePath, owner, name, "success", "Verification gate passed");
|
|
802
865
|
} catch (err) {
|
|
803
866
|
console.warn(`[${logPrefix}] Failed to post overdeck/tests status: ${err.message}`);
|
|
@@ -805,6 +868,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
|
|
|
805
868
|
})();
|
|
806
869
|
return { outcome: "passed" };
|
|
807
870
|
} catch (verifyErr) {
|
|
871
|
+
const errorMergedOutcome = skipMergedVerification(issueId, logPrefix);
|
|
872
|
+
if (errorMergedOutcome) return errorMergedOutcome;
|
|
808
873
|
setReviewStatusSync(issueId, {
|
|
809
874
|
reviewStatus: "pending",
|
|
810
875
|
verificationStatus: "failed",
|
|
@@ -833,4 +898,4 @@ function runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo,
|
|
|
833
898
|
//#endregion
|
|
834
899
|
export { runVerificationForIssueInProcess as i, reconcileInterruptedVerifications as n, runVerificationForIssue as r, changesetHasNoContent as t };
|
|
835
900
|
|
|
836
|
-
//# sourceMappingURL=verification-runner-
|
|
901
|
+
//# sourceMappingURL=verification-runner-Br0S_Ous.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as reconcileInterruptedVerifications, r as runVerificationForIssue } from "./verification-runner-
|
|
1
|
+
import { n as reconcileInterruptedVerifications, r as runVerificationForIssue } from "./verification-runner-Br0S_Ous.js";
|
|
2
2
|
export { reconcileInterruptedVerifications, runVerificationForIssue };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
3
|
-
import { d as readPlanSync, i as findPlanSync, o as init_io, p as readWorkspacePlan } from "./io-
|
|
4
|
-
import { f as init_config, m as loadConfigSync } from "./config-
|
|
5
|
-
import { i as NotImplementedError, o as init_interface } from "./rally-api-
|
|
6
|
-
import { n as createTrackerFromConfig, r as init_factory } from "./factory-
|
|
7
|
-
import { i as createActiveSlice, l as init_dag, o as getDispatchableItems } from "./dag-
|
|
8
|
-
import { l as
|
|
9
|
-
import { n as renderPrompt, t as init_prompts } from "./prompts-
|
|
2
|
+
import { Dt as getProjectConfigFromWorkspacePath, Ft as resolveProjectForIssue, Ot as init_record, Pt as readRecordContinueViewSync, Tn as init_projects, mn as findProjectByTeamSync, t as init_config_yaml, u as isTldrEnabledSync, un as extractTeamPrefix } from "./config-yaml-DvyMuOle.js";
|
|
3
|
+
import { F as getReadableWorkspacePanPaths, d as readPlanSync, i as findPlanSync, o as init_io, p as readWorkspacePlan } from "./io-B3_AHDfr.js";
|
|
4
|
+
import { f as init_config, m as loadConfigSync } from "./config-CCvjQf27.js";
|
|
5
|
+
import { i as NotImplementedError, o as init_interface } from "./rally-api-nY0ZANw3.js";
|
|
6
|
+
import { n as createTrackerFromConfig, r as init_factory } from "./factory-CynerjXO.js";
|
|
7
|
+
import { i as createActiveSlice, l as init_dag, o as getDispatchableItems } from "./dag-CdOjJVDT.js";
|
|
8
|
+
import { l as readFeedback, n as readWorkspaceContext, r as writeWorkspaceContext, t as init_pan_dir } from "./pan-dir-DeVUgwA7.js";
|
|
9
|
+
import { n as renderPrompt, t as init_prompts } from "./prompts-Dp4Tpk39.js";
|
|
10
10
|
import { Effect } from "effect";
|
|
11
11
|
import { existsSync, readdirSync, statSync } from "fs";
|
|
12
12
|
import { dirname, join } from "path";
|
|
@@ -67,7 +67,7 @@ async function buildActiveSliceContext(workspacePath, issueId) {
|
|
|
67
67
|
const normalizedIssueId = (issueId ?? "").toUpperCase();
|
|
68
68
|
const currentItemIds = doc.plan.items.filter((item) => item.status === "running" || item.id === nextItem.id).map((item) => item.id);
|
|
69
69
|
return [
|
|
70
|
-
"## Active
|
|
70
|
+
"## Active xBRIEF Slice (Canonical Task Graph)",
|
|
71
71
|
"",
|
|
72
72
|
createActiveSlice(doc, {
|
|
73
73
|
issueId: normalizedIssueId,
|
|
@@ -76,7 +76,7 @@ async function buildActiveSliceContext(workspacePath, issueId) {
|
|
|
76
76
|
synthesisOutputs: void 0
|
|
77
77
|
}).prompt,
|
|
78
78
|
"",
|
|
79
|
-
"_The merged
|
|
79
|
+
"_The merged xBRIEF is the canonical task authority._"
|
|
80
80
|
].join("\n");
|
|
81
81
|
} catch {
|
|
82
82
|
return "";
|
|
@@ -295,9 +295,9 @@ async function writeStoryFeatureContext(workspacePath, issueId) {
|
|
|
295
295
|
const subItems = item.subItems?.map((s) => ` - ${s.title} (${s.status})`).join("\n") || "";
|
|
296
296
|
return `- **${item.id}**: ${item.title} (${item.status})${item.narrative?.Action ? `\n - Action: ${item.narrative.Action}` : ""}${subItems ? `\n${subItems}` : ""}`;
|
|
297
297
|
}).join("\n");
|
|
298
|
-
contextContent = `# Feature Context for ${issueId}\n\n**Parent Feature:** ${parentTitle} (${issue.parentRef})\n\n## Plan Narratives\n${narrativeSection || "_No narratives found._"}\n\n## Cross-Story Dependencies\n${edgesSection || "_No dependency edges found._"}\n\n## Related Plan Items\n${itemsSection || "_No plan items found for this story._"}\n\n---\n*Synthesized from parent feature workspace
|
|
298
|
+
contextContent = `# Feature Context for ${issueId}\n\n**Parent Feature:** ${parentTitle} (${issue.parentRef})\n\n## Plan Narratives\n${narrativeSection || "_No narratives found._"}\n\n## Cross-Story Dependencies\n${edgesSection || "_No dependency edges found._"}\n\n## Related Plan Items\n${itemsSection || "_No plan items found for this story._"}\n\n---\n*Synthesized from parent feature workspace xBRIEF*\n`;
|
|
299
299
|
} catch (planErr) {
|
|
300
|
-
console.warn(`[writeStoryFeatureContext] Could not read parent workspace
|
|
300
|
+
console.warn(`[writeStoryFeatureContext] Could not read parent workspace xBRIEF: ${planErr instanceof Error ? planErr.message : String(planErr)}`);
|
|
301
301
|
}
|
|
302
302
|
const parentPanContext = await Effect.runPromise(readWorkspaceContext(parentWorkspace));
|
|
303
303
|
if (parentPanContext && !contextContent) contextContent = parentPanContext;
|
|
@@ -436,4 +436,4 @@ __esmMin((() => {
|
|
|
436
436
|
}))();
|
|
437
437
|
export { buildPolyrepoContext, buildWorkAgentPrompt, extractStitchDesigns, getTrackerContext, readFeatureContext, readPlanningContext, writeStoryFeatureContext };
|
|
438
438
|
|
|
439
|
-
//# sourceMappingURL=work-agent-prompt-
|
|
439
|
+
//# sourceMappingURL=work-agent-prompt-Yb2bd3Fq.js.map
|
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-
|
|
5
|
-
import { f as init_config, s as getDashboardApiUrlSync } from "./config-
|
|
6
|
-
import { i as loadCloisterConfig, r as init_config$1 } from "./config-
|
|
7
|
-
import { r as getAutoCloseOutCanonicalState, t as pruneStoppedAgentsForIssue } from "./agent-gc-
|
|
8
|
-
import { i as findWorkspacePath, o as init_archive_planning, t as archivePlanning } from "./archive-planning-
|
|
9
|
-
import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed, t as getLinearApiKey } from "./types-
|
|
10
|
-
import { t as closeIssue } from "./close-issue-
|
|
11
|
-
import { o as init_pull_requests, r as fetchIssuePullRequest, t as fetchCommitCheckRuns } from "./pull-requests-
|
|
12
|
-
import { n as acceptFlagFor, t as DOD_ROWS } from "./dod-
|
|
13
|
-
import { t as teardownWorkspace } from "./teardown-workspace-
|
|
1
|
+
import { Dt as getProjectConfigFromWorkspacePath, Ft as resolveProjectForIssue, Jn as extractPrefixSync, Lt as writeCloseOutDodGate, Ot as init_record, Vr as init_paths, Yn as init_issue_id, jt as readIssueRecord, kt as markRecordPipelineClosedOutSync, qn as extractNumberSync, wr as OVERDECK_HOME } from "./config-yaml-DvyMuOle.js";
|
|
2
|
+
import { l as init_review_status, s as getReviewStatus } from "./review-status-A7quS5KJ.js";
|
|
3
|
+
import { b as init_agents, i as listRunningAgents } from "./queries-6d7Cdtm7.js";
|
|
4
|
+
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-B0pmAz0a.js";
|
|
5
|
+
import { f as init_config, s as getDashboardApiUrlSync } from "./config-CCvjQf27.js";
|
|
6
|
+
import { i as loadCloisterConfig, r as init_config$1 } from "./config-DjLOdbgT.js";
|
|
7
|
+
import { r as getAutoCloseOutCanonicalState, t as pruneStoppedAgentsForIssue } from "./agent-gc-BV1q_2EV.js";
|
|
8
|
+
import { i as findWorkspacePath, o as init_archive_planning, t as archivePlanning } from "./archive-planning-DYrYojxl.js";
|
|
9
|
+
import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed, t as getLinearApiKey } from "./types-BBNjPcqU.js";
|
|
10
|
+
import { t as closeIssue } from "./close-issue-Dn_4c4G8.js";
|
|
11
|
+
import { o as init_pull_requests, r as fetchIssuePullRequest, t as fetchCommitCheckRuns } from "./pull-requests-CXIhdCYD.js";
|
|
12
|
+
import { n as acceptFlagFor, t as DOD_ROWS } from "./dod-BrSfUHm0.js";
|
|
13
|
+
import { t as teardownWorkspace } from "./teardown-workspace-CEgauF4U.js";
|
|
14
14
|
import { resolve } from "node:path";
|
|
15
15
|
import { Effect } from "effect";
|
|
16
16
|
import { existsSync } from "fs";
|
|
17
17
|
import { join as join$1 } from "path";
|
|
18
18
|
import { userInfo } from "node:os";
|
|
19
|
-
import {
|
|
20
|
-
import { copyFile, readFile as readFile$1, writeFile as writeFile$1 } from "fs/promises";
|
|
19
|
+
import { copyFile, readFile, writeFile } from "fs/promises";
|
|
21
20
|
import { execFile } from "node:child_process";
|
|
22
21
|
import { promisify } from "node:util";
|
|
23
22
|
import { exec as exec$1 } from "child_process";
|
|
@@ -98,32 +97,7 @@ const defaultDeployRowDeps = {
|
|
|
98
97
|
} catch {
|
|
99
98
|
return false;
|
|
100
99
|
}
|
|
101
|
-
}
|
|
102
|
-
serverStartedAt: async (port) => {
|
|
103
|
-
const { stdout: pidOutput } = await execFileAsync("lsof", [
|
|
104
|
-
"-ti",
|
|
105
|
-
`tcp:${port}`,
|
|
106
|
-
"-sTCP:LISTEN"
|
|
107
|
-
], {
|
|
108
|
-
encoding: "utf-8",
|
|
109
|
-
timeout: 1e4
|
|
110
|
-
});
|
|
111
|
-
const pid = pidOutput.trim().split("\n")[0];
|
|
112
|
-
if (!pid) throw new Error(`no dashboard process owns port ${port}`);
|
|
113
|
-
const { stdout } = await execFileAsync("ps", [
|
|
114
|
-
"-o",
|
|
115
|
-
"lstart=",
|
|
116
|
-
"-p",
|
|
117
|
-
pid
|
|
118
|
-
], {
|
|
119
|
-
encoding: "utf-8",
|
|
120
|
-
timeout: 1e4
|
|
121
|
-
});
|
|
122
|
-
const startedAt = new Date(stdout.trim());
|
|
123
|
-
if (Number.isNaN(startedAt.getTime())) throw new Error(`could not parse dashboard process start time: ${stdout.trim()}`);
|
|
124
|
-
return startedAt;
|
|
125
|
-
},
|
|
126
|
-
distMtime: async (repoRoot) => new Date((await stat(resolve(repoRoot, "dist/dashboard/server.js"))).mtime)
|
|
100
|
+
}
|
|
127
101
|
};
|
|
128
102
|
const defaultDeps = {
|
|
129
103
|
getReviewStatus: (issueId) => Effect.runPromise(getReviewStatus(issueId)),
|
|
@@ -248,25 +222,13 @@ async function checkDeployRow(ctx, merge, deps = defaultDeployRowDeps) {
|
|
|
248
222
|
const repoRoot = typeof health.repoRoot === "string" ? health.repoRoot : "";
|
|
249
223
|
if (!repoRoot) return result("deploy", "miss", `dashboard at ${baseUrl} did not report repoRoot`);
|
|
250
224
|
if (resolve(repoRoot) !== resolve(ctx.projectPath)) return result("deploy", "skip", `live dashboard serves ${repoRoot}, not this project — deploy semantics undefined for ${ctx.projectPath}`);
|
|
225
|
+
const buildCommit = typeof health.buildCommit === "string" && health.buildCommit.trim() ? health.buildCommit : void 0;
|
|
226
|
+
if (!buildCommit) return result("deploy", "miss", `dashboard at ${baseUrl} did not report buildCommit; live deployment cannot be proven`);
|
|
227
|
+
if (!merge.mergeCommit) return result("deploy", "miss", "cannot resolve merge commit; live deployment cannot be proven");
|
|
251
228
|
try {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
} catch {}
|
|
256
|
-
const buildCommit = typeof version.buildCommit === "string" ? version.buildCommit : typeof version.commit === "string" ? version.commit : void 0;
|
|
257
|
-
if (buildCommit && merge.mergeCommit) {
|
|
258
|
-
const contains = await deps.commitContains(repoRoot, merge.mergeCommit, buildCommit);
|
|
259
|
-
const observed = `build commit ${buildCommit.slice(0, 8)} ${contains ? "contains" : "does not contain"} merge ${merge.mergeCommit.slice(0, 8)}`;
|
|
260
|
-
return result("deploy", contains ? "pass" : "miss", observed);
|
|
261
|
-
}
|
|
262
|
-
if (!merge.mergedAt) return result("deploy", "miss", "cannot resolve merge time for best-effort deploy check");
|
|
263
|
-
const mergedAt = new Date(merge.mergedAt);
|
|
264
|
-
if (Number.isNaN(mergedAt.getTime())) return result("deploy", "miss", `cannot parse merge time ${merge.mergedAt}`);
|
|
265
|
-
const port = Number(new URL(baseUrl).port || (new URL(baseUrl).protocol === "https:" ? 443 : 80));
|
|
266
|
-
const [startedAt, builtAt] = await Promise.all([deps.serverStartedAt(port), deps.distMtime(repoRoot)]);
|
|
267
|
-
const fresh = startedAt > mergedAt && builtAt > mergedAt;
|
|
268
|
-
const observed = `best-effort — build commit not exposed (PAN-2713): server started ${startedAt.toISOString()}, dist built ${builtAt.toISOString()}, merge ${mergedAt.toISOString()}`;
|
|
269
|
-
return result("deploy", fresh ? "pass" : "miss", observed);
|
|
229
|
+
const contains = await deps.commitContains(repoRoot, merge.mergeCommit, buildCommit);
|
|
230
|
+
const observed = `build commit ${buildCommit.slice(0, 8)} ${contains ? "contains" : "does not contain"} merge ${merge.mergeCommit.slice(0, 8)}`;
|
|
231
|
+
return result("deploy", contains ? "pass" : "miss", observed);
|
|
270
232
|
} catch (error) {
|
|
271
233
|
return result("deploy", "miss", `deploy evidence unavailable: ${error instanceof Error ? error.message : String(error)}`);
|
|
272
234
|
}
|
|
@@ -390,7 +352,7 @@ function close(ctx, opts = {}) {
|
|
|
390
352
|
*
|
|
391
353
|
* 1. Verify branch merged (hard fail if not — must pass before any cleanup)
|
|
392
354
|
* 2. Move PRD + archive workspace artifacts (hard fail if archiving fails)
|
|
393
|
-
* 3. Mark
|
|
355
|
+
* 3. Mark xBRIEF completed
|
|
394
356
|
* 4. Clean up workspace (tmux, TLDR, Docker, worktree)
|
|
395
357
|
* 5. Clean up agent state
|
|
396
358
|
* 6. Close issue on tracker
|
|
@@ -424,10 +386,10 @@ function closeOut(ctx, opts = {}) {
|
|
|
424
386
|
allSteps.push(stepFailed("close-out:abort", "Stopped — archiving failed, workspace preserved"));
|
|
425
387
|
return buildResult("close-out", ctx.issueId, allSteps, start, dodGate);
|
|
426
388
|
}
|
|
427
|
-
const
|
|
428
|
-
allSteps.push(
|
|
429
|
-
if (!
|
|
430
|
-
allSteps.push(stepFailed("close-out:abort", "Stopped —
|
|
389
|
+
const xbriefStep = yield* Effect.promise(() => completeXBriefStep(ctx));
|
|
390
|
+
allSteps.push(xbriefStep);
|
|
391
|
+
if (!xbriefStep.success && !xbriefStep.skipped) {
|
|
392
|
+
allSteps.push(stepFailed("close-out:abort", "Stopped — xBRIEF completion failed, workspace preserved"));
|
|
431
393
|
return buildResult("close-out", ctx.issueId, allSteps, start, dodGate);
|
|
432
394
|
}
|
|
433
395
|
const closeOutConfig = (yield* Effect.promise(() => Effect.runPromise(loadCloisterConfig()))).close_out;
|
|
@@ -577,19 +539,19 @@ function resetToTodo(ctx, opts = {}) {
|
|
|
577
539
|
function cancelIssueWorkflow(ctx, opts = {}) {
|
|
578
540
|
return destructiveResetWorkflow("cancel", ctx, opts, resetIssueToCanceled, "Canceling issue", "Issue moved to Canceled");
|
|
579
541
|
}
|
|
580
|
-
async function
|
|
542
|
+
async function completeXBriefStep(ctx) {
|
|
581
543
|
const step = "close-out:vbrief-completed";
|
|
582
544
|
try {
|
|
583
|
-
const {
|
|
584
|
-
const result = await Effect.runPromise(
|
|
585
|
-
const details = [result.moved ? "Updated
|
|
586
|
-
if (result.committed) details.push("Committed
|
|
545
|
+
const { transitionXBriefOnMain } = await import("./lifecycle-io-Bsnr2K4F.js");
|
|
546
|
+
const result = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, ctx.issueId, "completed", "completed", `scope: complete ${ctx.issueId.toUpperCase()} xBRIEF`));
|
|
547
|
+
const details = [result.moved ? "Updated xBRIEF lifecycle to completed" : "xBRIEF lifecycle already completed", result.statusUpdated ? "Updated plan.status to completed" : "plan.status already completed"];
|
|
548
|
+
if (result.committed) details.push("Committed xBRIEF completion on main");
|
|
587
549
|
return stepOk(step, details);
|
|
588
550
|
} catch (err) {
|
|
589
551
|
const cause = err.cause ?? err;
|
|
590
552
|
const message = cause instanceof Error ? cause.message : String(cause);
|
|
591
|
-
if (message.includes("No
|
|
592
|
-
return stepFailed(step, `
|
|
553
|
+
if (message.includes("No xBRIEF found")) return stepSkipped(step, [`No xBRIEF found for ${ctx.issueId}`]);
|
|
554
|
+
return stepFailed(step, `xBRIEF completion failed: ${message}`);
|
|
593
555
|
}
|
|
594
556
|
}
|
|
595
557
|
async function verifyBranchMergedImpl(ctx) {
|
|
@@ -597,7 +559,7 @@ async function verifyBranchMergedImpl(ctx) {
|
|
|
597
559
|
const branchName = `feature/${ctx.issueId.toLowerCase()}`;
|
|
598
560
|
try {
|
|
599
561
|
try {
|
|
600
|
-
const { loadReviewStatuses } = await import("./review-status-
|
|
562
|
+
const { loadReviewStatuses } = await import("./review-status-C6n6-9f_.js");
|
|
601
563
|
if (loadReviewStatuses()[ctx.issueId.toUpperCase()]?.mergeStatus === "merged") return stepOk(step, ["Merge specialist confirmed merge completed"]);
|
|
602
564
|
} catch {}
|
|
603
565
|
const { stdout: branchExists } = await execAsync(`git branch --list "${branchName}" 2>/dev/null || true`, {
|
|
@@ -821,7 +783,7 @@ async function resetIssueToTodoImpl(ctx) {
|
|
|
821
783
|
*/
|
|
822
784
|
async function resetPostMergeStateForIssue(issueId) {
|
|
823
785
|
try {
|
|
824
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
786
|
+
const { resetPostMergeState } = await import("./merge-agent-BQM3a8z5.js");
|
|
825
787
|
resetPostMergeState(issueId);
|
|
826
788
|
resetPostMergeState(issueId.toUpperCase());
|
|
827
789
|
} catch {
|
|
@@ -837,18 +799,18 @@ function clearReviewStatusStep(issueId) {
|
|
|
837
799
|
async function clearReviewStatusStepImpl(issueId) {
|
|
838
800
|
const step = "clear-review-status";
|
|
839
801
|
try {
|
|
840
|
-
const { clearReviewStatus } = await import("./review-status-
|
|
802
|
+
const { clearReviewStatus } = await import("./review-status-C6n6-9f_.js");
|
|
841
803
|
clearReviewStatus(issueId.toUpperCase());
|
|
842
804
|
return stepOk(step, ["Review status cleared"]);
|
|
843
805
|
} catch {
|
|
844
806
|
try {
|
|
845
807
|
const statusFile = join$1(OVERDECK_HOME, "review-status.json");
|
|
846
808
|
if (existsSync(statusFile)) {
|
|
847
|
-
const data = JSON.parse(await readFile
|
|
809
|
+
const data = JSON.parse(await readFile(statusFile, "utf-8"));
|
|
848
810
|
const upperKey = issueId.toUpperCase();
|
|
849
811
|
if (data[upperKey]) {
|
|
850
812
|
delete data[upperKey];
|
|
851
|
-
await writeFile
|
|
813
|
+
await writeFile(statusFile, JSON.stringify(data, null, 2));
|
|
852
814
|
}
|
|
853
815
|
}
|
|
854
816
|
return stepOk(step, ["Review status cleared (direct)"]);
|
|
@@ -904,4 +866,4 @@ async function resetIssueToCanceledImpl(ctx) {
|
|
|
904
866
|
//#endregion
|
|
905
867
|
export { deepWipe as a, closeOut as i, cancelIssueWorkflow as n, resetToTodo as o, close as r, verifyBranchMergedImpl as s, approve as t };
|
|
906
868
|
|
|
907
|
-
//# sourceMappingURL=workflows-
|
|
869
|
+
//# sourceMappingURL=workflows-C9WmILql.js.map
|