@overdeck/desktop 0.47.0 → 0.48.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/drizzle/overdeck/0000_overdeck_init.sql +59 -0
- package/package.json +1 -1
- package/server/{acceptance-criteria-10Ur5Dne.js → acceptance-criteria-DmtLDbtt.js} +2 -2
- package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
- package/server/activity-logger-K7FYGF_z.js +3 -0
- package/server/{advancing-selfheal-BNwqxseD.js → advancing-selfheal-8AR68Asf.js} +6 -6
- package/server/{agent-gc-C3h9Or3a.js → agent-gc-BmYeT6eH.js} +5 -5
- package/server/agent-state-Dq3s84-P.js +3 -0
- package/server/{agent-state-service-C63p_ftq.js → agent-state-service-DK1Vay1E.js} +1 -1
- package/server/{agent-state-service-Ds6OeFvo.js → agent-state-service-rjnzpHDx.js} +6 -6
- package/server/agent-state-source-Ds968-j6.js +21 -0
- package/server/{agents-J5mEnekq.js → agents-Dls7tfJH.js} +5 -5
- package/server/agents-IPSa5kzn.js +3 -0
- package/server/{archive-planning-BwhxeP7C.js → archive-planning-Cq7cyinS.js} +51 -24
- package/server/archive-planning-MbkGCBIY.js +2 -0
- package/server/{artifact-index-jobs-D1q_vR3V.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
- package/server/{assemble-Bgwqv-Ro.js → assemble-BTCmbcfH.js} +20 -13
- package/server/{auto-spawn-consent-CQ9Bi9q6.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
- package/server/{backlog-auto-trigger-n1lzPgN4.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
- package/server/{behavior-td6-xhQk.js → behavior-DIMQMRzs.js} +2 -2
- package/server/{boot-reconciled-stop-events-C7gGe3oB.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
- package/server/{bridge-pool-patrol-CYH2OLb5.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
- package/server/{briefing-freshness-DRqZ8lAz.js → briefing-freshness-3PNmL_p3.js} +2 -2
- package/server/{build-info-7yiEpl6u.js → build-info-CJg813Hm.js} +3 -3
- package/server/{build-info-CpG__c63.js → build-info-CXyeFsXu.js} +1 -1
- package/server/{checkpoint-manager-CkKmB0wZ.js → checkpoint-manager-9t7G5c1V.js} +1 -1
- package/server/{checkpoint-manager-DBcyNR8w.js → checkpoint-manager-B2G38R3p.js} +3 -3
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-Wm963lm8.js → checkpoints-CuBgiXO-.js} +1 -1
- package/server/{checkpoints-D95apurL.js → checkpoints-VTZMd4Qm.js} +2 -2
- package/server/{claude-hooks-provision-Bjitl9aI.js → claude-hooks-provision-55SyQaPz.js} +2 -2
- package/server/{claude-hooks-provision-4RPxNkE8.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
- package/server/{claude-permissions-CpbpvUQ2.js → claude-permissions-Cn0dIu2i.js} +2 -2
- package/server/{claude-settings-overlay-BzkHYDwR.js → claude-settings-overlay-B19hdzSA.js} +1 -1
- package/server/{claude-settings-overlay-_H9Yrzab.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
- package/server/{cli-Cte9ZFGn.js → cli-C9S84iTy.js} +79 -22
- package/server/cli-M1cwZ__d.js +3 -0
- package/server/{cliproxy-C5fMJ7rY.js → cliproxy-CJq3KXU6.js} +2 -2
- package/server/{cliproxy-DaAbWMjC.js → cliproxy-DgEZlr7Y.js} +1 -1
- package/server/{close-issue-BPh1ARCF.js → close-issue-DPxRddGR.js} +5 -5
- package/server/{closed-issue-reaper-DoOZqGFK.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
- package/server/{closed-issue-reaper-DHRfRMrp.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
- package/server/{codex-o8FJwzmy.js → codex-B3n_rkwn.js} +1 -1
- package/server/{codex-BzGDW_d3.js → codex-CjkD1PJu.js} +6 -6
- package/server/{codex-parser-Dt-ycU8L.js → codex-parser-DpB1Il-P.js} +2 -2
- package/server/{compaction-continuation-CvXpbZ4w.js → compaction-continuation-DZD9ukSE.js} +3 -3
- package/server/{config-CL3Gyvja.js → config-C5saf4Ja.js} +1 -1
- package/server/{config-BvLe652W.js → config-DnLJATZk.js} +2 -2
- package/server/{config-Bi3u1VK7.js → config-DvM8jtQK.js} +2 -2
- package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
- package/server/{conflict-gate-CX80JYYS.js → conflict-gate-DXa_L28t.js} +1 -1
- package/server/{conflict-gate-E4nt7ZeS.js → conflict-gate-WfVqgalf.js} +4 -4
- package/server/{context-layers-DAG83UZt.js → context-layers-D7UqH9Ab.js} +2 -2
- package/server/{context-layers-C_IIysnm.js → context-layers-Dpz3Vd6d.js} +3 -3
- package/server/{control-settings-CiqGxXnc.js → control-settings-DVf6pKyv.js} +4 -4
- package/server/{conversation-compaction-BE3CNtHF.js → conversation-compaction-5XuH6OBn.js} +1 -1
- package/server/{conversation-compaction-D6-yLtqt.js → conversation-compaction-COrbnX1J.js} +8 -8
- package/server/{conversation-service-DBxoYMDl.js → conversation-service-BufdtnZF.js} +169 -10
- package/server/{conversation-service-D_TS2b1r.js → conversation-service-DnUyIiLb.js} +1 -1
- package/server/{conversations-D0UEdLtk.js → conversations-B4rxz-Wl.js} +17 -10
- package/server/{conversations-BKDVpB-3.js → conversations-D1bwxQMy.js} +1 -1
- package/server/{cost-DpgYmYqR.js → cost-CpFDrJUS.js} +46 -2
- package/server/{cost-DS1s0DbG.js → cost-KLuwKCW9.js} +3 -3
- package/server/{cost-sync-tOCCGnEt.js → cost-sync-cesi9dp8.js} +3 -3
- package/server/{dag-BtkgLeqY.js → dag-BYiFMqpU.js} +2 -2
- package/server/{dangerous-git-ops-CFLykHWt.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-BIblC-WX.js → deacon-BbsWw8a6.js} +3 -3
- package/server/{deacon-pLRLbPvR.js → deacon-HdEh0Esp.js} +863 -214
- package/server/deacon-event-client-C93rvOT7.js +237 -0
- package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
- package/server/{deacon-nudge-log-B08gF0mh.js → deacon-nudge-log-BND_97Wo.js} +4 -3
- package/server/{deacon-pending-lifecycle-B-Io84AP.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
- package/server/deacon-swarm-DgWADWd_.js +2 -0
- package/server/{deacon-swarm-v5PMun-m.js → deacon-swarm-rqrl4TMs.js} +39 -18
- package/server/deacon.js +12 -210
- package/server/{dead-end-trip-D8A3msX9.js → dead-end-trip-DSF23CLX.js} +4 -3
- package/server/dead-end-trip-zKlS4v6f.js +2 -0
- package/server/delivery-CsbQdZkS.js +3 -0
- package/server/{deploy-patrol-sYgOxLeb.js → deploy-patrol-kARAkji4.js} +17 -21
- package/server/{deploy-queue-VfohaPN_.js → deploy-queue-Bj0HJT1i.js} +2 -2
- package/server/{deploy-queue-gHJBycaF.js → deploy-queue-rjTUy1RM.js} +1 -1
- package/server/{deploy-window-D4DQb8VP.js → deploy-window-B2IM-9G5.js} +10 -44
- package/server/{deploy-window-CFRZ0-kt.js → deploy-window-BNFWnA8D.js} +1 -1
- package/server/{dev-supervisor-DiOBDM1c.js → dev-supervisor-B1mZYXz4.js} +2 -2
- package/server/{devcontainer-renderer-BUOIlfgD.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
- package/server/{dist-C3A8B8wM.js → dist-3W--cGMa.js} +1 -1
- package/server/dist-BR0QtwmS.js +3 -0
- package/server/{dist-src-C0adpegX.js → dist-src-C-Vk2jNk.js} +1 -1
- package/server/{docker-Y3PElJb0.js → docker-DH3jUYg1.js} +1 -1
- package/server/{docker-BJzlkqYB.js → docker-meuLKLzV.js} +27 -20
- package/server/{dod-DlNtcH6n.js → dod-D7-9dCOD.js} +1 -1
- package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
- package/server/{durable-review-pipeline-DP6bIcOY.js → durable-review-pipeline-CStTgOAf.js} +1 -1
- package/server/{durable-review-pipeline-Cibps-Rg.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
- package/server/{ensure-devcontainer-DMAbWqtQ.js → ensure-devcontainer-BE3llBWP.js} +1 -1
- package/server/{ensure-devcontainer-BAofzBPv.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
- package/server/{esm-shims-BeObUkaw.js → esm-shims-Bzy4ZzNU.js} +1 -1
- package/server/event-store-COd2tOx8.js +3 -0
- package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
- package/server/{events-CF8QDbuV.js → events-CCkFWa7X.js} +1 -1
- package/server/{events-BNrvchBg.js → events-zjDQozet.js} +3 -3
- package/server/{factory-Cmm9Hsho.js → factory-DhavwKVc.js} +5 -5
- package/server/{feature-registry-population-B6HpNWRy.js → feature-registry-population-DWGBKyWd.js} +4 -4
- package/server/{feature-registry-storage-DJEFx1Pf.js → feature-registry-storage-C5DkXmCM.js} +3 -3
- package/server/{features-D5km80UI.js → features-CC47YcCX.js} +2 -2
- package/server/{feedback-target-BJ5ZADsu.js → feedback-target-D9Tex35_.js} +1 -1
- package/server/{feedback-target-DSxEL6lP.js → feedback-target-DoRCR3L-.js} +18 -7
- package/server/{feedback-writer-CoB9Z6aU.js → feedback-writer-CTSuA6lw.js} +1 -1
- package/server/{feedback-writer-C27Hak8a.js → feedback-writer-DdsBdtNL.js} +5 -5
- package/server/{flywheel-DZZdtiOL.js → flywheel-DHWHzaYK.js} +1 -1
- package/server/{flywheel-f662Q-y2.js → flywheel-DJQa9az8.js} +14 -14
- package/server/{flywheel-BHx8XuMr.js → flywheel-TacAI9MA.js} +21 -17
- package/server/{flywheel-merge-order-Dil0LmdN.js → flywheel-merge-order-D2foPh88.js} +1 -1
- package/server/{flywheel-merge-order-D_xLMbJU.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
- package/server/forge-CdlCG9aS.js +3 -0
- package/server/{forge-BaKGCya6.js → forge-c8LeC-tw.js} +2 -2
- package/server/{from-B3tZbB55.js → from-BogSwvr2.js} +1 -1
- package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
- package/server/{fts-operations-B9jG8wa3.js → fts-operations-DP9R-8Q3.js} +3 -3
- package/server/{git-utils-Xg4PFN45.js → git-utils-C31x1lpE.js} +1 -1
- package/server/{git-utils-CsvYfJU3.js → git-utils-xQ74FoSn.js} +5 -4
- package/server/{github-app-Bmg4R9mv.js → github-app-CpQSDlv8.js} +1 -1
- package/server/{github-app-CmNk0zLU.js → github-app-D2QuvZ3j.js} +3 -3
- package/server/{github-client-qazkPrg0.js → github-client-D9YvJX5D.js} +3 -3
- package/server/{github-client-B6KM9_wA.js → github-client-Tpi3PmKX.js} +1 -1
- package/server/{github-pr-lookup-DAcVeRLK.js → github-pr-lookup-DvBMv-IW.js} +2 -2
- package/server/{harness-binary-BSpiXaLw.js → harness-binary-BHxWf_sX.js} +7 -6
- package/server/{harness-resolve-BAJu5MX8.js → harness-resolve-bj9WMABA.js} +4 -4
- package/server/{health-events-BwX32k8d.js → health-events-bCDPn59Z.js} +2 -2
- package/server/{health-events-2Z6Wa9SM.js → health-events-qo7Ss34U.js} +1 -1
- package/server/{hooks-DbtbimEf.js → hooks-Dyxtg5fk.js} +2 -2
- package/server/{hooks-D1g1jKLI.js → hooks-X2XHBB2b.js} +1 -1
- package/server/{hume-DXNiu6nQ.js → hume-DrZEGpqc.js} +2 -2
- package/server/hume-YPsy4UA8.js +3 -0
- package/server/{idle-stack-reaper-Cy-dQzW4.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
- package/server/{idle-stack-reaper-CRA1e0jr.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
- package/server/{in-flight-guard-D-sSkADM.js → in-flight-guard-CG2Eo-rr.js} +1 -1
- package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
- package/server/{injection-Bl8d_jHZ.js → injection-BisQ0lpX.js} +1 -1
- package/server/{injection-6AGnXxlj.js → injection-C9sxqbc2.js} +73 -193
- package/server/{inspect-agent-nXdIptyh.js → inspect-agent-BoSO51YC.js} +12 -12
- package/server/inspect-agent-BykeOH4a.js +2 -0
- package/server/{internal-token-DzK385vD.js → internal-token-AvXePaQT.js} +2 -2
- package/server/{internal-token-Ias7N8Kg.js → internal-token-Djkj-yqK.js} +1 -1
- package/server/{io-B00PBNku.js → io-mxOWMZ7I.js} +6 -6
- package/server/{issue-closed-BehTG1be.js → issue-closed-Bj_bCv_0.js} +7 -7
- package/server/{issue-lifecycle-BqSuQvbn.js → issue-lifecycle-A5YIpDZE.js} +1 -1
- package/server/{issue-lifecycle-Birk-ifu.js → issue-lifecycle-BXUqaHzF.js} +32 -28
- package/server/{issue-service-singleton-C6ZduvuY.js → issue-service-singleton-BPNEXczv.js} +11 -11
- package/server/{issue-service-singleton-B2wXiIlw.js → issue-service-singleton-CcaHjKPR.js} +1 -1
- package/server/{issues-DQ5-LatB.js → issues-AX-YBeAQ.js} +2 -2
- package/server/{jsonl-parser-BDpnGFCl.js → jsonl-parser-CgYWQ20q.js} +7 -3
- package/server/kimi-code-BYbme0aV.js +579 -0
- package/server/kimi-code-D_Ppt82c.js +3 -0
- package/server/kimi-parser-B-JBg3Pv.js +147 -0
- package/server/{label-cleanup-Dwnky8FG.js → label-cleanup-sXUlgdM0.js} +3 -3
- package/server/{lifecycle-B4Xdb4cY.js → lifecycle-D2X3al0D.js} +2 -2
- package/server/{lifecycle-B3s4sM1G.js → lifecycle-DjlljAZ1.js} +6 -6
- package/server/{lifecycle-io-CzTHEooc.js → lifecycle-io-C5nVk55o.js} +1 -1
- package/server/{lifecycle-io-DCo6s6ks.js → lifecycle-io-NPm1YtIG.js} +5 -5
- package/server/{linear-client-CnbtHiic.js → linear-client--luYwCZg.js} +1 -1
- package/server/{linear-client-9uq7fhiV.js → linear-client-B8pLegW1.js} +3 -3
- package/server/{linear-mcp-auth-BxUOzswy.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
- package/server/{linear-mcp-auth-D46fBCLf.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-DiW9RdSB.js → merge-Bx5Bh9pi.js} +3 -3
- package/server/{merge-sr8Nrnmi.js → merge-Dqmh_zja.js} +1 -1
- package/server/{merge-agent-BLUgRsz3.js → merge-agent-DP9AUY29.js} +33 -33
- package/server/{merge-agent-DQTXZk8z.js → merge-agent-DWd0KfiS.js} +1 -1
- package/server/{merge-batch-Cp_j9BGk.js → merge-batch-BdmvTEAC.js} +1 -1
- package/server/{merge-completeness-BLbB5-6n.js → merge-completeness-BfRwFjRx.js} +1 -1
- package/server/{merge-completeness-B46KqhtY.js → merge-completeness-C1FevcDT.js} +4 -4
- package/server/merge-ops-B98tKc1e.js +2 -0
- package/server/merge-rebase-BLykMwPO.js +2 -0
- package/server/{merge-rebase-DIkBjgwq.js → merge-rebase-BX1xKsrE.js} +2 -2
- package/server/{merge-set-CBgHfwM0.js → merge-set-DsLjjLEV.js} +4 -4
- package/server/{merge-set-DeUxFsC3.js → merge-set-H6epHOsw.js} +1 -1
- package/server/{merge-sync-kr4vqyjM.js → merge-sync-BEdfsQV4.js} +2 -2
- package/server/{merge-sync-CpGmk6Ch.js → merge-sync-BebcWWGA.js} +1 -1
- package/server/{merge-train-Dmrcus12.js → merge-train-D1I0lNOT.js} +4 -4
- package/server/{merge-train-deps-D_uGX91G.js → merge-train-deps-D_-C0Pk2.js} +4 -4
- package/server/{merge-verification-NvaAd8CZ.js → merge-verification-DN1Ov9bU.js} +6 -6
- package/server/{merged-docker-cleanup-worker-Y1R06TEl.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
- package/server/{merged-docker-cleanup-worker-DH_hrGPI.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
- package/server/{multipart-parser-R-oC8dQg.js → multipart-parser-CL5QG8iv.js} +2 -2
- package/server/{no-resume-mode-BgD0JUmM.js → no-resume-mode-DUR7Hi98.js} +1 -1
- package/server/node_modules/.package-lock.json +7 -7
- package/server/node_modules/brace-expansion/README.md +23 -1
- package/server/node_modules/brace-expansion/index.js +206 -85
- package/server/node_modules/brace-expansion/package.json +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
- package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.js +34 -28
- package/server/node_modules/msgpackr/dist/index.js.map +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js +1 -1
- package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
- package/server/node_modules/msgpackr/dist/node.cjs +36 -29
- package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
- package/server/node_modules/msgpackr/dist/test.js +63 -32
- package/server/node_modules/msgpackr/dist/test.js.map +1 -1
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
- package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
- package/server/node_modules/msgpackr/package.json +1 -1
- package/server/node_modules/msgpackr/unpack.js +34 -28
- package/server/{orphan-proposed-reconciler-DcgTPPFY.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
- package/server/{orphan-proposed-reconciler-B6vJHxtX.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
- package/server/package-lock.json +8 -8
- package/server/package.json +1 -1
- package/server/{pan-dir-DMzF5wne.js → pan-dir-DhgKfO86.js} +21 -6
- package/server/{paths-sJBSb7Ul.js → paths-BUuhi6jM.js} +17 -17
- package/server/{pending-lifecycle-claim-DilzGfgk.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
- package/server/{persistent-logger-H_VjuOu7.js → persistent-logger-s8cbpFNV.js} +2 -2
- package/server/{pickup-DWhqzliO.js → pickup-2AxtB3dW.js} +1 -1
- package/server/{pipeline-membership-C88VBnhJ.js → pipeline-membership-2_okL5bm.js} +1 -1
- package/server/{pipeline-membership-D9SBvItj.js → pipeline-membership-Dqv6_0ig.js} +1 -1
- package/server/{pipeline-membership-gather-4eR-7Tqy.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
- package/server/{pipeline-membership-gather-CeVGnNJ2.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
- package/server/{pipeline-notifier-DT6xLFao.js → pipeline-notifier-CO9rxJgB.js} +1 -1
- package/server/{pipeline-notifier-D0ALV6Nw.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
- package/server/{post-merge-lifecycle-worker-8HIeS_J6.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
- package/server/{project-pipelines-9SKt2bEc.js → project-pipelines-72WE8GVK.js} +2 -2
- package/server/{project-repos-B5pIphKg.js → project-repos-BAqDwtvi.js} +16 -11
- package/server/project-repos-Df90Zw7Y.js +3 -0
- package/server/projects-WqMWCdpa.js +3 -0
- package/server/{prompts-CgzMBvQF.js → prompts-XkL10m8M.js} +2 -2
- package/server/{providers-BJQSnAAp.js → providers-ClGPGkQ8.js} +15 -12
- package/server/providers-DFUOed8u.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
- package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
- package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
- package/server/public/assets/index-Cml-kHo6.css +1 -0
- package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
- package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
- package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
- package/server/public/index.html +2 -2
- package/server/{pull-requests-7BgLDsIo.js → pull-requests-B-KrUph5.js} +3 -3
- package/server/{pull-requests-Dq0y6IxE.js → pull-requests-DK5k92B4.js} +1 -1
- package/server/{queries-C-MUZaIy.js → queries-DVpl1vsU.js} +1212 -193
- package/server/{rally-CPysR4T_.js → rally-DbE561hD.js} +3 -3
- package/server/rally-O_st_X7n.js +3 -0
- package/server/{rally-api-8Ptlp2os.js → rally-api-CZLeEd2C.js} +2 -2
- package/server/{rally-api-CgosKdKL.js → rally-api-DaHtn5QN.js} +1 -1
- package/server/{rally-client-CCX0hADj.js → rally-client-C-MAl8ur.js} +1 -1
- package/server/{rally-client-iYMHWQD7.js → rally-client-Ch3zRsBX.js} +5 -5
- package/server/{reap-terminal-sessions-Qf-9LVQc.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
- package/server/{reap-terminal-sessions-4Xg9NGA8.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
- package/server/{rebuild-stack-CMdgaylx.js → rebuild-stack-C9Li44A3.js} +20 -10
- package/server/{rebuild-stack-DqcOVmJO.js → rebuild-stack-qC0jCNm6.js} +2 -2
- package/server/{reconstruct-cache-CMZJ_Vjq.js → reconstruct-cache-BHyiAg02.js} +7 -7
- package/server/record-aVzu-LGm.js +3 -0
- package/server/record-update-CZh46a2f.js +617 -0
- package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
- package/server/recovery-trip-CSNWSLDn.js +77 -0
- package/server/recovery-trip-_16hFKv4.js +3 -0
- package/server/{release-engine-B2X9AfFC.js → release-engine-Be5MX5GP.js} +5 -5
- package/server/{release-set-G4XKyQ8K.js → release-set-DJv_O6PS.js} +3 -3
- package/server/{remote-BXarMvqf.js → remote-BMM3uH2J.js} +3 -3
- package/server/{remote-CUhyqjXk.js → remote-C0xVTHA5.js} +3 -3
- package/server/{remote-agents-CLZB3Coc.js → remote-agents-BIIoc5pD.js} +1 -1
- package/server/{remote-agents-Bba-MgSA.js → remote-agents-EUiZ26bj.js} +7 -7
- package/server/{remote-completion-CwAp79EC.js → remote-completion-BS4tJUn8.js} +13 -13
- package/server/resolver-BvHd6RE4.js +163 -0
- package/server/resume-9thEqAQR.js +3 -0
- package/server/{review-agent--pOptAEV.js → review-agent-BHGaBoBu.js} +29 -29
- package/server/{review-agent-BTCNkq2h.js → review-agent-CD3RQ-tc.js} +1 -1
- package/server/{review-artifacts-BNmw8dWE.js → review-artifacts-DyhajWso.js} +6 -6
- package/server/{review-context-DFxYOOJW.js → review-context-B-dlsPnx.js} +9 -9
- package/server/{review-convoy-liveness-BgU_1jJf.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
- package/server/{review-status-Dma9SFaN.js → review-status-B6wYcOtP.js} +1 -1
- package/server/{review-status-CGvlA4o_.js → review-status-CKLk5aZ-.js} +308 -58
- package/server/{review-status-emit-DURrmGYX.js → review-status-emit-CJ7UmEVU.js} +3 -3
- package/server/{review-status-enrichment-8NiNXi5W.js → review-status-enrichment-DJRgGX7-.js} +3 -3
- package/server/review-status-limits-4EJDCGHO.js +7 -0
- package/server/{review-status-source-DIk1JSow.js → review-status-source-7nU3Z2wL.js} +1 -1
- package/server/{review-status-source-BLx_1siH.js → review-status-source-BsDYGfyv.js} +1 -1
- package/server/{review-status-sync-muT-EBp2.js → review-status-sync-BLssMTEW.js} +1 -1
- package/server/{review-status-sync-0GxOqeqF.js → review-status-sync-BxBeHRde.js} +35 -11
- package/server/{review-verdict-feedback-xJNdqBnX.js → review-verdict-feedback-5jWuzgpc.js} +90 -16
- package/server/{review-verdict-feedback-HwF6ODFy.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
- package/server/{rollup-BQaol5TX.js → rollup-BGIrCEkU.js} +79 -44
- package/server/rollup-CZB4UL9q.js +3 -0
- package/server/{scanner-C-D2cFdX.js → scanner-DydjXPrz.js} +16 -9
- package/server/search-DdtIjAiu.js +395 -0
- package/server/{sequence-io-Bmf1EZM5.js → sequence-io-Fw-cLyDs.js} +4 -4
- package/server/{sequencer-agent-CigMyKh2.js → sequencer-agent-BcpGMt5x.js} +15 -10
- package/server/server.js +1258 -438
- package/server/{service-CD0DvFvD.js → service-BFFkGsG4.js} +58 -58
- package/server/{session-fork-B6cQ5eya.js → session-fork-D0V-3e5P.js} +2 -2
- package/server/{session-history-3ON_IJjm.js → session-history-Bta5l9jY.js} +5 -5
- package/server/{settings-PilbFZAM.js → settings-Ce8B1daF.js} +2 -2
- package/server/{settings-VN0qOh4U.js → settings-E3FnEIUx.js} +3 -3
- package/server/settings-eOOJpxi_.js +2 -0
- package/server/{shadow-engineering-DXvx77oE.js → shadow-engineering-Mt9nJO4i.js} +3 -3
- package/server/{shadow-state-CZBp7pwq.js → shadow-state-Bzj_AZCV.js} +1 -1
- package/server/{shadow-state-BBk_zacw.js → shadow-state-DrkhoVSx.js} +2 -2
- package/server/{shadow-utils-DdZ05AJS.js → shadow-utils-H1GfqP06.js} +2 -2
- package/server/{ship-log-7kJfjUX2.js → ship-log-CFUIo4PR.js} +1 -1
- package/server/{smart-compaction-8fA5k5XN.js → smart-compaction-DSTq-Wua.js} +1 -1
- package/server/{smart-compaction-ByhL9cRS.js → smart-compaction-Hzp3KCJX.js} +7 -7
- package/server/{spawn-planning-session-vLUJoFjy.js → spawn-planning-session-C0uSA2SL.js} +2 -2
- package/server/{spawn-planning-session-pcF-YeFE.js → spawn-planning-session-DN4son31.js} +23 -21
- package/server/{specialist-completion-B07XjWD2.js → specialist-completion-Cf6tpIh1.js} +1 -1
- package/server/{specialist-context-DJ-zFyL3.js → specialist-context-DEUEkjIQ.js} +5 -5
- package/server/{specialist-handoff-logger-aKSxbIgD.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
- package/server/{specialist-logs-Dae-n52_.js → specialist-logs-7Ynue0R7.js} +3 -3
- package/server/{specialists-KR3pKulN.js → specialists-CQwBEGlD.js} +1 -1
- package/server/{specialists-6PWdtWcg.js → specialists-DAjPgYs_.js} +504 -238
- package/server/{specialists-DUiExaxb.js → specialists-Hr6iW9fU.js} +18 -18
- package/server/{specialists-Bz-wFT7R.js → specialists-MOoeB4A8.js} +1 -1
- package/server/specs-Dl88cbKY.js +3 -0
- package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
- package/server/{src-vHy2-oCv.js → src-DQnkPN2i.js} +3 -3
- package/server/{src-rac0Mepv.js → src-DhfDV0o4.js} +6 -6
- package/server/{stack-health-DqLTiEu4.js → stack-health-D_iKwNRg.js} +107 -16
- package/server/stack-health-deVSdDwn.js +3 -0
- package/server/{stale-task-claims-Cab_Fo_Z.js → stale-task-claims-BYJGqhLI.js} +5 -5
- package/server/{staleness-CGTZyp6V.js → staleness-CopBDKnA.js} +1 -1
- package/server/{staleness-C-a5rBxF.js → staleness-D8WeMUHd.js} +1 -1
- package/server/{state-home-722Dkx92.js → state-home-DjN8qduI.js} +24 -3
- package/server/{state-mapping-CybR81Uf.js → state-mapping-DlM7OYRW.js} +1 -1
- package/server/{state-migrate-2u8wIpoL.js → state-migrate-a2p1gtD7.js} +4 -4
- package/server/state-mirror-Cv_XgvT5.js +121 -0
- package/server/{stuck-remediation-r1TJu68G.js → stuck-remediation-CXJX_kki.js} +1 -1
- package/server/{stuck-remediation-CC6q3eqQ.js → stuck-remediation-CbCRSz1v.js} +31 -732
- package/server/{substrate-bug-weights-service-CzIyyWFT.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
- package/server/{summary-fork-BqgmgPDt.js → summary-fork-B61fjRJn.js} +2 -2
- package/server/{summary-fork-Df2WFijM.js → summary-fork-B9pszUJN.js} +91 -10
- package/server/supervisor/{injection-budget-Cg_KIb3o.js → injection-budget-Ar7hgyJq.js} +1 -1
- package/server/supervisor/pty-supervisor.js +12 -3
- package/server/supervisor/{pty-token-BbjwEUUM.js → pty-token-CXCFU0Z8.js} +1 -1
- package/server/{supervisor-BxqSpjcN.js → supervisor-BvnxbuuF.js} +6 -4
- package/server/supervisor-C69kpqvd.js +2 -0
- package/server/{swarm-readiness-DfFxa9-n.js → swarm-readiness-vTw1kqGa.js} +3 -3
- package/server/{system-prerequisites-ICLSkhhZ.js → system-prerequisites-LLzTEqsK.js} +3 -3
- package/server/{teardown-workspace-DRdi_CPa.js → teardown-workspace-CqKKVJr1.js} +15 -15
- package/server/{test-agent-queue-A_-p-i0I.js → test-agent-queue-CWMq7oyG.js} +8 -7
- package/server/{test-verdict-BHgTAwIG.js → test-verdict-NdtgRBuA.js} +1 -1
- package/server/{test-verdict-C4i9aqEP.js → test-verdict-diIWE6hz.js} +15 -3
- package/server/{tldr-daemon-CvWXBhX1.js → tldr-daemon-B1Jhrtc8.js} +1 -1
- package/server/{tldr-daemon-wvsU6bKv.js → tldr-daemon-Bpls1CJB.js} +2 -2
- package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
- package/server/tmux-Cjpx8L8u.js +4 -0
- package/server/{token-DrxwytsZ.js → token-Bgpjo3tE.js} +2 -2
- package/server/token-util-BsjFll-k.js +3 -0
- package/server/{token-util-B48BlCba.js → token-util-BymbpkJp.js} +1 -1
- package/server/{tracker-config-BcPMElRB.js → tracker-config-4DaKVTfc.js} +2 -2
- package/server/{tracker-utils-CJ6BHjcD.js → tracker-utils-BDeAXC-q.js} +2 -2
- package/server/{traefik-connect-DZ6nMYMj.js → traefik-connect-CC5FyxYj.js} +1 -1
- package/server/{tunnel-Bp-dRHZz.js → tunnel-CDWkeceJ.js} +1 -1
- package/server/{tunnel-DUbUPElU.js → tunnel-CPf5M-Pc.js} +3 -3
- package/server/{typed-errors-DyjseiB6.js → typed-errors-9K7Dq_Vn.js} +1 -1
- package/server/{typed-errors-CKeoDdU3.js → typed-errors-DrS5fb5z.js} +1 -1
- package/server/{types-Cm5ASJbq.js → types-DzlUKiuf.js} +4 -3
- package/server/{types-Di8wdakq.js → types-kI9ik8XO.js} +1 -1
- package/server/{uat-promote-verification-CoJuh7XO.js → uat-promote-verification-c_pxoxEc.js} +5 -5
- package/server/{uat-train-4Q0k06CQ.js → uat-train-CWGxBdJO.js} +0 -0
- package/server/{uat-train-Dewoatps.js → uat-train-CfCYd2ve.js} +1 -1
- package/server/{validate-B0C8p66t.js → validate-f3ItVCfm.js} +3 -3
- package/server/{validation-hVOwQk8T.js → validation-5G_wQtea.js} +1 -1
- package/server/{validation-B_kIRfNe.js → validation-7tSiCM82.js} +4 -4
- package/server/{verification-artifact-BxlxTiYK.js → verification-artifact-9h9dH8uX.js} +1 -1
- package/server/{verification-artifact-D70AtckY.js → verification-artifact-C_4WJnf6.js} +1 -1
- package/server/{verification-runner-Bc3cJvpC.js → verification-runner-BV5F6wrA.js} +1 -1
- package/server/{verification-runner-KZTz6u72.js → verification-runner-D58KmBhK.js} +18 -38
- package/server/{vtt-parser-CE_i3Bcw.js → vtt-parser-2iT9OHa9.js} +1 -1
- package/server/{work-agent-prompt-ByrPAzOy.js → work-agent-prompt-D03s4DD1.js} +9 -9
- package/server/{workflows-D0vP1WrK.js → workflows-BMBwLYPV.js} +281 -98
- package/server/workflows-BOmWGpIh.js +2 -0
- package/server/{workspace-DQkRPLlQ.js → workspace-BgflNCH0.js} +3 -3
- package/server/{workspace-COWvdibH.js → workspace-Cn9ywfSW.js} +1 -1
- package/server/{workspace-anchor-drift-pwz23TI1.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
- package/server/{workspace-anchor-drift-DXYIAHzr.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
- package/server/{workspace-config-BdZM4PvZ.js → workspace-config-aUc2nIz6.js} +1 -1
- package/server/{workspace-manager-BPgTrG66.js → workspace-manager-Bem7ZBs9.js} +521 -292
- package/server/workspace-manager-C0CpNh3t.js +3 -0
- package/server/{workspace-metadata-CdjzAP8x.js → workspace-metadata-C5iSlPRo.js} +1 -1
- package/server/{workspace-metadata-DkO_iTLo.js → workspace-metadata-UKmTYmDQ.js} +2 -2
- package/server/{workspaces-CRBJikLp.js → workspaces-DqxgwDZ8.js} +143 -113
- package/sync-sources/hooks/notification-hook +12 -1
- package/sync-sources/hooks/pan-hook-lib.sh +226 -0
- package/sync-sources/hooks/session-start-hook +31 -4
- package/sync-sources/hooks/work-agent-stop-hook +23 -1
- package/sync-sources/skills/pan-memory/SKILL.md +19 -3
- package/sync-sources/skills/pan-projects/SKILL.md +9 -0
- package/sync-sources/skills/pan-restart/SKILL.md +26 -7
- package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
- package/server/activity-logger-CMthG6Vd.js +0 -3
- package/server/agent-state-CYXJVG72.js +0 -3
- package/server/agents-ePFVoZbu.js +0 -3
- package/server/archive-planning-B2XplFzT.js +0 -2
- package/server/cli-CjOCSnfj.js +0 -3
- package/server/deacon-swarm-B1XkIvfr.js +0 -2
- package/server/delivery-BX9HR4wQ.js +0 -3
- package/server/dist-B3YPQa5A.js +0 -3
- package/server/event-store-5UKzh9Jf.js +0 -3
- package/server/forge-B5o319qI.js +0 -3
- package/server/fts-db-IVc4_M3f.js +0 -146
- package/server/hume-VUCNbTgn.js +0 -3
- package/server/inspect-agent-CUwVmr2h.js +0 -2
- package/server/merge-ops-1abz6O_P.js +0 -2
- package/server/merge-rebase-CJJVAJuz.js +0 -2
- package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
- package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
- package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
- package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
- package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
- package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
- package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
- package/server/project-repos-DPjOdfPa.js +0 -3
- package/server/projects-_n3Zui6K.js +0 -3
- package/server/providers-BI1mOBQ4.js +0 -3
- package/server/public/assets/index-Ddkcz3WT.css +0 -1
- package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
- package/server/rally-D_VW4bJv.js +0 -3
- package/server/record-BTwWhtBb.js +0 -3
- package/server/record-update-DaOKS7Wb.js +0 -277
- package/server/recovery-trip-DDH-02ng.js +0 -44
- package/server/resume-mOREjlYu.js +0 -3
- package/server/rollup-BR4t_wck.js +0 -3
- package/server/settings-CVmWiJ-r.js +0 -2
- package/server/specs--enInima.js +0 -3
- package/server/stack-health-BikqHSjn.js +0 -3
- package/server/supervisor-B4anCCSm.js +0 -2
- package/server/tmux-Ctk6RV5l.js +0 -3
- package/server/token-util-D411CAq9.js +0 -3
- package/server/workflows-DtDX08ed.js +0 -2
- package/server/workspace-manager-C1F3XsnS.js +0 -3
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { i as
|
|
10
|
-
import {
|
|
11
|
-
import { i as
|
|
12
|
-
import { t as
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { t as
|
|
1
|
+
import { J as markRecordPipelineClosedOutSync, K as getProjectConfigFromWorkspacePath, Mn as extractPrefixSync, Nn as init_issue_id, X as readIssueRecord, Zr as OVERDECK_HOME, et as resolveProjectForIssue, hi as init_paths, jn as extractNumberSync, q as init_record, rt as writeCloseOutDodGate } from "./config-yaml-BSCqwmX0.js";
|
|
2
|
+
import { f as init_config, s as getDashboardApiUrlSync } from "./config-DnLJATZk.js";
|
|
3
|
+
import { D as resolvePipelineTelemetryContext, E as init_pipeline, p as init_review_status, u as getReviewStatus, w as capturePipelineStage } from "./review-status-CKLk5aZ-.js";
|
|
4
|
+
import { b as init_agents, i as listRunningAgents } from "./queries-DVpl1vsU.js";
|
|
5
|
+
import { c as resolveProjectReposForIssueSync, i as init_project_repos } from "./project-repos-BAqDwtvi.js";
|
|
6
|
+
import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DWGBKyWd.js";
|
|
7
|
+
import { i as loadCloisterConfig, r as init_config$1 } from "./config-DvM8jtQK.js";
|
|
8
|
+
import { r as getAutoCloseOutCanonicalState, t as pruneStoppedAgentsForIssue } from "./agent-gc-BmYeT6eH.js";
|
|
9
|
+
import { i as isTrackerIssueClosed, n as init_issue_closed } from "./issue-closed-Bj_bCv_0.js";
|
|
10
|
+
import { n as getForgeAdapter, r as init_forge } from "./forge-c8LeC-tw.js";
|
|
11
|
+
import { i as findWorkspacePath, t as archivePlanning } from "./archive-planning-Cq7cyinS.js";
|
|
12
|
+
import { a as stepSkipped, i as stepOk, n as init_types, r as stepFailed, t as getLinearApiKey } from "./types-kI9ik8XO.js";
|
|
13
|
+
import { i as gatherIssueBranchContainment, s as init_pipeline_membership_gather } from "./pipeline-membership-gather-CtJ_7aGf.js";
|
|
14
|
+
import { t as closeIssue } from "./close-issue-DPxRddGR.js";
|
|
15
|
+
import { o as init_pull_requests, r as fetchIssuePullRequest, t as fetchCommitCheckRuns } from "./pull-requests-B-KrUph5.js";
|
|
16
|
+
import { a as canAcceptDodMisses, i as buildAbandonedDodGate, n as DOD_ROWS, r as acceptFlagFor, t as BRANCH_ABSENT_MERGE_ERROR } from "./dod-D7-9dCOD.js";
|
|
17
|
+
import { t as teardownWorkspace } from "./teardown-workspace-CqKKVJr1.js";
|
|
16
18
|
import { resolve } from "node:path";
|
|
17
19
|
import { Effect } from "effect";
|
|
18
20
|
import { existsSync } from "fs";
|
|
@@ -36,6 +38,8 @@ init_review_status();
|
|
|
36
38
|
init_record();
|
|
37
39
|
init_issue_closed();
|
|
38
40
|
init_pull_requests();
|
|
41
|
+
init_forge();
|
|
42
|
+
init_project_repos();
|
|
39
43
|
init_pipeline_membership_gather();
|
|
40
44
|
const execFileAsync = promisify(execFile);
|
|
41
45
|
const defaultMergedRowDeps = {
|
|
@@ -54,6 +58,14 @@ const defaultMergedRowDeps = {
|
|
|
54
58
|
readDurableMerges: async (ctx) => {
|
|
55
59
|
return (await readIssueRecord(resolveProjectForIssue(ctx.issueId) ?? getProjectConfigFromWorkspacePath(ctx.projectPath), ctx.issueId))?.closeOut.merges ?? [];
|
|
56
60
|
},
|
|
61
|
+
readMergedForgeArtifacts: async (ctx) => {
|
|
62
|
+
const repos = resolveProjectReposForIssueSync(ctx.issueId)?.filter((repo) => repo.required) ?? [];
|
|
63
|
+
return (await Promise.all(repos.map((repo) => getForgeAdapter(repo.forge).findMergedArtifact({
|
|
64
|
+
sourceBranch: repo.sourceBranch,
|
|
65
|
+
targetBranch: repo.targetBranch,
|
|
66
|
+
cwd: repo.repoPath
|
|
67
|
+
})))).filter((artifact) => artifact !== null);
|
|
68
|
+
},
|
|
57
69
|
readBranchContainment: async (ctx) => {
|
|
58
70
|
const project = resolveProjectForIssue(ctx.issueId) ?? getProjectConfigFromWorkspacePath(ctx.projectPath);
|
|
59
71
|
if (!project) return {
|
|
@@ -69,17 +81,33 @@ const defaultPostMergeRowDeps = {
|
|
|
69
81
|
readCanonicalState: async (ctx) => {
|
|
70
82
|
return getAutoCloseOutCanonicalState(ctx.issueId);
|
|
71
83
|
},
|
|
72
|
-
readMergeStatus: async (issueId) => (await
|
|
84
|
+
readMergeStatus: async (issueId) => (await loadStatus(issueId, defaultDeps))?.status.mergeStatus,
|
|
73
85
|
listAgents: async () => Effect.runPromise(listRunningAgents())
|
|
74
86
|
};
|
|
75
|
-
const defaultMainVerifyRowDeps = {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
const defaultMainVerifyRowDeps = {
|
|
88
|
+
readCheckRuns: async (ctx, commit) => {
|
|
89
|
+
if (!ctx.github) return {
|
|
90
|
+
total: 0,
|
|
91
|
+
failed: [],
|
|
92
|
+
pending: []
|
|
93
|
+
};
|
|
94
|
+
return fetchCommitCheckRuns(ctx.github.owner, ctx.github.repo, commit);
|
|
95
|
+
},
|
|
96
|
+
readContainingDefaultBranchCommits: async (ctx, mergeCommit) => {
|
|
97
|
+
const { stdout } = await execFileAsync("git", [
|
|
98
|
+
"rev-list",
|
|
99
|
+
"--ancestry-path",
|
|
100
|
+
"--first-parent",
|
|
101
|
+
`${mergeCommit}..origin/main`
|
|
102
|
+
], {
|
|
103
|
+
cwd: ctx.projectPath,
|
|
104
|
+
encoding: "utf-8",
|
|
105
|
+
timeout: 1e4,
|
|
106
|
+
maxBuffer: 8 * 1024 * 1024
|
|
107
|
+
});
|
|
108
|
+
return stdout.split("\n").map((line) => line.trim()).filter(Boolean);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
83
111
|
const defaultEvaluateDodGateDeps = {
|
|
84
112
|
review: (issueId, settlement) => checkReviewRow(issueId, defaultDeps, settlement),
|
|
85
113
|
tests: (issueId, settlement) => checkTestsRow(issueId, defaultDeps, settlement),
|
|
@@ -238,11 +266,24 @@ async function checkMergedRow(ctx, deps = defaultMergedRowDeps) {
|
|
|
238
266
|
const merged = result("merged", verified.success || verified.skipped ? "pass" : "miss", observed);
|
|
239
267
|
const branchAbsent = verified.error === BRANCH_ABSENT_MERGE_ERROR;
|
|
240
268
|
let durableMerges = [];
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
269
|
+
let forgeArtifacts = [];
|
|
270
|
+
if (branchAbsent) {
|
|
271
|
+
try {
|
|
272
|
+
durableMerges = await (deps.readDurableMerges ?? defaultMergedRowDeps.readDurableMerges)(ctx);
|
|
273
|
+
} catch (error) {
|
|
274
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
275
|
+
merged.observed = `${merged.observed}; durable merge evidence unavailable: ${message}`;
|
|
276
|
+
}
|
|
277
|
+
if (!ctx.github && deps.readMergedForgeArtifacts) try {
|
|
278
|
+
forgeArtifacts = await deps.readMergedForgeArtifacts(ctx);
|
|
279
|
+
const labels = forgeArtifacts.map((artifact) => {
|
|
280
|
+
return `${artifact.forge === "gitlab" ? artifact.id ? `MR !${artifact.id}` : "GitLab MR" : artifact.id ? `PR #${artifact.id}` : "GitHub PR"} merged${artifact.url ? ` (${artifact.url})` : ""}`;
|
|
281
|
+
});
|
|
282
|
+
if (labels.length > 0) merged.observed = `${merged.observed}; ${labels.join("; ")}`;
|
|
283
|
+
} catch (error) {
|
|
284
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
285
|
+
merged.observed = `${merged.observed}; forge artifact evidence unavailable: ${message}`;
|
|
286
|
+
}
|
|
246
287
|
}
|
|
247
288
|
let pullRequestState;
|
|
248
289
|
if (ctx.github) try {
|
|
@@ -261,7 +302,7 @@ async function checkMergedRow(ctx, deps = defaultMergedRowDeps) {
|
|
|
261
302
|
}
|
|
262
303
|
if (branchAbsent) {
|
|
263
304
|
const forgeMerged = pullRequestState?.toUpperCase() === "MERGED";
|
|
264
|
-
if (durableMerges.length > 0 || forgeMerged) {
|
|
305
|
+
if (durableMerges.length > 0 || forgeMerged || forgeArtifacts.length > 0) {
|
|
265
306
|
merged.status = "pass";
|
|
266
307
|
if (durableMerges.length > 0) merged.observed = `${merged.observed}; durable close-out record contains ${durableMerges.length} merge artifact(s)`;
|
|
267
308
|
} else merged.observed = `${merged.observed}; no merged forge artifact or durable close-out merge record found`;
|
|
@@ -297,13 +338,65 @@ async function checkPostMergeRow(ctx, merged, deps = defaultPostMergeRowDeps) {
|
|
|
297
338
|
return result("post-merge", "miss", `post-merge evidence unavailable: ${error instanceof Error ? error.message : String(error)}`);
|
|
298
339
|
}
|
|
299
340
|
}
|
|
341
|
+
/**
|
|
342
|
+
* PAN-3202: how many default-branch heads above the merge commit are probed for
|
|
343
|
+
* the later-green-run evidence form. The tip of main is often mid-CI, so a single
|
|
344
|
+
* candidate would usually read as pending; five reaches back far enough to find
|
|
345
|
+
* the newest concluded green head without turning one row into a check-run storm.
|
|
346
|
+
*/
|
|
347
|
+
const LATER_GREEN_CANDIDATE_LIMIT = 5;
|
|
348
|
+
/**
|
|
349
|
+
* PAN-3202: the fallback evidence form for DoD row 6. When a merge lands inside a
|
|
350
|
+
* red-main window, the merge commit's own check-runs can never turn green, so the
|
|
351
|
+
* row was permanently unsatisfiable even after main went green hundreds of times
|
|
352
|
+
* with the commit included. A later default-branch head whose check-runs all
|
|
353
|
+
* concluded green, and which contains the merge commit, is strictly stronger
|
|
354
|
+
* evidence than the original run: it proves main is healthy *with* the merge in it,
|
|
355
|
+
* which is exactly what "verified on main" means. Row 7 (deploy) already reasons
|
|
356
|
+
* this way through the same containment relation.
|
|
357
|
+
*/
|
|
358
|
+
async function findLaterGreenDefaultBranchRun(ctx, mergeCommit, deps) {
|
|
359
|
+
const readCandidates = deps.readContainingDefaultBranchCommits ?? defaultMainVerifyRowDeps.readContainingDefaultBranchCommits;
|
|
360
|
+
let candidates;
|
|
361
|
+
try {
|
|
362
|
+
candidates = await readCandidates(ctx, mergeCommit);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
return {
|
|
365
|
+
run: null,
|
|
366
|
+
note: `later-run evidence unavailable: ${error instanceof Error ? error.message : String(error)}`
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
const probed = candidates.slice(0, LATER_GREEN_CANDIDATE_LIMIT);
|
|
370
|
+
for (const sha of probed) try {
|
|
371
|
+
const checks = await deps.readCheckRuns(ctx, sha);
|
|
372
|
+
if (checks.total > 0 && checks.failed.length === 0 && checks.pending.length === 0) return {
|
|
373
|
+
run: {
|
|
374
|
+
sha,
|
|
375
|
+
total: checks.total
|
|
376
|
+
},
|
|
377
|
+
note: ""
|
|
378
|
+
};
|
|
379
|
+
} catch (error) {
|
|
380
|
+
return {
|
|
381
|
+
run: null,
|
|
382
|
+
note: `later-run evidence unavailable: ${error instanceof Error ? error.message : String(error)}`
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
run: null,
|
|
387
|
+
note: probed.length === 0 ? "no later default-branch commit contains the merge" : `no green CI run among the ${probed.length} newest default-branch commit(s) containing the merge`
|
|
388
|
+
};
|
|
389
|
+
}
|
|
300
390
|
async function checkMainVerifyRow(ctx, mergeCommit, deps = defaultMainVerifyRowDeps) {
|
|
301
391
|
if (!ctx.github || !mergeCommit) return result("main-verify", "skip", "no merge commit resolvable — verified-on-main has no durable marker (see DoD row 6)");
|
|
302
392
|
try {
|
|
303
393
|
const checks = await deps.readCheckRuns(ctx, mergeCommit);
|
|
304
|
-
if (checks.total === 0) return result("main-verify", "
|
|
305
|
-
|
|
306
|
-
|
|
394
|
+
if (checks.total > 0 && checks.failed.length === 0 && checks.pending.length === 0) return result("main-verify", "pass", `${checks.total} check-runs concluded successfully on ${mergeCommit}`);
|
|
395
|
+
const parts = [...checks.failed.length > 0 ? [`failed checks: ${checks.failed.join(", ")}`] : [], ...checks.pending.length > 0 ? [`still running: ${checks.pending.join(", ")}`] : []];
|
|
396
|
+
const primary = checks.total === 0 ? `no CI check-runs on merge commit ${mergeCommit}` : `${parts.join("; ")} on ${mergeCommit}`;
|
|
397
|
+
const later = await findLaterGreenDefaultBranchRun(ctx, mergeCommit, deps);
|
|
398
|
+
if (later.run) return result("main-verify", "pass", `${primary}; verified on main by later green CI run ${later.run.sha} containing the merge (${later.run.total} check-runs concluded successfully)`);
|
|
399
|
+
return result("main-verify", checks.total === 0 ? "skip" : "miss", `${primary}; ${later.note}`);
|
|
307
400
|
} catch (error) {
|
|
308
401
|
return result("main-verify", "miss", `could not read merge-commit check-runs: ${error instanceof Error ? error.message : String(error)}`);
|
|
309
402
|
}
|
|
@@ -385,6 +478,23 @@ async function evaluateDodGate(ctx, opts = {}, deps = defaultEvaluateDodGateDeps
|
|
|
385
478
|
passed: rows.every((row) => row.status !== "miss" || Boolean(row.acceptedBy))
|
|
386
479
|
};
|
|
387
480
|
}
|
|
481
|
+
/**
|
|
482
|
+
* PAN-3025: completion witness for the close-out ceremony. Returns closedOutAt
|
|
483
|
+
* only when the journal is terminal AND the live row is gone (the ceremony's
|
|
484
|
+
* final mutating step). closedOut with live status present means a prior run
|
|
485
|
+
* aborted mid-ceremony and must fall through to complete it.
|
|
486
|
+
*/
|
|
487
|
+
async function readCompletedCloseOut(issueId, projectPath) {
|
|
488
|
+
try {
|
|
489
|
+
const record = await readIssueRecord(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(projectPath), issueId.toUpperCase());
|
|
490
|
+
if (!record?.pipeline.closedOut) return null;
|
|
491
|
+
const live = await Effect.runPromise(getReviewStatus(issueId)).catch(() => "unknown");
|
|
492
|
+
if (live === "unknown") return null;
|
|
493
|
+
return live ? null : record.pipeline.closedOutAt ?? "unknown";
|
|
494
|
+
} catch {
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
388
498
|
//#endregion
|
|
389
499
|
//#region ../../lib/lifecycle/workflows.ts
|
|
390
500
|
/**
|
|
@@ -395,6 +505,8 @@ async function evaluateDodGate(ctx, opts = {}, deps = defaultEvaluateDodGateDeps
|
|
|
395
505
|
* closeOut() — Full ceremony: verify-merged + archive + teardown + close + label + clear-status
|
|
396
506
|
* deepWipe() — Destructive: teardown(deleteBranches) + delete agent state + reset issue
|
|
397
507
|
*/
|
|
508
|
+
init_forge();
|
|
509
|
+
init_project_repos();
|
|
398
510
|
init_record();
|
|
399
511
|
init_pipeline();
|
|
400
512
|
const execAsync = promisify$1(exec$1);
|
|
@@ -483,9 +595,14 @@ function closeOut(ctx, opts = {}) {
|
|
|
483
595
|
return Effect.gen(function* () {
|
|
484
596
|
const start = Date.now();
|
|
485
597
|
const allSteps = [];
|
|
598
|
+
const closedOutAt = yield* Effect.promise(() => readCompletedCloseOut(ctx.issueId, ctx.projectPath).catch(() => null));
|
|
599
|
+
if (closedOutAt) {
|
|
600
|
+
allSteps.push(stepSkipped("close-out:idempotent", [`Issue already closed out at ${closedOutAt} — skipping the Definition-of-Done gate and ceremony`]));
|
|
601
|
+
return buildResult("close-out", ctx.issueId, allSteps, start);
|
|
602
|
+
}
|
|
486
603
|
const uatEvidenceStep = yield* Effect.promise(async () => {
|
|
487
604
|
try {
|
|
488
|
-
const { healUatPromotionVerification } = await import("./uat-promote-verification-
|
|
605
|
+
const { healUatPromotionVerification } = await import("./uat-promote-verification-c_pxoxEc.js");
|
|
489
606
|
const evidence = await healUatPromotionVerification(ctx.issueId);
|
|
490
607
|
if (!evidence) return stepSkipped("dod:uat-promotion-evidence", ["No missing UAT-promotion verification evidence found"]);
|
|
491
608
|
return stepOk("dod:uat-promotion-evidence", [`Recorded verification from ${evidence.generation}`, ...evidence.mergeSha ? [`Promoted to main at ${evidence.mergeSha.slice(0, 9)}`] : []]);
|
|
@@ -684,7 +801,7 @@ function cancelIssueWorkflow(ctx, opts = {}) {
|
|
|
684
801
|
async function completeXBriefStep(ctx) {
|
|
685
802
|
const step = "close-out:vbrief-completed";
|
|
686
803
|
try {
|
|
687
|
-
const { transitionXBriefOnMain } = await import("./lifecycle-io-
|
|
804
|
+
const { transitionXBriefOnMain } = await import("./lifecycle-io-C5nVk55o.js");
|
|
688
805
|
const result = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, ctx.issueId, "completed", "completed", `scope: complete ${ctx.issueId.toUpperCase()} xBRIEF`));
|
|
689
806
|
const details = [result.moved ? "Updated xBRIEF lifecycle to completed" : "xBRIEF lifecycle already completed", result.statusUpdated ? "Updated plan.status to completed" : "plan.status already completed"];
|
|
690
807
|
if (result.committed) details.push("Committed xBRIEF completion on main");
|
|
@@ -696,171 +813,237 @@ async function completeXBriefStep(ctx) {
|
|
|
696
813
|
return stepFailed(step, `xBRIEF completion failed: ${message}`);
|
|
697
814
|
}
|
|
698
815
|
}
|
|
816
|
+
async function verifyRootConventionBranches(ctx, root, issueLower) {
|
|
817
|
+
const featureResult = await verifyConventionBranchMerged(ctx, root);
|
|
818
|
+
if (featureResult?.success) return featureResult;
|
|
819
|
+
const strikeResult = await verifyConventionBranchMerged(ctx, {
|
|
820
|
+
...root,
|
|
821
|
+
sourceBranch: `strike/${issueLower}`
|
|
822
|
+
});
|
|
823
|
+
if (strikeResult?.success && !strikeResult.skipped) return stepOk("close-out:verify-merged", [...strikeResult.details ?? [], `Superseded ${root.sourceBranch} residual: ${featureResult?.error ?? "Feature branch is absent; positive merge evidence is required"}`]);
|
|
824
|
+
return featureResult;
|
|
825
|
+
}
|
|
699
826
|
async function verifyBranchMergedImpl(ctx) {
|
|
700
827
|
const step = "close-out:verify-merged";
|
|
701
828
|
const issueLower = ctx.issueId.toLowerCase();
|
|
702
|
-
const
|
|
703
|
-
|
|
829
|
+
const defaultRoot = {
|
|
830
|
+
repoKey: issueLower,
|
|
831
|
+
dir: ctx.projectPath,
|
|
832
|
+
sourceBranch: `feature/${issueLower}`,
|
|
833
|
+
targetBranch: "main",
|
|
834
|
+
forge: "github"
|
|
835
|
+
};
|
|
704
836
|
try {
|
|
705
837
|
try {
|
|
706
|
-
const { loadReviewStatuses } = await import("./review-status-
|
|
838
|
+
const { loadReviewStatuses } = await import("./review-status-B6wYcOtP.js");
|
|
707
839
|
if (loadReviewStatuses()[ctx.issueId.toUpperCase()]?.mergeStatus === "merged") return stepOk(step, ["Merge specialist confirmed merge completed"]);
|
|
708
840
|
} catch {}
|
|
709
|
-
const
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
841
|
+
const resolvedRoots = resolveProjectReposForIssueSync(ctx.issueId)?.filter((repo) => repo.required).map((repo) => ({
|
|
842
|
+
repoKey: repo.repoKey,
|
|
843
|
+
dir: repo.repoPath,
|
|
844
|
+
sourceBranch: repo.sourceBranch,
|
|
845
|
+
targetBranch: repo.targetBranch,
|
|
846
|
+
forge: repo.forge
|
|
847
|
+
}));
|
|
848
|
+
const roots = resolvedRoots?.length ? resolvedRoots : [defaultRoot];
|
|
849
|
+
if (roots.length === 1) return await verifyRootConventionBranches(ctx, roots[0], issueLower) ?? stepFailed(step, "Feature branch is absent; positive merge evidence is required");
|
|
850
|
+
const results = await Promise.all(roots.map(async (root) => ({
|
|
851
|
+
root,
|
|
852
|
+
result: await verifyRootConventionBranches(ctx, root, issueLower)
|
|
853
|
+
})));
|
|
854
|
+
const failures = results.filter(({ result }) => result && !result.success);
|
|
855
|
+
if (failures.length > 0) return stepFailed(step, failures.map(({ root, result }) => `${root.repoKey}: ${result?.error}`).join("; "));
|
|
856
|
+
const successes = results.filter(({ result }) => result?.success);
|
|
857
|
+
if (successes.length > 0) return stepOk(step, successes.flatMap(({ root, result }) => (result?.details ?? []).map((detail) => `${root.repoKey}: ${detail}`)));
|
|
714
858
|
return stepFailed(step, BRANCH_ABSENT_MERGE_ERROR);
|
|
715
859
|
} catch (err) {
|
|
716
860
|
return stepFailed(step, `Could not verify merge: ${err.message}`);
|
|
717
861
|
}
|
|
718
862
|
}
|
|
719
|
-
async function verifyConventionBranchMerged(ctx,
|
|
863
|
+
async function verifyConventionBranchMerged(ctx, root) {
|
|
720
864
|
const step = "close-out:verify-merged";
|
|
721
|
-
const
|
|
722
|
-
|
|
865
|
+
const gitlabLookup = { attempted: false };
|
|
866
|
+
const { stdout: branchExists } = await execAsync(`git branch --list "${root.sourceBranch}" 2>/dev/null || true`, {
|
|
867
|
+
cwd: root.dir,
|
|
723
868
|
encoding: "utf-8"
|
|
724
869
|
});
|
|
725
870
|
if (branchExists.trim()) try {
|
|
726
|
-
await execAsync(`git merge-base --is-ancestor ${
|
|
727
|
-
cwd:
|
|
871
|
+
await execAsync(`git merge-base --is-ancestor ${root.sourceBranch} ${root.targetBranch}`, {
|
|
872
|
+
cwd: root.dir,
|
|
728
873
|
encoding: "utf-8"
|
|
729
874
|
});
|
|
730
|
-
const remoteCheck = await verifyRemoteBranchIfPresent(ctx,
|
|
875
|
+
const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
|
|
731
876
|
if (remoteCheck && !remoteCheck.success) return remoteCheck;
|
|
732
877
|
return stepOk(step, ["All commits merged to main", ...remoteCheck?.details ?? []]);
|
|
733
878
|
} catch {
|
|
879
|
+
const gitlabMerged = await verifySquashMergedMrByBranch(root, root.sourceBranch, gitlabLookup);
|
|
880
|
+
if (gitlabMerged) {
|
|
881
|
+
const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
|
|
882
|
+
if (remoteCheck && !remoteCheck.success) return remoteCheck;
|
|
883
|
+
return stepOk(step, [...gitlabMerged.result.details ?? [], ...remoteCheck?.details ?? []]);
|
|
884
|
+
}
|
|
734
885
|
try {
|
|
735
|
-
const { stdout: codeDiff } = await execAsync(`git diff
|
|
736
|
-
cwd:
|
|
886
|
+
const { stdout: codeDiff } = await execAsync(`git diff ${root.targetBranch}...${root.sourceBranch} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
|
|
887
|
+
cwd: root.dir,
|
|
737
888
|
encoding: "utf-8"
|
|
738
889
|
});
|
|
739
890
|
if (!codeDiff.trim()) {
|
|
740
|
-
const remoteCheck = await verifyRemoteBranchIfPresent(ctx,
|
|
891
|
+
const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
|
|
741
892
|
if (remoteCheck && !remoteCheck.success) return remoteCheck;
|
|
742
893
|
return stepOk(step, ["Code changes squash-merged to main (only planning artifacts remain on branch)", ...remoteCheck?.details ?? []]);
|
|
743
894
|
}
|
|
744
895
|
} catch {}
|
|
745
|
-
const githubMerged = await verifySquashMergedPrByBranch(ctx,
|
|
896
|
+
const githubMerged = root.forge === "github" ? await verifySquashMergedPrByBranch(ctx, root, root.sourceBranch) : null;
|
|
746
897
|
if (githubMerged?.success) {
|
|
747
|
-
const remoteCheck = await verifyRemoteBranchIfPresent(ctx,
|
|
898
|
+
const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
|
|
748
899
|
if (remoteCheck && !remoteCheck.success) return remoteCheck;
|
|
749
900
|
return stepOk(step, [...githubMerged.details ?? [], ...remoteCheck?.details ?? []]);
|
|
750
901
|
}
|
|
751
902
|
if (githubMerged) return githubMerged;
|
|
752
|
-
const { stdout: unmerged } = await execAsync(`git log
|
|
753
|
-
cwd:
|
|
903
|
+
const { stdout: unmerged } = await execAsync(`git log ${root.targetBranch}..${root.sourceBranch} --oneline 2>/dev/null || true`, {
|
|
904
|
+
cwd: root.dir,
|
|
754
905
|
encoding: "utf-8"
|
|
755
906
|
});
|
|
756
907
|
const count = unmerged.trim() ? unmerged.trim().split("\n").length : 0;
|
|
757
|
-
if (ctx.github) try {
|
|
908
|
+
if (ctx.github && root.forge === "github") try {
|
|
758
909
|
const { stdout: issueState } = await execAsync(`gh issue view ${ctx.github.number} --repo ${ctx.github.owner}/${ctx.github.repo} --json state --jq '.state'`, {
|
|
759
|
-
cwd:
|
|
910
|
+
cwd: root.dir,
|
|
760
911
|
encoding: "utf-8"
|
|
761
912
|
});
|
|
762
|
-
if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on ${
|
|
913
|
+
if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on ${root.sourceBranch}`]);
|
|
763
914
|
} catch {}
|
|
764
|
-
return stepFailed(step, `${count} unmerged commit(s) on ${
|
|
915
|
+
return stepFailed(step, `${count} unmerged commit(s) on ${root.sourceBranch}. Merge before closing out.`);
|
|
765
916
|
}
|
|
766
|
-
const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${
|
|
767
|
-
cwd:
|
|
917
|
+
const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${root.sourceBranch}" 2>/dev/null || true`, {
|
|
918
|
+
cwd: root.dir,
|
|
768
919
|
encoding: "utf-8"
|
|
769
920
|
});
|
|
770
921
|
if (remoteBranch.trim()) {
|
|
771
|
-
await execAsync(`git fetch origin ${
|
|
772
|
-
const remoteCheck = await verifyRemoteBranchIfPresent(ctx,
|
|
922
|
+
await execAsync(`git fetch origin ${root.sourceBranch}`, { cwd: root.dir }).catch(() => {});
|
|
923
|
+
const remoteCheck = await verifyRemoteBranchIfPresent(ctx, root, gitlabLookup);
|
|
773
924
|
if (remoteCheck) return remoteCheck;
|
|
774
925
|
}
|
|
775
926
|
return null;
|
|
776
927
|
}
|
|
777
|
-
async function
|
|
928
|
+
async function verifySquashMergedMrByBranch(root, branchRef, lookup) {
|
|
929
|
+
if (root.forge !== "gitlab") return null;
|
|
930
|
+
try {
|
|
931
|
+
const { stdout } = await execAsync(`git rev-parse ${branchRef} 2>/dev/null`, {
|
|
932
|
+
cwd: root.dir,
|
|
933
|
+
encoding: "utf-8"
|
|
934
|
+
});
|
|
935
|
+
const headSha = stdout.trim();
|
|
936
|
+
if (!headSha) return null;
|
|
937
|
+
const reused = lookup.attempted;
|
|
938
|
+
if (!reused) {
|
|
939
|
+
lookup.attempted = true;
|
|
940
|
+
lookup.headSha = headSha;
|
|
941
|
+
lookup.artifact = await getForgeAdapter("gitlab").findMergedArtifact({
|
|
942
|
+
sourceBranch: root.sourceBranch,
|
|
943
|
+
targetBranch: root.targetBranch,
|
|
944
|
+
headSha,
|
|
945
|
+
cwd: root.dir
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
if (!lookup.artifact || lookup.headSha !== headSha) return null;
|
|
949
|
+
return {
|
|
950
|
+
result: stepOk("close-out:verify-merged", [`${lookup.artifact.id ? `MR !${lookup.artifact.id}` : "GitLab MR"} is merged and ${branchRef} matches the merged MR head${lookup.artifact.url ? ` (${lookup.artifact.url})` : ""}`]),
|
|
951
|
+
reused
|
|
952
|
+
};
|
|
953
|
+
} catch {
|
|
954
|
+
return null;
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
async function verifyRemoteBranchIfPresent(ctx, root, gitlabLookup) {
|
|
778
958
|
const step = "close-out:verify-merged";
|
|
779
|
-
const remoteRef = `origin/${
|
|
780
|
-
const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${
|
|
781
|
-
cwd:
|
|
959
|
+
const remoteRef = `origin/${root.sourceBranch}`;
|
|
960
|
+
const { stdout: remoteBranch } = await execAsync(`git ls-remote --heads origin "${root.sourceBranch}" 2>/dev/null || true`, {
|
|
961
|
+
cwd: root.dir,
|
|
782
962
|
encoding: "utf-8"
|
|
783
963
|
});
|
|
784
964
|
if (!remoteBranch.trim()) return null;
|
|
785
|
-
await execAsync(`git fetch origin ${
|
|
965
|
+
await execAsync(`git fetch origin ${root.sourceBranch}`, { cwd: root.dir }).catch(() => {});
|
|
786
966
|
try {
|
|
787
|
-
await execAsync(`git merge-base --is-ancestor ${remoteRef}
|
|
788
|
-
cwd:
|
|
967
|
+
await execAsync(`git merge-base --is-ancestor ${remoteRef} ${root.targetBranch}`, {
|
|
968
|
+
cwd: root.dir,
|
|
789
969
|
encoding: "utf-8"
|
|
790
970
|
});
|
|
791
971
|
return stepOk(step, ["Remote branch fully merged"]);
|
|
792
972
|
} catch {
|
|
793
973
|
try {
|
|
794
|
-
const { stdout: codeDiff } = await execAsync(`git diff
|
|
795
|
-
cwd:
|
|
974
|
+
const { stdout: codeDiff } = await execAsync(`git diff ${root.targetBranch}...${remoteRef} -- ':!.planning' ':!docs/prds' ':!.overdeck/prompts' 2>/dev/null || true`, {
|
|
975
|
+
cwd: root.dir,
|
|
796
976
|
encoding: "utf-8"
|
|
797
977
|
});
|
|
798
978
|
if (!codeDiff.trim()) return stepOk(step, ["Remote code changes squash-merged to main (only planning artifacts remain on branch)"]);
|
|
799
979
|
} catch {}
|
|
800
|
-
const
|
|
980
|
+
const gitlabMerged = await verifySquashMergedMrByBranch(root, remoteRef, gitlabLookup);
|
|
981
|
+
if (gitlabMerged) return gitlabMerged.reused ? stepOk(step, [`Remote ${remoteRef} matches the merged MR head`]) : gitlabMerged.result;
|
|
982
|
+
const githubMerged = root.forge === "github" ? await verifySquashMergedPrByBranch(ctx, root, remoteRef) : null;
|
|
801
983
|
if (githubMerged) return githubMerged;
|
|
802
|
-
const { stdout: remoteUnmerged } = await execAsync(`git log
|
|
803
|
-
cwd:
|
|
984
|
+
const { stdout: remoteUnmerged } = await execAsync(`git log ${root.targetBranch}..${remoteRef} --oneline 2>/dev/null || true`, {
|
|
985
|
+
cwd: root.dir,
|
|
804
986
|
encoding: "utf-8"
|
|
805
987
|
});
|
|
806
988
|
const count = remoteUnmerged.trim() ? remoteUnmerged.trim().split("\n").length : 0;
|
|
807
|
-
if (ctx.github) try {
|
|
989
|
+
if (ctx.github && root.forge === "github") try {
|
|
808
990
|
const { stdout: issueState } = await execAsync(`gh issue view ${ctx.github.number} --repo ${ctx.github.owner}/${ctx.github.repo} --json state --jq '.state'`, {
|
|
809
|
-
cwd:
|
|
991
|
+
cwd: root.dir,
|
|
810
992
|
encoding: "utf-8"
|
|
811
993
|
});
|
|
812
|
-
if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on remote ${
|
|
994
|
+
if (issueState.trim().toUpperCase() === "CLOSED") return stepSkipped(step, [`Issue already closed on GitHub; ${count} unmerged commit(s) remain on remote ${root.sourceBranch}`]);
|
|
813
995
|
} catch {}
|
|
814
|
-
return stepFailed(step, `${count} unmerged commit(s) on remote ${
|
|
996
|
+
return stepFailed(step, `${count} unmerged commit(s) on remote ${root.sourceBranch}.`);
|
|
815
997
|
}
|
|
816
998
|
}
|
|
817
|
-
async function verifySquashMergedPrByBranch(ctx,
|
|
999
|
+
async function verifySquashMergedPrByBranch(ctx, root, branchRef) {
|
|
818
1000
|
if (!ctx.github) return null;
|
|
819
1001
|
const step = "close-out:verify-merged";
|
|
820
1002
|
const { owner, repo } = ctx.github;
|
|
1003
|
+
const remoteTargetRef = `origin/${root.targetBranch}`;
|
|
821
1004
|
try {
|
|
822
|
-
const { stdout: prJson } = await execAsync(`gh pr list --repo ${owner}/${repo} --state merged --head ${JSON.stringify(
|
|
823
|
-
cwd:
|
|
1005
|
+
const { stdout: prJson } = await execAsync(`gh pr list --repo ${owner}/${repo} --state merged --head ${JSON.stringify(root.sourceBranch)} --json number,mergedAt,headRefOid,url`, {
|
|
1006
|
+
cwd: root.dir,
|
|
824
1007
|
encoding: "utf-8"
|
|
825
1008
|
});
|
|
826
1009
|
const mergedPr = JSON.parse(prJson).filter((pr) => typeof pr.mergedAt === "string" && pr.mergedAt.length > 0 && typeof pr.headRefOid === "string" && pr.headRefOid.length > 0).sort((a, b) => Date.parse(String(b.mergedAt)) - Date.parse(String(a.mergedAt)))[0];
|
|
827
1010
|
if (!mergedPr?.headRefOid) return null;
|
|
828
1011
|
const { stdout: tipShaRaw } = await execAsync(`git rev-parse ${branchRef} 2>/dev/null`, {
|
|
829
|
-
cwd:
|
|
1012
|
+
cwd: root.dir,
|
|
830
1013
|
encoding: "utf-8"
|
|
831
1014
|
});
|
|
832
1015
|
const tipSha = tipShaRaw.trim();
|
|
833
1016
|
if (!tipSha) return null;
|
|
834
1017
|
if (tipSha === mergedPr.headRefOid) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged and ${branchRef} matches the merged PR head`]);
|
|
835
|
-
let
|
|
1018
|
+
let commitsNotOnTarget = null;
|
|
836
1019
|
try {
|
|
837
1020
|
const { stdout: commitsRaw } = await execAsync(`git log --no-merges --format=%H ${mergedPr.headRefOid}..${tipSha}`, {
|
|
838
|
-
cwd:
|
|
1021
|
+
cwd: root.dir,
|
|
839
1022
|
encoding: "utf-8"
|
|
840
1023
|
});
|
|
841
1024
|
const commits = commitsRaw.split("\n").map((sha) => sha.trim()).filter(Boolean);
|
|
842
1025
|
const unmerged = [];
|
|
843
1026
|
for (const commit of commits) try {
|
|
844
|
-
await execAsync(`git merge-base --is-ancestor ${commit}
|
|
845
|
-
cwd:
|
|
1027
|
+
await execAsync(`git merge-base --is-ancestor ${commit} ${remoteTargetRef}`, {
|
|
1028
|
+
cwd: root.dir,
|
|
846
1029
|
encoding: "utf-8"
|
|
847
1030
|
});
|
|
848
1031
|
} catch {
|
|
849
1032
|
unmerged.push(commit);
|
|
850
1033
|
}
|
|
851
|
-
if (unmerged.length === 0) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; all ${commits.length} post-PR non-merge commit(s) on ${branchRef} are already on
|
|
852
|
-
|
|
1034
|
+
if (unmerged.length === 0) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; all ${commits.length} post-PR non-merge commit(s) on ${branchRef} are already on ${remoteTargetRef}`]);
|
|
1035
|
+
commitsNotOnTarget = unmerged;
|
|
853
1036
|
} catch {}
|
|
854
1037
|
try {
|
|
855
1038
|
const { stdout: deltaRaw } = await execAsync(`git diff --name-only ${mergedPr.headRefOid}..${tipSha}`, {
|
|
856
|
-
cwd:
|
|
1039
|
+
cwd: root.dir,
|
|
857
1040
|
encoding: "utf-8"
|
|
858
1041
|
});
|
|
859
1042
|
let deltaFiles = deltaRaw.split("\n").map((f) => f.trim()).filter(Boolean);
|
|
860
1043
|
let statePlaneOnly = deltaFiles.length > 0 && deltaFiles.every((f) => f.startsWith(".pan/"));
|
|
861
1044
|
if (!statePlaneOnly) {
|
|
862
|
-
const { stdout: uniqueRaw } = await execAsync(`git diff --name-only
|
|
863
|
-
cwd:
|
|
1045
|
+
const { stdout: uniqueRaw } = await execAsync(`git diff --name-only ${remoteTargetRef}...${tipSha}`, {
|
|
1046
|
+
cwd: root.dir,
|
|
864
1047
|
encoding: "utf-8"
|
|
865
1048
|
});
|
|
866
1049
|
deltaFiles = uniqueRaw.split("\n").map((f) => f.trim()).filter(Boolean);
|
|
@@ -869,7 +1052,7 @@ async function verifySquashMergedPrByBranch(ctx, branchName, branchRef) {
|
|
|
869
1052
|
if (statePlaneOnly) return stepOk(step, [`${typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "GitHub PR"} is squash-merged; ${branchRef} is ahead only by state-plane commits (${deltaFiles.length} file(s): .pan) — accepted per state-plane policy`]);
|
|
870
1053
|
} catch {}
|
|
871
1054
|
const prLabel = typeof mergedPr.number === "number" ? `PR #${mergedPr.number}` : "merged GitHub PR";
|
|
872
|
-
if (
|
|
1055
|
+
if (commitsNotOnTarget) return stepFailed(step, `${branchRef} has ${commitsNotOnTarget.length} commit(s) after merged ${prLabel} that are not on ${remoteTargetRef}: ${commitsNotOnTarget.join(", ")}`);
|
|
873
1056
|
return stepFailed(step, `${branchRef} does not match the head commit of merged ${prLabel}; inspect before closing out.`);
|
|
874
1057
|
} catch {
|
|
875
1058
|
return null;
|
|
@@ -936,7 +1119,7 @@ async function resetIssueToTodoImpl(ctx) {
|
|
|
936
1119
|
*/
|
|
937
1120
|
async function resetPostMergeStateForIssue(issueId) {
|
|
938
1121
|
try {
|
|
939
|
-
const { resetPostMergeState } = await import("./merge-agent-
|
|
1122
|
+
const { resetPostMergeState } = await import("./merge-agent-DWd0KfiS.js");
|
|
940
1123
|
resetPostMergeState(issueId);
|
|
941
1124
|
resetPostMergeState(issueId.toUpperCase());
|
|
942
1125
|
} catch {
|
|
@@ -952,7 +1135,7 @@ function clearReviewStatusStep(issueId) {
|
|
|
952
1135
|
async function clearReviewStatusStepImpl(issueId) {
|
|
953
1136
|
const step = "clear-review-status";
|
|
954
1137
|
try {
|
|
955
|
-
const { clearReviewStatus } = await import("./review-status-
|
|
1138
|
+
const { clearReviewStatus } = await import("./review-status-B6wYcOtP.js");
|
|
956
1139
|
clearReviewStatus(issueId.toUpperCase());
|
|
957
1140
|
return stepOk(step, ["Review status cleared"]);
|
|
958
1141
|
} catch {
|
|
@@ -1017,6 +1200,6 @@ async function resetIssueToCanceledImpl(ctx) {
|
|
|
1017
1200
|
}
|
|
1018
1201
|
}
|
|
1019
1202
|
//#endregion
|
|
1020
|
-
export { deepWipe as a, closeOut as i, cancelIssueWorkflow as n, resetToTodo as o, close as r, verifyBranchMergedImpl as s, approve as t };
|
|
1203
|
+
export { deepWipe as a, verifyConventionBranchMerged as c, closeOut as i, cancelIssueWorkflow as n, resetToTodo as o, close as r, verifyBranchMergedImpl as s, approve as t };
|
|
1021
1204
|
|
|
1022
|
-
//# sourceMappingURL=workflows-
|
|
1205
|
+
//# sourceMappingURL=workflows-BMBwLYPV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
3
|
-
import { i as init_settings, t as areMemoryObservationsEnabled } from "./settings-
|
|
2
|
+
import { Ar as FsError, Vr as init_errors } from "./config-yaml-BSCqwmX0.js";
|
|
3
|
+
import { i as init_settings, t as areMemoryObservationsEnabled } from "./settings-E3FnEIUx.js";
|
|
4
4
|
import { Effect } from "effect";
|
|
5
5
|
import { existsSync } from "fs";
|
|
6
6
|
import { join } from "path";
|
|
@@ -238,4 +238,4 @@ var init_workspace = __esmMin((() => {
|
|
|
238
238
|
//#endregion
|
|
239
239
|
export { readCavemanVariant as a, injectMemoryHookSettings as i, init_workspace as n, injectCavemanSettings as r, determineCavemanVariant as t };
|
|
240
240
|
|
|
241
|
-
//# sourceMappingURL=workspace-
|
|
241
|
+
//# sourceMappingURL=workspace-BgflNCH0.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { i as injectMemoryHookSettings, n as init_workspace, r as injectCavemanSettings, t as determineCavemanVariant } from "./workspace-
|
|
1
|
+
import { i as injectMemoryHookSettings, n as init_workspace, r as injectCavemanSettings, t as determineCavemanVariant } from "./workspace-BgflNCH0.js";
|
|
2
2
|
init_workspace();
|
|
3
3
|
export { determineCavemanVariant, injectCavemanSettings, injectMemoryHookSettings };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-
|
|
1
|
+
import { n as init_workspace_anchor_drift, t as evaluateWorkspaceAnchorDrift } from "./workspace-anchor-drift-CMiNncwq.js";
|
|
2
2
|
init_workspace_anchor_drift();
|
|
3
3
|
export { evaluateWorkspaceAnchorDrift };
|