@overdeck/desktop 0.45.21 → 0.45.22
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-CJIFA8Vg.js → acceptance-criteria-BH7ac_1G.js} +2 -2
- package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-cSvXNZLZ.js} +6 -6
- package/server/{agent-gc-D6PUckBB.js → agent-gc-Dj2gncak.js} +4 -4
- package/server/{agent-state-BV_6RHnO.js → agent-state-Co5Sy2Fw.js} +1 -1
- package/server/{agent-state-service-DHwemt96.js → agent-state-service-CsQ07Pxe.js} +1 -1
- package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-DistflNn.js} +5 -5
- package/server/{agents-DbrHWunF.js → agents-DXdHmRTC.js} +4 -4
- package/server/{agents-Czz6R57Z.js → agents-DyHKlq1I.js} +1 -1
- package/server/{archive-planning-BOnwJq8M.js → archive-planning-BvDuWNMo.js} +5 -5
- package/server/{archive-planning-MPpvQJL4.js → archive-planning-Cp_DC1j-.js} +1 -1
- package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-CDBFL4OU.js} +2 -2
- package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-DmA1IbYf.js} +3 -3
- package/server/{behavior-Dg-D8eBG.js → behavior-CGj16clS.js} +2 -2
- package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-C12WgkaB.js} +2 -2
- package/server/{build-info-Cv6CI7Gu.js → build-info-BRpqQvNd.js} +1 -1
- package/server/{build-info-27NlbKhV.js → build-info-NU3KbXYw.js} +3 -3
- package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-CTPjAmtH.js} +2 -2
- package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-rOgT98WY.js} +1 -1
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-DwZqT2qQ.js → checkpoints-B5jFNi2G.js} +1 -1
- package/server/{checkpoints-Vh-J15ge.js → checkpoints-BJum14fs.js} +2 -2
- package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-BhwWK-TQ.js} +1 -1
- package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-D7p5WcKZ.js} +2 -2
- package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-nSFKH78M.js} +2 -2
- package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-BI_UIke0.js} +2 -2
- package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-DHBwjS1X.js} +1 -1
- package/server/cli-BRORS9qY.js +3 -0
- package/server/{cli-mvpEOb3w.js → cli-CbKNkFE5.js} +9 -9
- package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Brf_5MuG.js} +2 -2
- package/server/{cliproxy-7g1nObvB.js → cliproxy-bONZDBbC.js} +1 -1
- package/server/{close-issue-8F6uawYj.js → close-issue-CxReRxIc.js} +5 -5
- package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-CQ3kqha7.js} +9 -9
- package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-DXP2Xyv3.js} +1 -1
- package/server/{codex-D_UBEOwL.js → codex-CbmztVcc.js} +9 -6
- package/server/{codex-BBeZ8c3s.js → codex-DNyiQDKW.js} +1 -1
- package/server/{codex-parser-BTzlOZiV.js → codex-parser-jl8AeAmB.js} +2 -2
- package/server/{config-nAB_F-Gp.js → config-BJKocXKd.js} +1 -1
- package/server/{config-G1TOMJZA.js → config-DeTsoZdR.js} +2 -2
- package/server/{config-CrduXs4a.js → config-q4Gvd8dq.js} +2 -2
- package/server/{config-yaml-Ciyp2mYe.js → config-yaml-ig8Nwtiw.js} +124 -27
- package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CFqPVxEg.js} +3 -3
- package/server/{conflict-gate-BKalpcjL.js → conflict-gate-CHU9K1vU.js} +1 -1
- package/server/{context-layers-Cg9ZgVfx.js → context-layers-15gDOk20.js} +3 -3
- package/server/{context-layers-YNpf6Q_I.js → context-layers-DlQKkHH2.js} +2 -2
- package/server/{control-settings-D_79A6gp.js → control-settings-D_odMIaC.js} +4 -4
- package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-B6YSRLda.js} +8 -8
- package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-CN4-5YYt.js} +1 -1
- package/server/{conversation-service-DQybSPUK.js → conversation-service-C3avRVEr.js} +6 -6
- package/server/{conversation-service-CWk8mEym.js → conversation-service-Dq33SYEj.js} +1 -1
- package/server/{conversations-BJ-t3BRm.js → conversations-H9if0bCQ.js} +1 -1
- package/server/{conversations-BUgGvqVL.js → conversations-bYpM9-kZ.js} +4 -4
- package/server/{cost-Drm7qeD5.js → cost-Codk1pc2.js} +2 -2
- package/server/{cost-sync-DzHP6zaR.js → cost-sync-D_cre6WM.js} +3 -3
- package/server/{cost-jJ2cgDcG.js → cost-wH46-WsJ.js} +3 -3
- package/server/{dag-DIji6O2b.js → dag-CJpgf9A3.js} +2 -2
- package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-D6AF-Hg_.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-pleYrvIm.js → deacon-B8HbQdqU.js} +3 -3
- package/server/{deacon-1s7bM5zn.js → deacon-CkT_kznS.js} +1377 -407
- package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-D6K9K-rE.js} +3 -3
- package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-BryRr6AO.js} +13 -13
- package/server/deacon-swarm-CV54eNmU.js +2 -0
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-1IrZxicY.js} +6 -6
- package/server/{deploy-window-ClLq1RYf.js → deploy-window-7ZYHh7Zp.js} +1 -1
- package/server/{deploy-window-jw4S_Y-c.js → deploy-window-wDf4UgHt.js} +6 -6
- package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-C7p9kEpc.js} +2 -2
- package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CNmQy0pL.js} +3 -3
- package/server/{dist-yfR7G1BL.js → dist-D-Ed5yVw.js} +1 -1
- package/server/dist-j64RzSrQ.js +3 -0
- package/server/{docker-ClwPQaba.js → docker-BCZ89M9X.js} +2 -2
- package/server/{dod-BLphkhjs.js → dod-DbJLYcHv.js} +1 -1
- package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-Cs6W9Yzj.js} +1 -1
- package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-V5JWaAva.js} +4 -4
- package/server/{esm-shims-BZw-fTQ6.js → esm-shims-dTeNdq7X.js} +1 -1
- package/server/{event-store-DABarGNz.js → event-store-CpBGsO6_.js} +1 -1
- package/server/{event-store-BVnON3vf.js → event-store-TnWdydfB.js} +3 -3
- package/server/{events-CmERlnwn.js → events-DSUdR-04.js} +3 -3
- package/server/{events-LGeUehYW.js → events-Dsuv6qyB.js} +1 -1
- package/server/{factory-CQNprtHe.js → factory-BMrK4TrE.js} +4 -4
- package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B-CI9hgE.js} +4 -4
- package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-B972ph_A.js} +2 -2
- package/server/{features--fOza5g5.js → features-Bc-Bmiye.js} +2 -2
- package/server/{feedback-target-Dn9vfPpz.js → feedback-target-DS6NUuSs.js} +1 -1
- package/server/{feedback-target-Dqik2WTe.js → feedback-target-DZ-iAnAa.js} +7 -7
- package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-BXP6g75N.js} +4 -4
- package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-Bx5z11mF.js} +1 -1
- package/server/{flywheel-DPUc8r3V.js → flywheel-6WHU4O7A.js} +14 -14
- package/server/{flywheel-1Wd8WDlh.js → flywheel-COR0mbRI.js} +12 -12
- package/server/{flywheel-Q-38YhZG.js → flywheel-Ctr5uuvo.js} +1 -1
- package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-CNKAY489.js} +1 -1
- package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-CTgHeg-W.js} +7 -7
- package/server/forge-B0_opi-V.js +2 -0
- package/server/{forge-DBbDpiYc.js → forge-B1S_KZv4.js} +2 -2
- package/server/{from-hh6vTBGl.js → from-DpwQ-sc3.js} +1 -1
- package/server/{fts-db-6ponMie2.js → fts-db-DmAcuCkV.js} +2 -2
- package/server/{fts-operations-KIRK165y.js → fts-operations-7d_RkmWp.js} +2 -2
- package/server/git-utils-Cc3FHDKd.js +198 -0
- package/server/{git-utils-DmF5xkj8.js → git-utils-CsKGnzFA.js} +1 -1
- package/server/{github-app-B3yfECo8.js → github-app-CDPtGF7J.js} +2 -2
- package/server/{github-app-CeSVFL6C.js → github-app-CU14oYzP.js} +1 -1
- package/server/{github-client-4A6FgA8O.js → github-client-CwBZZ3t7.js} +1 -1
- package/server/{github-client-Dslipypz.js → github-client-XjTJbBm7.js} +2 -2
- package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-CFGeVhqv.js} +2 -2
- package/server/harness-binary-B2CTcD84.js +106 -0
- package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-D5FVQTmy.js} +9 -15
- package/server/{health-events-CnwV_SSz.js → health-events-C1whmd58.js} +1 -1
- package/server/{health-events-CZGZ5I-A.js → health-events-DREeevle.js} +2 -2
- package/server/{hooks-DvX33gY_.js → hooks-B-HItBiS.js} +1 -1
- package/server/{hooks-CoNscX84.js → hooks-yxRsjk-z.js} +2 -2
- package/server/hume-BmhvfVbV.js +3 -0
- package/server/{hume-DSJt5eA_.js → hume-Dz_OymXE.js} +2 -2
- package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-DrCv0OAG.js} +1 -1
- package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-Yf34xXxY.js} +2 -2
- package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-BoWm66Kh.js} +2 -2
- package/server/{infra-DN2wSxle.js → infra-D4iNWMA5.js} +4 -4
- package/server/{injection-DK9zh_HL.js → injection-BVNa4MQW.js} +1 -1
- package/server/{injection-DtlT8Akv.js → injection-D7T75Pye.js} +7 -7
- package/server/{inspect-agent-DKByUS_F.js → inspect-agent-BXCgNeZ4.js} +13 -9
- package/server/inspect-agent-Dq0z1k3H.js +2 -0
- package/server/{internal-token-7bYL5v6K.js → internal-token-C9DdEOKY.js} +1 -1
- package/server/{internal-token-DhfFiwW7.js → internal-token-CXsfxslp.js} +2 -2
- package/server/{io-BiM-7Zsx.js → io-DQR9PMgS.js} +3 -3
- package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-DtmJM0D0.js} +7 -7
- package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-8PSS9Anq.js} +1 -1
- package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CeyW_HoD.js} +21 -21
- package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DBZabEl7.js} +1 -1
- package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-D_RVYBuL.js} +8 -8
- package/server/{issues-XYtFMxrH.js → issues-pDW9VUNz.js} +2 -2
- package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-C3HVNR5d.js} +3 -3
- package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-DPwiZlWo.js} +3 -3
- package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-Df1ZduPH.js} +4 -4
- package/server/{launcher-generator-5DJRiovn.js → launcher-generator-COgR2By1.js} +6 -6
- package/server/{layers-cZx7ibtV.js → layers-Cp1To4L8.js} +2 -2
- package/server/{lifecycle-CE7619Xw.js → lifecycle-CtPDcZ9u.js} +6 -6
- package/server/{lifecycle-io-CUpsxG0p.js → lifecycle-io-DmY2qwCn.js} +1 -1
- package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-taIb0PoH.js} +4 -4
- package/server/{linear-client-BLyN-NiP.js → linear-client-DsFkIxee.js} +2 -2
- package/server/{linear-client-Bj1l4FOA.js → linear-client-YwZMDIwQ.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-CwX2_AWm.js → merge-BwsyNRJV.js} +1 -1
- package/server/{merge-hSC2BENe.js → merge-C1t-bspg.js} +3 -3
- package/server/{merge-agent-CnORPiri.js → merge-agent-B-SnXOoc.js} +1 -1
- package/server/{merge-agent-DnBsms_V.js → merge-agent-DDiIjzk-.js} +369 -213
- package/server/{merge-batch-C2w2U2eK.js → merge-batch-Byt-QnEl.js} +1 -1
- package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BYjeXrVN.js} +2 -2
- package/server/merge-ops-DwWCkSgo.js +2 -0
- package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-Cm6fXaZN.js} +2 -2
- package/server/{merge-set-DHkzPCJU.js → merge-set-6LEglm6o.js} +1 -1
- package/server/{merge-set-D7YNU1ZB.js → merge-set-DiISXcC-.js} +3 -3
- package/server/{merge-sync-CpGA9Kg7.js → merge-sync-B95_4in_.js} +1 -1
- package/server/{merge-sync-De1FYva5.js → merge-sync-Do8_q32h.js} +2 -2
- package/server/{merge-train-SvkRJZ-k.js → merge-train-CKana8EH.js} +3 -3
- package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-BgmqwIfA.js} +4 -4
- package/server/{merge-verification-B3meGcXF.js → merge-verification-CqnUzGEK.js} +4 -4
- package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-tdOQDJ3o.js} +2 -2
- package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-BWOSZjWd.js} +1 -1
- package/server/node_modules/.package-lock.json +5 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
- package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
- package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-DSvsJ5M7.js} +1 -1
- package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-xklgvNA7.js} +19 -12
- package/server/package-lock.json +6 -6
- package/server/package.json +1 -1
- package/server/{pan-dir-Rw17YjT1.js → pan-dir-DOcf6ug3.js} +4 -4
- package/server/{paths-FP8v3lTz.js → paths-DooHpt9p.js} +2 -2
- package/server/{pickup-xi3KTLaJ.js → pickup-CaskQ7j6.js} +2 -2
- package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-1LGRjo-k.js} +11 -8
- package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-B6FVsYF9.js} +2 -2
- package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-CZsrU_nj.js} +1 -1
- package/server/{project-pipelines-B59NfN44.js → project-pipelines-CtNG_rvs.js} +2 -2
- package/server/projects-BKkwpH6q.js +3 -0
- package/server/{prompts-CbqaVjbe.js → prompts-EvhMeeHG.js} +2 -2
- package/server/{providers-d3pwXGVE.js → providers-BDDPULlp.js} +7 -7
- package/server/providers-DNSQqy2V.js +3 -0
- package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-sym_ufXe.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-CQJPBNBu.js} +1 -1
- package/server/public/assets/{dist-DQNg4CiF.js → dist-Bio7THQU.js} +1 -1
- package/server/public/assets/{dist-CLSlc6cV.js → dist-DukGS2YZ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-D4lWwte3.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-CaLboCt5.js} +1 -1
- package/server/public/assets/{index-C6NLz_1S.css → index-Bdc4V9ba.css} +1 -1
- package/server/public/assets/{index-SLYGA8AQ.js → index-Bwejq-5s.js} +147 -145
- package/server/public/assets/{linear-6Fi3qnGg.js → linear-qUWmMZ-c.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-C4zYulEm.js} +1 -1
- package/server/public/assets/{prod-ojHllFvN.js → prod-C8VtLuWC.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-qP04zyZC.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eMPTX_cG.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-Dme1PIt6.js} +1 -1
- package/server/public/index.html +54 -10
- package/server/{pull-requests-CjjPj7v6.js → pull-requests-8z2N1UOV.js} +3 -3
- package/server/{pull-requests-D3N6HQzI.js → pull-requests-By_BteaL.js} +1 -1
- package/server/{queries-B5hl7lMQ.js → queries-ZABd5aXP.js} +95 -71
- package/server/rally-OSJXdiHK.js +3 -0
- package/server/{rally-api-DGaFz5L5.js → rally-api-DqKqIMNR.js} +2 -2
- package/server/{rally-api-CKr0O4DJ.js → rally-api-xHazRk0d.js} +1 -1
- package/server/{rally-client-Cqf6EX_r.js → rally-client-CGWEHaPd.js} +1 -1
- package/server/{rally-client-SVbjGvqj.js → rally-client-COYz1vYR.js} +4 -4
- package/server/{rally-Dp0Gb1DN.js → rally-i_goYmiA.js} +3 -3
- package/server/reap-terminal-sessions-CaMkFOIH.js +4 -0
- package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-DG9eiMVz.js} +11 -28
- package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-CKjJAI8L.js} +1 -1
- package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-JUm0jqYP.js} +6 -6
- package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-wU79aCee.js} +6 -6
- package/server/record-rwK-nKv_.js +3 -0
- package/server/{record-update-RviRDSNs.js → record-update-Crz74r-6.js} +2 -2
- package/server/{record-update-BlB8mpKO.js → record-update-D3N6WMFR.js} +1 -1
- package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-DkzJSej9.js} +2 -2
- package/server/{release-engine-CSI4K6Oj.js → release-engine-DMINVN8S.js} +5 -5
- package/server/{release-set-BywwggrE.js → release-set-DeUSOEHy.js} +3 -3
- package/server/{remote-DYziAkiZ.js → remote-Dr5kGYSZ.js} +3 -3
- package/server/{remote-agents-CZ2rc8I0.js → remote-agents-Ct_WOyke.js} +6 -6
- package/server/{remote-agents-BNORDWAX.js → remote-agents-D6O_zETW.js} +1 -1
- package/server/{remote-cnoeuDWn.js → remote-b-c5bOce.js} +3 -3
- package/server/{remote-completion-W67FNQ-A.js → remote-completion-Dca3hAaa.js} +13 -13
- package/server/resume-wZZsWtzz.js +3 -0
- package/server/{review-agent-CSswH985.js → review-agent-CCum8sGe.js} +1 -1
- package/server/{review-agent-CqSqSHkU.js → review-agent-CThvgK2r.js} +23 -23
- package/server/{review-artifacts-BBgnd5df.js → review-artifacts-CXywD0F2.js} +5 -5
- package/server/{review-context-Ctp9BdNJ.js → review-context-OYfKUprb.js} +8 -8
- package/server/{review-status-DXeqFpk5.js → review-status-Bnh-rdkY.js} +1 -1
- package/server/{review-status-CCgPVK1h.js → review-status-DFRjDFef.js} +21 -37
- package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-crNAtIpL.js} +3 -3
- package/server/review-status-source-CxuEjLGg.js +39 -0
- package/server/{review-status-sync-C792ksoJ.js → review-status-sync-D60PJWNL.js} +1 -1
- package/server/{review-status-sync-jnLgd04F.js → review-status-sync-DpAMD_WO.js} +2 -2
- package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CpUZl5aE.js} +7 -7
- package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-JImjut0z.js} +1 -1
- package/server/{rollup-B3kQmNpl.js → rollup-CZ02qgxk.js} +1 -1
- package/server/{rollup-CLj_AK9f.js → rollup-SyuF09e4.js} +8 -8
- package/server/{scanner-C4NeC4FE.js → scanner-Br0Z5S6R.js} +7 -7
- package/server/{sequence-io-Ce-6grIY.js → sequence-io-fxU0DlwW.js} +4 -4
- package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-B5YC5XVP.js} +5 -5
- package/server/server.js +583 -387
- package/server/{service-CqAY8Kmk.js → service-Bagb90KZ.js} +150 -47
- package/server/{session-fork-uNo4rMRA.js → session-fork-BqQxd-V6.js} +2 -2
- package/server/{session-history-DUehL3KN.js → session-history-XdS0JKp3.js} +4 -4
- package/server/{settings-DP2OYLXL.js → settings-BNbocWOg.js} +3 -3
- package/server/settings-BlUsVaUc.js +2 -0
- package/server/{settings-D9grjmaP.js → settings-uLc6DEYI.js} +2 -2
- package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-D4X_s3fA.js} +3 -3
- package/server/{shadow-state-a_ztFBJe.js → shadow-state-C_NkP-sa.js} +2 -2
- package/server/{shadow-state-CDxEuPlE.js → shadow-state-CbvsN3qG.js} +1 -1
- package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-CYMRPeRT.js} +2 -2
- package/server/{ship-log-DDcueaIR.js → ship-log-__QtAFXG.js} +1 -1
- package/server/{smart-compaction--Oj65Uov.js → smart-compaction-CLZOWin1.js} +7 -7
- package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-jdMkG1vo.js} +1 -1
- package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-8D6mE033.js} +1 -1
- package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-D5OXo8pT.js} +19 -15
- package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-CqmduO92.js} +1 -1
- package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-CJ-QjFR-.js} +5 -5
- package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-Dnjlwt7g.js} +2 -2
- package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-CQnKzuZs.js} +3 -3
- package/server/{specialists-DAegTvRt.js → specialists-Bg9v4z3F.js} +122 -94
- package/server/{specialists-CYRwELzc.js → specialists-CwZHb5cb.js} +18 -18
- package/server/{specialists-D0VBf8g_.js → specialists-D0gGXMZx.js} +1 -1
- package/server/{specialists-C6WkeKFK.js → specialists-Dqe6_HE5.js} +1 -1
- package/server/specs-BhOKBzqk.js +3 -0
- package/server/{src-OLoJhUiJ.js → src-BMMoA_ba.js} +6 -6
- package/server/{src-BqTcrfO_.js → src-Bqdtd6po.js} +3 -3
- package/server/{src-Dpq1yFIl.js → src-k039WVYY.js} +337 -4
- package/server/{stack-health-I713ELld.js → stack-health-Bd06frFn.js} +1 -1
- package/server/{stack-health-DV_f-lK0.js → stack-health-C-ifC7b0.js} +2 -2
- package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-L7pJkQFL.js} +4 -4
- package/server/{staleness-BbsGxmF2.js → staleness-BID1BKdr.js} +1 -1
- package/server/{staleness-zGp4P1hd.js → staleness-_Tr-GwdA.js} +1 -1
- package/server/{state-home-DixkE-up.js → state-home-CONQvZR0.js} +36 -23
- package/server/state-migrate-BeBW0KXA.js +478 -0
- package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CKnIryGT.js} +20 -18
- package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-CsGD5Ksb.js} +1 -1
- package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-CpIZILj9.js} +3 -3
- package/server/{summary-fork-CdLn8Chr.js → summary-fork-agEMsPSo.js} +2 -2
- package/server/{summary-fork-f3DpgjXh.js → summary-fork-bX6ax6X7.js} +8 -8
- package/server/supervisor-COVHrBTg.js +2 -0
- package/server/{supervisor-Ch8CDuoF.js → supervisor-Ctt4eRYz.js} +3 -3
- package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-DdmJVX7y.js} +3 -3
- package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-DSXBvffY.js} +24 -44
- package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-DDCf5n-a.js} +15 -15
- package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-BJZ9Nfcc.js} +6 -6
- package/server/{test-verdict-BRiSu7eW.js → test-verdict-Cp5tljlJ.js} +1 -1
- package/server/{test-verdict-BQ1yx7d4.js → test-verdict-D_-sXIz_.js} +1 -1
- package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-B8_oT5gx.js} +1 -1
- package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BQFmmFp0.js} +2 -2
- package/server/{tmux-HQLgwo_C.js → tmux-BAvtac_u.js} +1 -1
- package/server/{tmux-y1blSxks.js → tmux-L5LgvGLp.js} +2 -2
- package/server/{token-LUrbM9sU.js → token-BkQLy4yS.js} +2 -2
- package/server/token-util-BArZLN6w.js +3 -0
- package/server/{token-util-BZaDAQ8S.js → token-util-DI8sGlmF.js} +1 -1
- package/server/{tracker-config-DSFZBdXP.js → tracker-config-DdT-nUAM.js} +2 -2
- package/server/{tracker-utils-DiceZN3a.js → tracker-utils-CawsPSS2.js} +2 -2
- package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-DV3h1FYG.js} +1 -1
- package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-C6mJckNs.js} +1 -1
- package/server/{tunnel-WcJImbAC.js → tunnel-BIFl98rc.js} +1 -1
- package/server/{tunnel-DTng1rfQ.js → tunnel-IdK1iTHx.js} +3 -3
- package/server/{types-BjaZ1oqH.js → types-7-GnJn0t.js} +1 -1
- package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
- package/server/{uat-train-Wismge7h.js → uat-train-0Ujk8GCv.js} +1 -1
- package/server/{uat-train-BpLnp7Cx.js → uat-train-j0cPeMSj.js} +25 -25
- package/server/{validation-BA4e5EGm.js → validation-CabEISJT.js} +4 -4
- package/server/{validation-CUWamZ4X.js → validation-DcAgXTQp.js} +1 -1
- package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BuTA1QbL.js} +1 -1
- package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-Ck1tefmz.js} +1 -1
- package/server/{verification-runner-Dcksl_P-.js → verification-runner-DlJezzef.js} +1 -1
- package/server/{verification-runner-gAzh3cVD.js → verification-runner-FiuAZ-H2.js} +15 -14
- package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-BnRsYzcz.js} +1 -1
- package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-DLthEPAq.js} +12 -11
- package/server/{workflows-B8ROFlfw.js → workflows-BZNNYkGC.js} +18 -18
- package/server/workflows-C4mR0Reb.js +2 -0
- package/server/{workspace-DSjUJaJN.js → workspace-3IC-UkAi.js} +1 -1
- package/server/{workspace-DhTDA8nB.js → workspace-D9ppycdg.js} +3 -3
- package/server/{workspace-config-BAAsAv-o.js → workspace-config-Bigl_-Lk.js} +1 -1
- package/server/{workspace-manager-CcujONCR.js → workspace-manager-B1WOfKvB.js} +1 -1
- package/server/{workspace-manager-DsN52IMG.js → workspace-manager-ClkCIWTe.js} +13 -13
- package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-BE0efUv_.js} +1 -1
- package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-tiSRIWJP.js} +2 -2
- package/server/{workspaces-Dmlh1YXm.js → workspaces-CFPcL0vl.js} +96 -96
- package/sync-sources/skills/pan-start/SKILL.md +23 -0
- package/server/cli-ChErG518.js +0 -3
- package/server/deacon-swarm-uudlSCLM.js +0 -2
- package/server/dist-BEDL2alY.js +0 -3
- package/server/forge-DbhJyH6u.js +0 -2
- package/server/git-utils-Bkxzr1Xf.js +0 -129
- package/server/hume-BrA1tUuk.js +0 -3
- package/server/inspect-agent-CyXNo9fM.js +0 -2
- package/server/merge-ops-BpTtuO8x.js +0 -2
- package/server/projects-IRHJIPYC.js +0 -3
- package/server/providers-BqCdTryq.js +0 -3
- package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
- package/server/rally-DGimSRBQ.js +0 -3
- package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
- package/server/record-us0YECMO.js +0 -3
- package/server/resume-OyN3dEXE.js +0 -3
- package/server/settings-BaPXXJsT.js +0 -2
- package/server/specs-BsNcum0h.js +0 -3
- package/server/state-migrate-_zJJ6XKE.js +0 -362
- package/server/supervisor-Qy1QecAs.js +0 -2
- package/server/token-util-Cg-QnowA.js +0 -3
- package/server/workflows-C5c-RPsY.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
2
|
+
import { Cn as projectKey, Hn as init_projects, Sn as init_project_key, dn as STATE_BRANCH_PATHS, er as resolveInfraRepo, ii as init_paths, mn as init_state_plane, ri as getOverdeckHome } from "./config-yaml-ig8Nwtiw.js";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { mkdir, rm } from "node:fs/promises";
|
|
@@ -14,13 +14,15 @@ import { promisify } from "node:util";
|
|
|
14
14
|
* An unmarked branch is an in-progress migration and continues using legacy
|
|
15
15
|
* project-root state paths.
|
|
16
16
|
*/
|
|
17
|
-
async function git(repoPath, args) {
|
|
17
|
+
async function git(repoPath, args, signal) {
|
|
18
|
+
signal?.throwIfAborted();
|
|
18
19
|
const { stdout } = await execFileAsync("git", args, {
|
|
19
20
|
cwd: repoPath,
|
|
20
21
|
encoding: "utf8",
|
|
21
22
|
maxBuffer: 16 * 1024 * 1024,
|
|
22
23
|
timeout: 15e3,
|
|
23
|
-
killSignal: "SIGTERM"
|
|
24
|
+
killSignal: "SIGTERM",
|
|
25
|
+
signal
|
|
24
26
|
});
|
|
25
27
|
return stdout.trim();
|
|
26
28
|
}
|
|
@@ -38,27 +40,28 @@ function parseMigrationCompleteMarker(value) {
|
|
|
38
40
|
if (!Number.isInteger(marker.version) || (marker.version ?? 0) < 1) return null;
|
|
39
41
|
return marker;
|
|
40
42
|
}
|
|
41
|
-
async function remoteStateTip(repoPath) {
|
|
43
|
+
async function remoteStateTip(repoPath, signal) {
|
|
42
44
|
const sha = (await git(repoPath, [
|
|
43
45
|
"ls-remote",
|
|
44
46
|
"--heads",
|
|
45
47
|
"origin",
|
|
46
48
|
`refs/heads/${STATE_BRANCH}`
|
|
47
|
-
])).split(/\s+/)[0];
|
|
49
|
+
], signal)).split(/\s+/)[0];
|
|
48
50
|
return isSha(sha) ? sha : null;
|
|
49
51
|
}
|
|
50
|
-
async function markerAtRemoteTip(repoPath, tip) {
|
|
52
|
+
async function markerAtRemoteTip(repoPath, tip, signal) {
|
|
51
53
|
await git(repoPath, [
|
|
52
54
|
"fetch",
|
|
53
55
|
"--quiet",
|
|
54
56
|
"origin",
|
|
55
57
|
`refs/heads/${STATE_BRANCH}:refs/remotes/origin/${STATE_BRANCH}`
|
|
56
|
-
]);
|
|
57
|
-
if (await git(repoPath, ["rev-parse", `refs/remotes/origin/overdeck-state`]) !== tip) return null;
|
|
58
|
+
], signal);
|
|
59
|
+
if (await git(repoPath, ["rev-parse", `refs/remotes/origin/overdeck-state`], signal) !== tip) return null;
|
|
58
60
|
let raw;
|
|
59
61
|
try {
|
|
60
|
-
raw = await git(repoPath, ["show", `${tip}:${MIGRATION_COMPLETE_MARKER}`]);
|
|
62
|
+
raw = await git(repoPath, ["show", `${tip}:${MIGRATION_COMPLETE_MARKER}`], signal);
|
|
61
63
|
} catch {
|
|
64
|
+
signal?.throwIfAborted();
|
|
62
65
|
return null;
|
|
63
66
|
}
|
|
64
67
|
let marker;
|
|
@@ -73,14 +76,18 @@ async function markerAtRemoteTip(repoPath, tip) {
|
|
|
73
76
|
"--is-ancestor",
|
|
74
77
|
marker.stateBranchSha,
|
|
75
78
|
tip
|
|
76
|
-
]).then(() => true).catch(() =>
|
|
79
|
+
], signal).then(() => true).catch(() => {
|
|
80
|
+
signal?.throwIfAborted();
|
|
81
|
+
return false;
|
|
82
|
+
}) ? marker : null;
|
|
77
83
|
}
|
|
78
|
-
async function inspectStateMigration(project) {
|
|
84
|
+
async function inspectStateMigration(project, options = {}) {
|
|
79
85
|
const { repoPath } = resolveInfraRepo(project);
|
|
80
86
|
let tip;
|
|
81
87
|
try {
|
|
82
|
-
tip = await remoteStateTip(repoPath);
|
|
88
|
+
tip = await remoteStateTip(repoPath, options.signal);
|
|
83
89
|
} catch {
|
|
90
|
+
options.signal?.throwIfAborted();
|
|
84
91
|
return {
|
|
85
92
|
migrated: false,
|
|
86
93
|
migrationInProgress: false,
|
|
@@ -93,7 +100,7 @@ async function inspectStateMigration(project) {
|
|
|
93
100
|
migrationInProgress: tip !== null && !cached.migrated,
|
|
94
101
|
remoteTip: tip
|
|
95
102
|
};
|
|
96
|
-
const migrated = tip !== null && await markerAtRemoteTip(repoPath, tip) !== null;
|
|
103
|
+
const migrated = tip !== null && await markerAtRemoteTip(repoPath, tip, options.signal) !== null;
|
|
97
104
|
migrationCache.set(repoPath, {
|
|
98
105
|
remoteTip: tip,
|
|
99
106
|
migrated
|
|
@@ -112,14 +119,18 @@ async function findRecreatedLegacyStatePaths(project) {
|
|
|
112
119
|
const legacyStateRoot = project.path;
|
|
113
120
|
return STATE_BRANCH_PATHS.map((statePath) => join(legacyStateRoot, ".pan", statePath.slice(0, -1))).filter(existsSync);
|
|
114
121
|
}
|
|
115
|
-
async function addStateWorktree(repoPath, path) {
|
|
122
|
+
async function addStateWorktree(repoPath, path, signal) {
|
|
123
|
+
signal?.throwIfAborted();
|
|
116
124
|
await mkdir(dirname(path), { recursive: true });
|
|
117
125
|
await git(repoPath, await git(repoPath, [
|
|
118
126
|
"show-ref",
|
|
119
127
|
"--verify",
|
|
120
128
|
"--quiet",
|
|
121
129
|
`refs/heads/overdeck-state`
|
|
122
|
-
]).then(() => true
|
|
130
|
+
], signal).then(() => true).catch(() => {
|
|
131
|
+
signal?.throwIfAborted();
|
|
132
|
+
return false;
|
|
133
|
+
}) ? [
|
|
123
134
|
"worktree",
|
|
124
135
|
"add",
|
|
125
136
|
path,
|
|
@@ -132,10 +143,10 @@ async function addStateWorktree(repoPath, path) {
|
|
|
132
143
|
STATE_BRANCH,
|
|
133
144
|
path,
|
|
134
145
|
`origin/${STATE_BRANCH}`
|
|
135
|
-
]);
|
|
146
|
+
], signal);
|
|
136
147
|
}
|
|
137
148
|
async function ensureStateWorktree(project, options = {}) {
|
|
138
|
-
const migration = await inspectStateMigration(project);
|
|
149
|
+
const migration = await inspectStateMigration(project, options);
|
|
139
150
|
const path = stateWorktreePath(project, options);
|
|
140
151
|
if (!migration.migrated) return {
|
|
141
152
|
status: "legacy",
|
|
@@ -143,7 +154,7 @@ async function ensureStateWorktree(project, options = {}) {
|
|
|
143
154
|
};
|
|
144
155
|
const { repoPath } = resolveInfraRepo(project);
|
|
145
156
|
if (!existsSync(path)) {
|
|
146
|
-
await addStateWorktree(repoPath, path);
|
|
157
|
+
await addStateWorktree(repoPath, path, options.signal);
|
|
147
158
|
return {
|
|
148
159
|
status: "created",
|
|
149
160
|
path
|
|
@@ -151,8 +162,9 @@ async function ensureStateWorktree(project, options = {}) {
|
|
|
151
162
|
}
|
|
152
163
|
let branch;
|
|
153
164
|
try {
|
|
154
|
-
branch = await git(path, ["branch", "--show-current"]);
|
|
165
|
+
branch = await git(path, ["branch", "--show-current"], options.signal);
|
|
155
166
|
} catch (error) {
|
|
167
|
+
options.signal?.throwIfAborted();
|
|
156
168
|
return {
|
|
157
169
|
status: "error",
|
|
158
170
|
path,
|
|
@@ -164,7 +176,7 @@ async function ensureStateWorktree(project, options = {}) {
|
|
|
164
176
|
path
|
|
165
177
|
};
|
|
166
178
|
try {
|
|
167
|
-
if (await git(path, ["status", "--porcelain"])) return {
|
|
179
|
+
if (await git(path, ["status", "--porcelain"], options.signal)) return {
|
|
168
180
|
status: "dirty",
|
|
169
181
|
path,
|
|
170
182
|
detail: "state worktree has uncommitted changes; refusing destructive repair"
|
|
@@ -173,17 +185,18 @@ async function ensureStateWorktree(project, options = {}) {
|
|
|
173
185
|
"worktree",
|
|
174
186
|
"remove",
|
|
175
187
|
path
|
|
176
|
-
]);
|
|
188
|
+
], options.signal);
|
|
177
189
|
await rm(path, {
|
|
178
190
|
recursive: true,
|
|
179
191
|
force: true
|
|
180
192
|
});
|
|
181
|
-
await addStateWorktree(repoPath, path);
|
|
193
|
+
await addStateWorktree(repoPath, path, options.signal);
|
|
182
194
|
return {
|
|
183
195
|
status: "recreated",
|
|
184
196
|
path
|
|
185
197
|
};
|
|
186
198
|
} catch (error) {
|
|
199
|
+
options.signal?.throwIfAborted();
|
|
187
200
|
return {
|
|
188
201
|
status: "error",
|
|
189
202
|
path,
|
|
@@ -208,4 +221,4 @@ var init_state_home = __esmMin((() => {
|
|
|
208
221
|
//#endregion
|
|
209
222
|
export { findRecreatedLegacyStatePaths as a, isStateMigrated as c, ensureStateWorktree as i, stateWorktreePath as l, STATE_BRANCH as n, init_state_home as o, clearStateMigrationCache as r, inspectStateMigration as s, MIGRATION_COMPLETE_MARKER as t };
|
|
210
223
|
|
|
211
|
-
//# sourceMappingURL=state-home-
|
|
224
|
+
//# sourceMappingURL=state-home-CONQvZR0.js.map
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import { Hn as init_projects, In as getProjectSync, _n as acquireStateMigrationLock, cn as init_auto_commit, dn as STATE_BRANCH_PATHS, er as resolveInfraRepo, mn as init_state_plane, sn as flushAutoCommits, vn as init_state_migration_lock } from "./config-yaml-ig8Nwtiw.js";
|
|
2
|
+
import { l as stateWorktreePath, n as STATE_BRANCH, o as init_state_home, r as clearStateMigrationCache, t as MIGRATION_COMPLETE_MARKER } from "./state-home-CONQvZR0.js";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { createReadStream, createWriteStream, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { chmod, lstat, mkdir, readdir, rename, rm, utimes } from "node:fs/promises";
|
|
8
|
+
import { execFile } from "node:child_process";
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { pipeline } from "node:stream/promises";
|
|
11
|
+
//#region ../../lib/state-migration-manifest.ts
|
|
12
|
+
init_projects();
|
|
13
|
+
init_state_migration_lock();
|
|
14
|
+
init_state_plane();
|
|
15
|
+
init_auto_commit();
|
|
16
|
+
init_state_home();
|
|
17
|
+
async function sha256(path, signal) {
|
|
18
|
+
const hash = createHash("sha256");
|
|
19
|
+
for await (const chunk of createReadStream(path, { signal })) {
|
|
20
|
+
signal?.throwIfAborted();
|
|
21
|
+
hash.update(chunk);
|
|
22
|
+
}
|
|
23
|
+
return hash.digest("hex");
|
|
24
|
+
}
|
|
25
|
+
async function manifestEntry(source, destination, signal) {
|
|
26
|
+
signal?.throwIfAborted();
|
|
27
|
+
const [stat, digest] = await Promise.all([lstat(source), sha256(source, signal)]);
|
|
28
|
+
signal?.throwIfAborted();
|
|
29
|
+
return {
|
|
30
|
+
source,
|
|
31
|
+
destination,
|
|
32
|
+
mode: stat.mode & 511,
|
|
33
|
+
size: stat.size,
|
|
34
|
+
sha256: digest
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function verifyStateMigrationManifest(entries) {
|
|
38
|
+
for (const expected of entries) {
|
|
39
|
+
const actual = await manifestEntry(expected.destination, expected.destination);
|
|
40
|
+
if ((actual.mode & 64) !== (expected.mode & 64) || actual.size !== expected.size || actual.sha256 !== expected.sha256) throw new Error(`State migration no-loss mismatch: ${expected.source} -> ${expected.destination}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region ../../cli/commands/admin/state-migrate.ts
|
|
45
|
+
const GIT_COMMAND_TIMEOUT_MS = 3e4;
|
|
46
|
+
const execFileDetached = execFile;
|
|
47
|
+
function killProcessTree(child) {
|
|
48
|
+
if (!child?.pid) return;
|
|
49
|
+
try {
|
|
50
|
+
if (process.platform === "win32") child.kill("SIGKILL");
|
|
51
|
+
else process.kill(-child.pid, "SIGKILL");
|
|
52
|
+
} catch {
|
|
53
|
+
try {
|
|
54
|
+
child.kill("SIGKILL");
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function git(cwd, args, signal, env) {
|
|
59
|
+
signal?.throwIfAborted();
|
|
60
|
+
const command = `git ${args.join(" ")}`;
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
let child;
|
|
63
|
+
let termination;
|
|
64
|
+
const terminate = (kind) => {
|
|
65
|
+
if (termination) return;
|
|
66
|
+
termination = kind;
|
|
67
|
+
killProcessTree(child);
|
|
68
|
+
};
|
|
69
|
+
const timeout = setTimeout(() => terminate("timeout"), GIT_COMMAND_TIMEOUT_MS);
|
|
70
|
+
const onAbort = () => terminate("abort");
|
|
71
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
72
|
+
child = execFileDetached("git", args, {
|
|
73
|
+
cwd,
|
|
74
|
+
env: {
|
|
75
|
+
...process.env,
|
|
76
|
+
...env
|
|
77
|
+
},
|
|
78
|
+
encoding: "utf8",
|
|
79
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
80
|
+
detached: process.platform !== "win32"
|
|
81
|
+
}, (error, stdout, stderr) => {
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
signal?.removeEventListener("abort", onAbort);
|
|
84
|
+
if (termination === "abort") reject(signal?.reason ?? new DOMException(`${command} was cancelled`, "AbortError"));
|
|
85
|
+
else if (termination === "timeout") reject(/* @__PURE__ */ new Error(`${command} timed out after ${GIT_COMMAND_TIMEOUT_MS / 1e3}s`));
|
|
86
|
+
else if (error) reject(Object.assign(error, {
|
|
87
|
+
stdout,
|
|
88
|
+
stderr
|
|
89
|
+
}));
|
|
90
|
+
else resolve(stdout.trim());
|
|
91
|
+
});
|
|
92
|
+
if (signal?.aborted) terminate("abort");
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function destinationForTracked(path) {
|
|
96
|
+
if (!path.startsWith(".pan/")) return null;
|
|
97
|
+
const flat = path.slice(5);
|
|
98
|
+
return STATE_BRANCH_PATHS.some((prefix) => flat.startsWith(prefix)) ? flat : null;
|
|
99
|
+
}
|
|
100
|
+
async function trackedManifest(repo, sourceSha, stateRoot, signal, copyFile = copyFileAbortable) {
|
|
101
|
+
const paths = (await git(repo, [
|
|
102
|
+
"ls-tree",
|
|
103
|
+
"-r",
|
|
104
|
+
"--name-only",
|
|
105
|
+
sourceSha,
|
|
106
|
+
"--",
|
|
107
|
+
".pan"
|
|
108
|
+
], signal)).split("\n").filter(Boolean);
|
|
109
|
+
const manifest = [];
|
|
110
|
+
for (const path of paths) {
|
|
111
|
+
signal?.throwIfAborted();
|
|
112
|
+
const destination = destinationForTracked(path);
|
|
113
|
+
if (!destination) continue;
|
|
114
|
+
const source = join(repo, path);
|
|
115
|
+
const target = join(stateRoot, destination);
|
|
116
|
+
if (!existsSync(target)) await copyFile(source, target, signal);
|
|
117
|
+
manifest.push(await manifestEntry(source, target, signal));
|
|
118
|
+
}
|
|
119
|
+
return manifest;
|
|
120
|
+
}
|
|
121
|
+
async function createOrphanStateCommit(repo, sourceSha, signal) {
|
|
122
|
+
const index = join(tmpdir(), `overdeck-state-index-${process.pid}-${Date.now()}`);
|
|
123
|
+
const env = { GIT_INDEX_FILE: index };
|
|
124
|
+
try {
|
|
125
|
+
await git(repo, ["read-tree", "--empty"], signal, env);
|
|
126
|
+
const rows = (await git(repo, [
|
|
127
|
+
"ls-tree",
|
|
128
|
+
"-r",
|
|
129
|
+
sourceSha,
|
|
130
|
+
"--",
|
|
131
|
+
".pan"
|
|
132
|
+
], signal)).split("\n").filter(Boolean);
|
|
133
|
+
for (const row of rows) {
|
|
134
|
+
const match = row.match(/^(\d+)\s+\w+\s+([0-9a-f]+)\t(.+)$/);
|
|
135
|
+
if (!match) continue;
|
|
136
|
+
const destination = destinationForTracked(match[3]);
|
|
137
|
+
if (destination) await git(repo, [
|
|
138
|
+
"update-index",
|
|
139
|
+
"--add",
|
|
140
|
+
"--cacheinfo",
|
|
141
|
+
`${match[1]},${match[2]},${destination}`
|
|
142
|
+
], signal, env);
|
|
143
|
+
}
|
|
144
|
+
return await git(repo, [
|
|
145
|
+
"commit-tree",
|
|
146
|
+
await git(repo, ["write-tree"], signal, env),
|
|
147
|
+
"-m",
|
|
148
|
+
"chore(state): seed overdeck-state"
|
|
149
|
+
], signal, env);
|
|
150
|
+
} finally {
|
|
151
|
+
rmSync(index, { force: true });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let copySequence = 0;
|
|
155
|
+
async function copyFileAbortable(source, destination, signal) {
|
|
156
|
+
signal?.throwIfAborted();
|
|
157
|
+
const stat = await lstat(source);
|
|
158
|
+
const temporary = join(dirname(destination), `.overdeck-migrate-${process.pid}-${copySequence++}`);
|
|
159
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
160
|
+
try {
|
|
161
|
+
await pipeline(createReadStream(source, { signal }), createWriteStream(temporary, { mode: stat.mode & 511 }), { signal });
|
|
162
|
+
signal?.throwIfAborted();
|
|
163
|
+
await chmod(temporary, stat.mode & 511);
|
|
164
|
+
await utimes(temporary, stat.atime, stat.mtime);
|
|
165
|
+
signal?.throwIfAborted();
|
|
166
|
+
await rename(temporary, destination);
|
|
167
|
+
} catch (error) {
|
|
168
|
+
if (signal?.aborted) throw signal.reason;
|
|
169
|
+
throw error;
|
|
170
|
+
} finally {
|
|
171
|
+
await rm(temporary, { force: true });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function filesEqualAbortable(source, destination, signal) {
|
|
175
|
+
const [sourceEntry, destinationEntry] = await Promise.all([manifestEntry(source, source, signal), manifestEntry(destination, destination, signal)]);
|
|
176
|
+
return sourceEntry.size === destinationEntry.size && sourceEntry.sha256 === destinationEntry.sha256;
|
|
177
|
+
}
|
|
178
|
+
async function preserveUntrackedNotes(legacyStateSource, stateRoot, paths, signal, copyFile = copyFileAbortable) {
|
|
179
|
+
const manifest = [];
|
|
180
|
+
for (const path of paths) {
|
|
181
|
+
signal?.throwIfAborted();
|
|
182
|
+
const source = join(legacyStateSource, path);
|
|
183
|
+
let sourceStat;
|
|
184
|
+
try {
|
|
185
|
+
sourceStat = await lstat(source);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (error.code === "ENOENT") continue;
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
190
|
+
if (sourceStat.isSymbolicLink()) throw new Error(`Legacy state changed during migration: symbolic link appeared at ${source}`);
|
|
191
|
+
if (!sourceStat.isFile()) continue;
|
|
192
|
+
const destination = join(stateRoot, "notes", path.slice(5));
|
|
193
|
+
if (existsSync(destination)) {
|
|
194
|
+
if (!await filesEqualAbortable(source, destination, signal)) throw new Error(`Untracked-note destination collision: ${destination}`);
|
|
195
|
+
} else await copyFile(source, destination, signal);
|
|
196
|
+
manifest.push(await manifestEntry(source, destination, signal));
|
|
197
|
+
}
|
|
198
|
+
return manifest;
|
|
199
|
+
}
|
|
200
|
+
async function assertNoLegacySymlinks(source, signal, allowMissing = false) {
|
|
201
|
+
signal?.throwIfAborted();
|
|
202
|
+
let stat;
|
|
203
|
+
try {
|
|
204
|
+
stat = await lstat(source);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
if (allowMissing && error.code === "ENOENT") return;
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
if (stat.isSymbolicLink()) throw new Error(`Legacy state contains unsupported symbolic link: ${source}. Resolve it before migrating so canonical state cannot depend on the legacy tree.`);
|
|
210
|
+
if (!stat.isDirectory()) return;
|
|
211
|
+
for (const entry of await readdir(source, { withFileTypes: true })) await assertNoLegacySymlinks(join(source, entry.name), signal);
|
|
212
|
+
}
|
|
213
|
+
async function copyLegacyState(sourceRoot, stateRoot, signal, copyFile = copyFileAbortable) {
|
|
214
|
+
const manifest = [];
|
|
215
|
+
const sources = STATE_BRANCH_PATHS.map((sourcePath) => ({
|
|
216
|
+
source: join(sourceRoot, ".pan", sourcePath),
|
|
217
|
+
destination: join(stateRoot, sourcePath)
|
|
218
|
+
})).filter(({ source }) => existsSync(source));
|
|
219
|
+
await assertNoLegacySymlinks(join(sourceRoot, ".pan"), signal, true);
|
|
220
|
+
const visit = async (sourceDir, destinationDir) => {
|
|
221
|
+
await mkdir(destinationDir, { recursive: true });
|
|
222
|
+
for (const entry of await readdir(sourceDir, { withFileTypes: true })) {
|
|
223
|
+
signal?.throwIfAborted();
|
|
224
|
+
const sourceEntry = join(sourceDir, entry.name);
|
|
225
|
+
const destinationEntry = join(destinationDir, entry.name);
|
|
226
|
+
if (entry.isDirectory()) await visit(sourceEntry, destinationEntry);
|
|
227
|
+
else if (entry.isFile()) {
|
|
228
|
+
await copyFile(sourceEntry, destinationEntry, signal);
|
|
229
|
+
signal?.throwIfAborted();
|
|
230
|
+
manifest.push(await manifestEntry(sourceEntry, destinationEntry, signal));
|
|
231
|
+
} else if (entry.isSymbolicLink()) throw new Error(`Legacy state changed during migration: symbolic link appeared at ${sourceEntry}`);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
for (const { source, destination } of sources) {
|
|
235
|
+
signal?.throwIfAborted();
|
|
236
|
+
await visit(source, destination);
|
|
237
|
+
}
|
|
238
|
+
return manifest;
|
|
239
|
+
}
|
|
240
|
+
function hasNonStateDirtyState(porcelain) {
|
|
241
|
+
return porcelain.split("\n").filter(Boolean).some((line) => {
|
|
242
|
+
const path = line.slice(3).split(" -> ").at(-1) ?? "";
|
|
243
|
+
if (path === ".pan" || path.startsWith(".pan/")) return false;
|
|
244
|
+
return true;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
function dedupeManifest(entries) {
|
|
248
|
+
return [...new Map(entries.map((entry) => [entry.destination, entry])).values()];
|
|
249
|
+
}
|
|
250
|
+
const GITIGNORE_MANAGED_LINES = [
|
|
251
|
+
"# PAN-2541: permanent state is on overdeck-state; workspace runtime stays local.",
|
|
252
|
+
".pan/",
|
|
253
|
+
".overdeck/continue.json",
|
|
254
|
+
".overdeck/spec.vbrief.json",
|
|
255
|
+
".overdeck/sessions.jsonl",
|
|
256
|
+
".overdeck/feedback/",
|
|
257
|
+
".overdeck/review/",
|
|
258
|
+
".overdeck/test/",
|
|
259
|
+
".overdeck/kickoff.md",
|
|
260
|
+
".overdeck/agent-mcp.json"
|
|
261
|
+
];
|
|
262
|
+
function rewriteGitignore(repo) {
|
|
263
|
+
const path = join(repo, ".gitignore");
|
|
264
|
+
const prior = existsSync(path) ? readFileSync(path, "utf8") : "";
|
|
265
|
+
const managed = new Set([...GITIGNORE_MANAGED_LINES, ".overdeck/"]);
|
|
266
|
+
const kept = prior.split("\n").filter((line) => !managed.has(line.trim()));
|
|
267
|
+
while (kept.length > 0 && kept[kept.length - 1]?.trim() === "") kept.pop();
|
|
268
|
+
writeFileSync(path, [
|
|
269
|
+
...kept,
|
|
270
|
+
"",
|
|
271
|
+
...GITIGNORE_MANAGED_LINES,
|
|
272
|
+
""
|
|
273
|
+
].join("\n"));
|
|
274
|
+
}
|
|
275
|
+
async function migrateProjectState(projectKey, options = {}, projectOverride) {
|
|
276
|
+
const project = projectOverride ?? getProjectSync(projectKey);
|
|
277
|
+
if (!project) throw new Error(`Unknown project: ${projectKey}`);
|
|
278
|
+
const { repoPath: repo } = resolveInfraRepo(project);
|
|
279
|
+
const legacyStateSource = project.path;
|
|
280
|
+
const sourceIsHostRepo = legacyStateSource === repo;
|
|
281
|
+
const stateRoot = stateWorktreePath(project, { projectKey });
|
|
282
|
+
console.log(`PAN-2541 state migration plan for ${projectKey}:`);
|
|
283
|
+
console.log(` ${legacyStateSource}/.pan/{${STATE_BRANCH_PATHS.map((p) => p.slice(0, -1)).join(",")}} -> ${stateRoot}/`);
|
|
284
|
+
console.log(` ${legacyStateSource}/.pan/context -> ${legacyStateSource}/.overdeck/context`);
|
|
285
|
+
if (options.dryRun) return;
|
|
286
|
+
options.signal?.throwIfAborted();
|
|
287
|
+
const release = acquireStateMigrationLock(projectKey);
|
|
288
|
+
try {
|
|
289
|
+
const flush = await Effect.runPromise(flushAutoCommits(repo, options.signal));
|
|
290
|
+
if (flush.errored) throw new Error(`State writer did not quiesce before migration: ${flush.reason ?? "unknown error"}`);
|
|
291
|
+
options.signal?.throwIfAborted();
|
|
292
|
+
await assertNoLegacySymlinks(join(legacyStateSource, ".pan"), options.signal, true);
|
|
293
|
+
if (hasNonStateDirtyState(await git(repo, ["status", "--porcelain"], options.signal))) throw new Error("Primary checkout is dirty outside legacy state paths; migration refused before mutation");
|
|
294
|
+
await git(repo, [
|
|
295
|
+
"fetch",
|
|
296
|
+
"--prune",
|
|
297
|
+
"origin"
|
|
298
|
+
], options.signal);
|
|
299
|
+
const sourceMainSha = await git(repo, ["rev-parse", "main"], options.signal);
|
|
300
|
+
if (sourceMainSha !== await git(repo, ["rev-parse", "origin/main"], options.signal)) throw new Error("main is not exactly at origin/main; migration refused");
|
|
301
|
+
if (await git(repo, ["show", `origin/overdeck-state:migration-complete.json`], options.signal).catch(() => {
|
|
302
|
+
options.signal?.throwIfAborted();
|
|
303
|
+
return "";
|
|
304
|
+
})) {
|
|
305
|
+
console.log("State migration already complete on origin; nothing to do.");
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
let stateSha = await git(repo, ["rev-parse", STATE_BRANCH], options.signal).catch(() => {
|
|
309
|
+
options.signal?.throwIfAborted();
|
|
310
|
+
return "";
|
|
311
|
+
});
|
|
312
|
+
const remoteStateSha = await git(repo, ["rev-parse", `origin/${STATE_BRANCH}`], options.signal).catch(() => {
|
|
313
|
+
options.signal?.throwIfAborted();
|
|
314
|
+
return "";
|
|
315
|
+
});
|
|
316
|
+
if (stateSha && remoteStateSha && stateSha !== remoteStateSha) throw new Error("Local and remote overdeck-state diverged; refusing non-fast-forward migration");
|
|
317
|
+
if (!stateSha) {
|
|
318
|
+
stateSha = remoteStateSha || await createOrphanStateCommit(repo, sourceMainSha, options.signal);
|
|
319
|
+
await git(repo, [
|
|
320
|
+
"update-ref",
|
|
321
|
+
`refs/heads/${STATE_BRANCH}`,
|
|
322
|
+
stateSha
|
|
323
|
+
], options.signal);
|
|
324
|
+
}
|
|
325
|
+
if (!remoteStateSha) await git(repo, [
|
|
326
|
+
"push",
|
|
327
|
+
"origin",
|
|
328
|
+
STATE_BRANCH
|
|
329
|
+
], options.signal);
|
|
330
|
+
if (!existsSync(stateRoot)) {
|
|
331
|
+
options.signal?.throwIfAborted();
|
|
332
|
+
mkdirSync(dirname(stateRoot), { recursive: true });
|
|
333
|
+
await git(repo, [
|
|
334
|
+
"worktree",
|
|
335
|
+
"add",
|
|
336
|
+
stateRoot,
|
|
337
|
+
STATE_BRANCH
|
|
338
|
+
], options.signal);
|
|
339
|
+
}
|
|
340
|
+
const manifest = sourceIsHostRepo ? dedupeManifest([...await trackedManifest(repo, sourceMainSha, stateRoot, options.signal), ...await copyLegacyState(legacyStateSource, stateRoot, options.signal)]) : await copyLegacyState(legacyStateSource, stateRoot, options.signal);
|
|
341
|
+
if (manifest.length > 0) {
|
|
342
|
+
await git(stateRoot, ["add", "--all"], options.signal);
|
|
343
|
+
if (await git(stateRoot, [
|
|
344
|
+
"diff",
|
|
345
|
+
"--cached",
|
|
346
|
+
"--name-only"
|
|
347
|
+
], options.signal)) await git(stateRoot, [
|
|
348
|
+
"commit",
|
|
349
|
+
"-m",
|
|
350
|
+
"chore(state): seed legacy project state"
|
|
351
|
+
], options.signal);
|
|
352
|
+
await git(stateRoot, [
|
|
353
|
+
"push",
|
|
354
|
+
"origin",
|
|
355
|
+
STATE_BRANCH
|
|
356
|
+
], options.signal);
|
|
357
|
+
}
|
|
358
|
+
const untracked = sourceIsHostRepo ? (await git(repo, [
|
|
359
|
+
"ls-files",
|
|
360
|
+
"--others",
|
|
361
|
+
"--",
|
|
362
|
+
".pan"
|
|
363
|
+
], options.signal)).split("\n").filter((path) => path.split("/").length === 2 && existsSync(join(repo, path)) && lstatSync(join(repo, path)).isFile()) : existsSync(join(legacyStateSource, ".pan")) ? readdirSync(join(legacyStateSource, ".pan"), { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => `.pan/${entry.name}`) : [];
|
|
364
|
+
manifest.push(...await preserveUntrackedNotes(legacyStateSource, stateRoot, untracked, options.signal));
|
|
365
|
+
if (untracked.length > 0) {
|
|
366
|
+
await git(stateRoot, ["add", "notes"], options.signal);
|
|
367
|
+
if (await git(stateRoot, [
|
|
368
|
+
"diff",
|
|
369
|
+
"--cached",
|
|
370
|
+
"--name-only"
|
|
371
|
+
], options.signal)) await git(stateRoot, [
|
|
372
|
+
"commit",
|
|
373
|
+
"-m",
|
|
374
|
+
"chore(state): preserve untracked operator notes"
|
|
375
|
+
], options.signal);
|
|
376
|
+
await git(stateRoot, [
|
|
377
|
+
"push",
|
|
378
|
+
"origin",
|
|
379
|
+
STATE_BRANCH
|
|
380
|
+
], options.signal);
|
|
381
|
+
}
|
|
382
|
+
if (await git(repo, ["rev-parse", "main"], options.signal) !== sourceMainSha) throw new Error("main advanced during migration; refusing cleanup");
|
|
383
|
+
options.signal?.throwIfAborted();
|
|
384
|
+
if (sourceIsHostRepo) await git(repo, [
|
|
385
|
+
"rm",
|
|
386
|
+
"-r",
|
|
387
|
+
"--cached",
|
|
388
|
+
"--ignore-unmatch",
|
|
389
|
+
".pan/records",
|
|
390
|
+
".pan/continues",
|
|
391
|
+
".pan/specs",
|
|
392
|
+
".pan/drafts",
|
|
393
|
+
".pan/review",
|
|
394
|
+
".pan/test",
|
|
395
|
+
".pan/feedback",
|
|
396
|
+
".pan/backlog",
|
|
397
|
+
".pan/notes"
|
|
398
|
+
]);
|
|
399
|
+
const oldContext = join(legacyStateSource, ".pan", "context");
|
|
400
|
+
const newContext = join(legacyStateSource, ".overdeck", "context");
|
|
401
|
+
let movedContext = false;
|
|
402
|
+
if (existsSync(oldContext) && !existsSync(newContext)) {
|
|
403
|
+
mkdirSync(dirname(newContext), { recursive: true });
|
|
404
|
+
renameSync(oldContext, newContext);
|
|
405
|
+
movedContext = true;
|
|
406
|
+
}
|
|
407
|
+
rewriteGitignore(legacyStateSource);
|
|
408
|
+
if (sourceIsHostRepo) {
|
|
409
|
+
if (await git(repo, [
|
|
410
|
+
"ls-files",
|
|
411
|
+
"--",
|
|
412
|
+
".pan/context"
|
|
413
|
+
])) await git(repo, [
|
|
414
|
+
"add",
|
|
415
|
+
"-u",
|
|
416
|
+
"--",
|
|
417
|
+
".pan/context"
|
|
418
|
+
]);
|
|
419
|
+
const addPaths = [".gitignore"];
|
|
420
|
+
if (movedContext || existsSync(newContext)) addPaths.push(".overdeck/context");
|
|
421
|
+
await git(repo, [
|
|
422
|
+
"add",
|
|
423
|
+
"--",
|
|
424
|
+
...addPaths
|
|
425
|
+
]);
|
|
426
|
+
if (await git(repo, [
|
|
427
|
+
"diff",
|
|
428
|
+
"--cached",
|
|
429
|
+
"--name-only"
|
|
430
|
+
])) await git(repo, [
|
|
431
|
+
"commit",
|
|
432
|
+
"-m",
|
|
433
|
+
"chore(state): move permanent state to overdeck-state"
|
|
434
|
+
]);
|
|
435
|
+
}
|
|
436
|
+
await verifyStateMigrationManifest(manifest);
|
|
437
|
+
for (const entry of manifest) rmSync(entry.source, { force: true });
|
|
438
|
+
if (!sourceIsHostRepo) rmSync(join(legacyStateSource, ".pan"), {
|
|
439
|
+
recursive: true,
|
|
440
|
+
force: true
|
|
441
|
+
});
|
|
442
|
+
stateSha = await git(stateRoot, ["rev-parse", "HEAD"]);
|
|
443
|
+
writeFileSync(join(stateRoot, MIGRATION_COMPLETE_MARKER), `${JSON.stringify({
|
|
444
|
+
sourceMainSha,
|
|
445
|
+
stateBranchSha: stateSha,
|
|
446
|
+
completedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
447
|
+
version: 1
|
|
448
|
+
}, null, 2)}\n`);
|
|
449
|
+
await git(stateRoot, ["add", MIGRATION_COMPLETE_MARKER]);
|
|
450
|
+
await git(stateRoot, [
|
|
451
|
+
"commit",
|
|
452
|
+
"-m",
|
|
453
|
+
"chore(state): complete state migration"
|
|
454
|
+
]);
|
|
455
|
+
await git(repo, [
|
|
456
|
+
"push",
|
|
457
|
+
"--atomic",
|
|
458
|
+
"--dry-run",
|
|
459
|
+
"origin",
|
|
460
|
+
"main",
|
|
461
|
+
STATE_BRANCH
|
|
462
|
+
]);
|
|
463
|
+
await git(repo, [
|
|
464
|
+
"push",
|
|
465
|
+
"--atomic",
|
|
466
|
+
"origin",
|
|
467
|
+
"main",
|
|
468
|
+
STATE_BRANCH
|
|
469
|
+
]);
|
|
470
|
+
clearStateMigrationCache();
|
|
471
|
+
} finally {
|
|
472
|
+
release();
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
//#endregion
|
|
476
|
+
export { migrateProjectState };
|
|
477
|
+
|
|
478
|
+
//# sourceMappingURL=state-migrate-BeBW0KXA.js.map
|