@overdeck/desktop 0.45.21 → 0.45.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/server/{acceptance-criteria-CJIFA8Vg.js → acceptance-criteria-DOA0KgXx.js} +5 -5
- package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-BBu6DSNm.js} +6 -6
- package/server/{agent-gc-D6PUckBB.js → agent-gc-BV1q_2EV.js} +4 -4
- package/server/agent-state-Bg0lhqwj.js +3 -0
- package/server/{agent-state-service-DHwemt96.js → agent-state-service-CnzFKSAQ.js} +1 -1
- package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-HoK8U4jW.js} +5 -5
- package/server/{agents-DbrHWunF.js → agents-B4Bjbkfv.js} +4 -4
- package/server/agents-FlIgQ3ql.js +3 -0
- package/server/{archive-planning-BOnwJq8M.js → archive-planning-DYrYojxl.js} +31 -7
- package/server/{archive-planning-MPpvQJL4.js → archive-planning-zkJb3BeM.js} +1 -1
- package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
- package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
- package/server/{behavior-Dg-D8eBG.js → behavior-B_-4EKF3.js} +2 -2
- package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-DWdW7vUm.js} +2 -2
- package/server/{build-info-27NlbKhV.js → build-info-BT096lEl.js} +3 -3
- package/server/{build-info-Cv6CI7Gu.js → build-info-DgTqZkL5.js} +1 -1
- package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-B7Bt29J0.js} +1 -1
- package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-DDqcGyu8.js} +2 -2
- package/server/checkpoint-worker.js +1 -1
- package/server/{checkpoints-Vh-J15ge.js → checkpoints-C-AXLfYT.js} +2 -2
- package/server/{checkpoints-DwZqT2qQ.js → checkpoints-CpgCjAlN.js} +1 -1
- package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
- package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-but-_qGY.js} +2 -2
- package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-H_5wHQZQ.js} +2 -2
- package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-BTENVmYf.js} +1 -1
- package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
- package/server/cli-BsVIHwzC.js +3 -0
- package/server/{cli-mvpEOb3w.js → cli-vBeXbPrq.js} +9 -9
- package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Bgb2XCqi.js} +2 -2
- package/server/{cliproxy-7g1nObvB.js → cliproxy-DW0V86F8.js} +1 -1
- package/server/{close-issue-8F6uawYj.js → close-issue-Dn_4c4G8.js} +5 -5
- package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
- package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-hANY_ehE.js} +9 -9
- package/server/codex-Dg7Is5yb.js +3 -0
- package/server/{codex-D_UBEOwL.js → codex-TmSi-yTv.js} +30 -8
- package/server/{codex-parser-BTzlOZiV.js → codex-parser-C4gSH-IR.js} +2 -2
- package/server/{config-CrduXs4a.js → config-CCvjQf27.js} +2 -2
- package/server/{config-nAB_F-Gp.js → config-DUIhMN_T.js} +1 -1
- package/server/{config-G1TOMJZA.js → config-DjLOdbgT.js} +2 -2
- package/server/{config-yaml-Ciyp2mYe.js → config-yaml-DvyMuOle.js} +177 -211
- package/server/{conflict-gate-BKalpcjL.js → conflict-gate-BSJkNTdp.js} +1 -1
- package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CmrYpa47.js} +3 -3
- package/server/{context-layers-YNpf6Q_I.js → context-layers-B3Nt58jl.js} +2 -2
- package/server/{context-layers-Cg9ZgVfx.js → context-layers-ZYFcWiyc.js} +3 -3
- package/server/{control-settings-D_79A6gp.js → control-settings-aP1ANIlI.js} +4 -4
- package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-CNbTLB86.js} +8 -8
- package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-DiG5zWQq.js} +1 -1
- package/server/{conversation-service-DQybSPUK.js → conversation-service-Du-MTNpJ.js} +6 -6
- package/server/{conversation-service-CWk8mEym.js → conversation-service-Up7FEzIC.js} +1 -1
- package/server/{conversations-BJ-t3BRm.js → conversations-6mPANqvL.js} +1 -1
- package/server/{conversations-BUgGvqVL.js → conversations-DbOs1e9Q.js} +4 -4
- package/server/{cost-jJ2cgDcG.js → cost-CW4WSe72.js} +3 -3
- package/server/{cost-Drm7qeD5.js → cost-Ca0YTWDw.js} +18 -2
- package/server/{cost-sync-DzHP6zaR.js → cost-sync-C0VdGme1.js} +3 -3
- package/server/{dag-DIji6O2b.js → dag-CdOjJVDT.js} +9 -9
- package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-CT-IypG3.js} +1 -1
- package/server/dashboard-db-worker.js +7 -7
- package/server/{deacon-pleYrvIm.js → deacon-DYSEJb48.js} +3 -3
- package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
- package/server/{deacon-1s7bM5zn.js → deacon-pRnyD5w9.js} +1133 -474
- package/server/deacon-swarm-9jRLS5Ke.js +2 -0
- package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-DftYRDo8.js} +17 -17
- package/server/deacon.js +8 -8
- package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-Bjsho_ha.js} +136 -19
- package/server/{deploy-window-ClLq1RYf.js → deploy-window-CM6W1-c6.js} +1 -1
- package/server/{deploy-window-jw4S_Y-c.js → deploy-window-DeP_OIRk.js} +77 -10
- package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-BpMoHlkR.js} +2 -2
- package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
- package/server/dist-Bd3vn0Hw.js +3 -0
- package/server/{dist-yfR7G1BL.js → dist-DyRx4cI7.js} +1 -1
- package/server/{docker-ClwPQaba.js → docker-BK7HIcBj.js} +2 -2
- package/server/{dod-BLphkhjs.js → dod-BrSfUHm0.js} +1 -1
- package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
- package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-DseivYEy.js} +4 -4
- package/server/{esm-shims-BZw-fTQ6.js → esm-shims-CbI3BVkl.js} +1 -1
- package/server/{event-store-DABarGNz.js → event-store-Cr5PQwFC.js} +1 -1
- package/server/{event-store-BVnON3vf.js → event-store-tdiY5eDZ.js} +3 -3
- package/server/{events-CmERlnwn.js → events-CC1dgUpx.js} +3 -3
- package/server/{events-LGeUehYW.js → events-CvvGK6LT.js} +1 -1
- package/server/{factory-CQNprtHe.js → factory-CynerjXO.js} +50 -13
- package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B0pmAz0a.js} +4 -4
- package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-_wUBRD3J.js} +2 -2
- package/server/{features--fOza5g5.js → features-Dhxz-wLc.js} +2 -2
- package/server/{feedback-target-Dqik2WTe.js → feedback-target-CPS15Vte.js} +7 -7
- package/server/{feedback-target-Dn9vfPpz.js → feedback-target-iygZwmMc.js} +1 -1
- package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-C9b6ccN1.js} +6 -5
- package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-qmiMbqTZ.js} +1 -1
- package/server/{flywheel-Q-38YhZG.js → flywheel-DMCUzDWg.js} +1 -1
- package/server/{flywheel-1Wd8WDlh.js → flywheel-DSSpWmqF.js} +13 -13
- package/server/{flywheel-DPUc8r3V.js → flywheel-DcBkQvgE.js} +14 -14
- package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
- package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
- package/server/forge-B-ZWyTRm.js +2 -0
- package/server/{forge-DBbDpiYc.js → forge-Ch9gCFod.js} +2 -2
- package/server/{from-hh6vTBGl.js → from-CJ_aH5jD.js} +1 -1
- package/server/{fts-db-6ponMie2.js → fts-db-CKgg0VKg.js} +2 -2
- package/server/{fts-operations-KIRK165y.js → fts-operations-BrL_VTRr.js} +2 -2
- package/server/git-utils-BVa07a4a.js +198 -0
- package/server/{git-utils-DmF5xkj8.js → git-utils-Dry_Ka_D.js} +1 -1
- package/server/{github-app-B3yfECo8.js → github-app-CMBdIFBQ.js} +11 -3
- package/server/{github-app-CeSVFL6C.js → github-app-CPfoFAdV.js} +1 -1
- package/server/{github-client-Dslipypz.js → github-client--XVlDpwM.js} +2 -2
- package/server/{github-client-4A6FgA8O.js → github-client-B4QsdE-X.js} +1 -1
- package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-BRbDW-qk.js} +2 -2
- package/server/harness-binary-CVio2m-u.js +106 -0
- package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-qHJBhy3Z.js} +9 -15
- package/server/{health-events-CZGZ5I-A.js → health-events-C9B8y1Hm.js} +2 -2
- package/server/{health-events-CnwV_SSz.js → health-events-CpfvuVmm.js} +1 -1
- package/server/{hooks-CoNscX84.js → hooks-DUXw8A0-.js} +2 -2
- package/server/{hooks-DvX33gY_.js → hooks-ltecuFqZ.js} +1 -1
- package/server/{hume-DSJt5eA_.js → hume-BEq0bUDg.js} +2 -2
- package/server/hume-B_DbflNM.js +3 -0
- package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
- package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
- package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-aQ1IxeI3.js} +2 -2
- package/server/{infra-DN2wSxle.js → infra-CzaSOgul.js} +4 -4
- package/server/{injection-DtlT8Akv.js → injection-DZ0PfYa4.js} +7 -7
- package/server/{injection-DK9zh_HL.js → injection-oNZeoDhL.js} +1 -1
- package/server/{inspect-agent-DKByUS_F.js → inspect-agent-DJKLWcVT.js} +15 -11
- package/server/inspect-agent-ch-F-5Ci.js +2 -0
- package/server/{internal-token-DhfFiwW7.js → internal-token-Bb4XeV2x.js} +2 -2
- package/server/{internal-token-7bYL5v6K.js → internal-token-DXdfprGr.js} +1 -1
- package/server/{io-BiM-7Zsx.js → io-B3_AHDfr.js} +160 -184
- package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-zhdvQicO.js} +7 -7
- package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CreaCkjW.js} +22 -22
- package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
- package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-B5ushCvE.js} +8 -8
- package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DabvBWUp.js} +1 -1
- package/server/{issues-XYtFMxrH.js → issues-B6ToV6x1.js} +2 -2
- package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-Dhflo1SH.js} +3 -3
- package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-BKPJm4Hv.js} +3 -3
- package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-DdWbHEBu.js} +4 -4
- package/server/{launcher-generator-5DJRiovn.js → launcher-generator-CHVm7bGT.js} +10 -9
- package/server/{layers-cZx7ibtV.js → layers-DzxSTGNA.js} +2 -2
- package/server/lifecycle-DfeyBDwA.js +121 -0
- package/server/lifecycle-io-Bsnr2K4F.js +3 -0
- package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-D8iNBcux.js} +37 -37
- package/server/{lifecycle-CE7619Xw.js → lifecycle-sycO16hj.js} +6 -6
- package/server/{linear-client-BLyN-NiP.js → linear-client-D4zqMnX7.js} +2 -2
- package/server/{linear-client-Bj1l4FOA.js → linear-client-DqhDQO9k.js} +1 -1
- package/server/memory-fts-worker.js +1 -1
- package/server/{merge-hSC2BENe.js → merge-C_ZEhbqI.js} +3 -3
- package/server/{merge-CwX2_AWm.js → merge-DK23JEdS.js} +1 -1
- package/server/{merge-agent-CnORPiri.js → merge-agent-BQM3a8z5.js} +1 -1
- package/server/{merge-agent-DnBsms_V.js → merge-agent-XrB80vfT.js} +369 -213
- package/server/{merge-batch-C2w2U2eK.js → merge-batch-Bwoyr8Je.js} +1 -1
- package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BsFjGrQ8.js} +2 -2
- package/server/merge-ops-DlB1IM0Y.js +2 -0
- package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-C1KIVr0s.js} +2 -2
- package/server/{merge-set-D7YNU1ZB.js → merge-set-DLz0MkGT.js} +3 -3
- package/server/{merge-set-DHkzPCJU.js → merge-set-DnSYdBEp.js} +1 -1
- package/server/{merge-sync-De1FYva5.js → merge-sync-DZ9dojJn.js} +2 -2
- package/server/{merge-sync-CpGA9Kg7.js → merge-sync-SSv3E-pl.js} +1 -1
- package/server/{merge-train-SvkRJZ-k.js → merge-train-DxDfBTjr.js} +3 -3
- package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-CyYQUksx.js} +4 -4
- package/server/{merge-verification-B3meGcXF.js → merge-verification-CSizH3HY.js} +4 -4
- package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-Dt8YPN5S.js} +2 -2
- package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-Cx3K0hHi.js} +11 -8
- 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-BTkDrl4R.js} +1 -1
- package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-neK8dHQk.js} +23 -14
- package/server/package-lock.json +6 -6
- package/server/package.json +1 -1
- package/server/{pan-dir-Rw17YjT1.js → pan-dir-DeVUgwA7.js} +78 -58
- package/server/{paths-FP8v3lTz.js → paths-_zEts6wc.js} +2 -2
- package/server/{pickup-xi3KTLaJ.js → pickup-Dd0Znxxy.js} +2 -2
- package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-0HaEGDlH.js} +190 -68
- package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-6iCJplFZ.js} +1 -1
- package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-D0ykk59O.js} +2 -2
- package/server/{project-pipelines-B59NfN44.js → project-pipelines-2sK1apsO.js} +2 -2
- package/server/projects-9SkRpES9.js +3 -0
- package/server/{prompts-CbqaVjbe.js → prompts-Dp4Tpk39.js} +2 -2
- package/server/providers-DKkBXhxU.js +3 -0
- package/server/{providers-d3pwXGVE.js → providers-DV7ec8l7.js} +7 -7
- package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
- package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
- package/server/public/assets/{dist-DQNg4CiF.js → dist-BWR4qFiV.js} +1 -1
- package/server/public/assets/{dist-CLSlc6cV.js → dist-DEmlBBNQ.js} +3 -3
- package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
- package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
- package/server/public/assets/index-CUr1xv8w.css +1 -0
- package/server/public/assets/{index-SLYGA8AQ.js → index-CsSuZQBI.js} +148 -145
- package/server/public/assets/{linear-6Fi3qnGg.js → linear-C9zFQpkX.js} +1 -1
- package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
- package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
- package/server/public/assets/{prod-ojHllFvN.js → prod-B1jCQihw.js} +4 -4
- package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
- package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
- package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
- package/server/public/index.html +54 -10
- package/server/{pull-requests-D3N6HQzI.js → pull-requests--Ib2jTgy.js} +1 -1
- package/server/{pull-requests-CjjPj7v6.js → pull-requests-CXIhdCYD.js} +13 -11
- package/server/{queries-B5hl7lMQ.js → queries-6d7Cdtm7.js} +723 -110
- package/server/{rally-Dp0Gb1DN.js → rally-B708-nZn.js} +3 -3
- package/server/{rally-api-DGaFz5L5.js → rally-api-nY0ZANw3.js} +2 -2
- package/server/{rally-api-CKr0O4DJ.js → rally-api-yjQ0TfHd.js} +1 -1
- package/server/{rally-client-SVbjGvqj.js → rally-client-B1EJhfV0.js} +4 -4
- package/server/{rally-client-Cqf6EX_r.js → rally-client-CULK2XAY.js} +1 -1
- package/server/rally-njs_mJrt.js +3 -0
- package/server/reap-terminal-sessions-MWnqdLCJ.js +4 -0
- package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-N3BTkmX_.js} +11 -28
- package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-Dp4eLkt4.js} +6 -6
- package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-kA7XngID.js} +1 -1
- package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-uWbZfjms.js} +6 -6
- package/server/record-t6V-3Dcj.js +3 -0
- package/server/{record-update-BlB8mpKO.js → record-update-DACtKh6_.js} +1 -1
- package/server/record-update-Dq0t2uBG.js +310 -0
- package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-BJtIQuag.js} +2 -2
- package/server/{release-engine-CSI4K6Oj.js → release-engine-DZpmGGzb.js} +5 -5
- package/server/{release-set-BywwggrE.js → release-set-hnXd_kga.js} +3 -3
- package/server/{remote-DYziAkiZ.js → remote-4tiENDaI.js} +3 -3
- package/server/{remote-cnoeuDWn.js → remote-Br-ZWVIP.js} +3 -3
- package/server/{remote-agents-BNORDWAX.js → remote-agents-CRCg1L4H.js} +1 -1
- package/server/{remote-agents-CZ2rc8I0.js → remote-agents-nmty1mLu.js} +6 -6
- package/server/{remote-completion-W67FNQ-A.js → remote-completion-BbWNd10K.js} +13 -13
- package/server/resume-CcKqnTvE.js +3 -0
- package/server/{review-agent-CSswH985.js → review-agent-DJRO8EG8.js} +1 -1
- package/server/{review-agent-CqSqSHkU.js → review-agent-sKkE1FEL.js} +23 -23
- package/server/{review-artifacts-BBgnd5df.js → review-artifacts-BLbSC4ke.js} +5 -5
- package/server/{review-context-Ctp9BdNJ.js → review-context-BgX3lcCx.js} +9 -9
- package/server/{review-status-CCgPVK1h.js → review-status-A7quS5KJ.js} +56 -39
- package/server/review-status-C6n6-9f_.js +3 -0
- package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-tbOn_A_u.js} +3 -3
- package/server/review-status-source-CxuEjLGg.js +39 -0
- package/server/{review-status-sync-jnLgd04F.js → review-status-sync-BhSQ0d0l.js} +2 -2
- package/server/{review-status-sync-C792ksoJ.js → review-status-sync-To3-iS-N.js} +1 -1
- package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
- package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CTRNtzXO.js} +7 -7
- package/server/{rollup-B3kQmNpl.js → rollup-B53Y81xK.js} +1 -1
- package/server/{rollup-CLj_AK9f.js → rollup-WA0VD-Rr.js} +8 -8
- package/server/{scanner-C4NeC4FE.js → scanner-D2743cp8.js} +11 -7
- package/server/{sequence-io-Ce-6grIY.js → sequence-io-Cg0zYj_E.js} +4 -4
- package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-BGY8gjg-.js} +5 -5
- package/server/server.js +1348 -963
- package/server/{service-CqAY8Kmk.js → service-DCpB_SGd.js} +154 -51
- package/server/{session-fork-uNo4rMRA.js → session-fork-BQ8_6H32.js} +2 -2
- package/server/{session-history-DUehL3KN.js → session-history-CVZDpS3c.js} +4 -4
- package/server/{settings-DP2OYLXL.js → settings-BZ5m1UCl.js} +3 -3
- package/server/settings-D0OSwos5.js +2 -0
- package/server/{settings-D9grjmaP.js → settings-ylxwqwQG.js} +2 -2
- package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-BlxG6Xye.js} +3 -3
- package/server/{shadow-state-CDxEuPlE.js → shadow-state-C2_epgx2.js} +1 -1
- package/server/{shadow-state-a_ztFBJe.js → shadow-state-Dh-HzF2J.js} +2 -2
- package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-4bvjn9b3.js} +2 -2
- package/server/{ship-log-DDcueaIR.js → ship-log-ClSMIzZX.js} +1 -1
- package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-CHIxLr_d.js} +1 -1
- package/server/{smart-compaction--Oj65Uov.js → smart-compaction-r4pHQBIr.js} +7 -7
- package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-DWAorh2B.js} +25 -20
- package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-KC_UduxD.js} +1 -1
- package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-BXhav38U.js} +1 -1
- package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-DtrYvGJ-.js} +5 -5
- package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
- package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-DJ3RzKxW.js} +3 -3
- package/server/{specialists-D0VBf8g_.js → specialists-D5fRZXmN.js} +1 -1
- package/server/specialists-DVj0hvaL.js +3 -0
- package/server/{specialists-CYRwELzc.js → specialists-DyFeedjn.js} +66 -76
- package/server/{specialists-DAegTvRt.js → specialists-JVO00bs7.js} +374 -220
- package/server/specs-nN45DG2X.js +3 -0
- package/server/{src-OLoJhUiJ.js → src-CG9mCkP6.js} +6 -6
- package/server/{src-BqTcrfO_.js → src-CMTQGyCK.js} +3 -3
- package/server/{src-Dpq1yFIl.js → src-U7_kTPEE.js} +338 -4
- package/server/{stack-health-I713ELld.js → stack-health-Df0YEZKa.js} +1 -1
- package/server/{stack-health-DV_f-lK0.js → stack-health-puygdaMd.js} +2 -2
- package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-BbFwCTb0.js} +4 -4
- package/server/{staleness-BbsGxmF2.js → staleness-Bpy41ngS.js} +15 -3
- package/server/{staleness-zGp4P1hd.js → staleness-Cbl_w4Bw.js} +1 -1
- package/server/{state-home-DixkE-up.js → state-home-CIGjwNfJ.js} +119 -54
- package/server/state-migrate-Dkzaxvny.js +487 -0
- package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CzEov_fq.js} +27 -21
- package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-sY_MHHgQ.js} +1 -1
- package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
- package/server/{summary-fork-CdLn8Chr.js → summary-fork-D8bXjCr7.js} +2 -2
- package/server/{summary-fork-f3DpgjXh.js → summary-fork-DHhJIsAL.js} +8 -8
- package/server/{supervisor-Ch8CDuoF.js → supervisor-BO-Zk_h-.js} +3 -3
- package/server/supervisor-BPy-o1A8.js +2 -0
- package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-CQ_fwUWF.js} +4 -4
- package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-Bza0ffAh.js} +24 -44
- package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-CEgauF4U.js} +15 -15
- package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-DXDt0Xa-.js} +7 -7
- package/server/{test-verdict-BRiSu7eW.js → test-verdict-CmUBK5cT.js} +1 -1
- package/server/{test-verdict-BQ1yx7d4.js → test-verdict-DFjjIHR5.js} +1 -1
- package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BDtLOIlO.js} +2 -2
- package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-DL566HbH.js} +1 -1
- package/server/tmux-DoThH6aj.js +3 -0
- package/server/{tmux-y1blSxks.js → tmux-ftABRAmc.js} +76 -44
- package/server/{token-LUrbM9sU.js → token-CsOhvw42.js} +2 -2
- package/server/{token-util-BZaDAQ8S.js → token-util-CTmczIfW.js} +1 -1
- package/server/token-util-DrHg8abn.js +3 -0
- package/server/{tracker-config-DSFZBdXP.js → tracker-config-B4itFzDo.js} +2 -2
- package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-BePq_oj-.js} +1 -1
- package/server/{tracker-utils-DiceZN3a.js → tracker-utils-tnxxqROg.js} +2 -2
- package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-m73vGebA.js} +1 -1
- package/server/{tunnel-DTng1rfQ.js → tunnel-B2vxjx_b.js} +3 -3
- package/server/{tunnel-WcJImbAC.js → tunnel-Cgj-IGIl.js} +1 -1
- package/server/{types-BjaZ1oqH.js → types-BBNjPcqU.js} +1 -1
- package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
- package/server/{uat-train-BpLnp7Cx.js → uat-train-CuEn0t9M.js} +28 -28
- package/server/{uat-train-Wismge7h.js → uat-train-cKfM-_WW.js} +1 -1
- package/server/{validation-BA4e5EGm.js → validation-B5JxoPUS.js} +259 -9
- package/server/{validation-CUWamZ4X.js → validation-CIi6pnI2.js} +1 -1
- package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BcnIbigL.js} +1 -1
- package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-C-lIHfUa.js} +1 -1
- package/server/{verification-runner-gAzh3cVD.js → verification-runner-Br0S_Ous.js} +103 -37
- package/server/{verification-runner-Dcksl_P-.js → verification-runner-CDj4lD4t.js} +1 -1
- package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-DKpNNW5i.js} +1 -1
- package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-Yb2bd3Fq.js} +16 -15
- package/server/{workflows-B8ROFlfw.js → workflows-C9WmILql.js} +39 -77
- package/server/workflows-D90rMOya.js +2 -0
- package/server/{workspace-DhTDA8nB.js → workspace-BVl4rihN.js} +3 -3
- package/server/{workspace-DSjUJaJN.js → workspace-DuUdndHe.js} +1 -1
- package/server/{workspace-config-BAAsAv-o.js → workspace-config-cEGcO6UT.js} +1 -1
- package/server/{workspace-manager-CcujONCR.js → workspace-manager-ZTdJAy9M.js} +1 -1
- package/server/{workspace-manager-DsN52IMG.js → workspace-manager-hLUv3ADC.js} +23 -16
- package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-CskwzzhL.js} +2 -2
- package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-DNpMixRq.js} +1 -1
- package/server/{workspaces-Dmlh1YXm.js → workspaces-hWvy9eKs.js} +276 -110
- package/sync-sources/agents/pan-inspect-agent.md +1 -1
- package/sync-sources/agents/pan-merge-agent.md +1 -1
- package/sync-sources/agents/pan-planning-agent.md +4 -4
- package/sync-sources/agents/pan-work-agent.md +1 -1
- package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
- package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
- package/sync-sources/hooks/record-cost-event.js +363 -71
- package/sync-sources/hooks/session-start-hook +7 -0
- package/sync-sources/hooks/work-agent-stop-hook +1 -1
- package/sync-sources/rules/per-bead-durability.md +1 -1
- package/sync-sources/rules/prd-authoring.md +1 -1
- package/sync-sources/skills/feature-work/SKILL.md +1 -1
- package/sync-sources/skills/pan/SKILL.md +2 -2
- package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
- package/sync-sources/skills/pan-approve/SKILL.md +1 -1
- package/sync-sources/skills/pan-close/SKILL.md +1 -1
- package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
- package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
- package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
- package/sync-sources/skills/pan-plan/SKILL.md +6 -6
- package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
- package/sync-sources/skills/pan-recap/SKILL.md +2 -2
- package/sync-sources/skills/pan-review/SKILL.md +1 -1
- package/sync-sources/skills/pan-start/SKILL.md +26 -3
- package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
- package/sync-sources/skills/pan-sync/SKILL.md +1 -1
- package/sync-sources/skills/pan-task/SKILL.md +2 -2
- package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
- package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
- package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
- package/sync-sources/skills/plan/SKILL.md +11 -11
- package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
- package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
- package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
- package/server/agent-state-BV_6RHnO.js +0 -3
- package/server/agents-Czz6R57Z.js +0 -3
- package/server/cli-ChErG518.js +0 -3
- package/server/codex-BBeZ8c3s.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/lifecycle-io-CUpsxG0p.js +0 -3
- 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/index-C6NLz_1S.css +0 -1
- 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-update-RviRDSNs.js +0 -168
- package/server/record-us0YECMO.js +0 -3
- package/server/resume-OyN3dEXE.js +0 -3
- package/server/review-status-DXeqFpk5.js +0 -3
- package/server/settings-BaPXXJsT.js +0 -2
- package/server/specialists-C6WkeKFK.js +0 -3
- package/server/specs-BsNcum0h.js +0 -3
- package/server/state-migrate-_zJJ6XKE.js +0 -362
- package/server/supervisor-Qy1QecAs.js +0 -2
- package/server/tmux-HQLgwo_C.js +0 -3
- package/server/token-util-Cg-QnowA.js +0 -3
- package/server/workflows-C5c-RPsY.js +0 -2
|
@@ -1,114 +1,69 @@
|
|
|
1
1
|
import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
|
|
2
|
-
import {
|
|
3
|
-
import { a as PAN_DIRNAME, f as asPanSpecDocument, l as PAN_SPECS_DIRNAME, m as isPanSpecStatus, o as PAN_DRAFTS_DIRNAME, p as init_types$1, r as PAN_CONTINUES_DIRNAME, u as PAN_SPEC_FILENAME } from "./types-
|
|
2
|
+
import { Bt as deriveProjectRoot, Dt as getProjectConfigFromWorkspacePath, Ft as resolveProjectForIssue, Ht as flushAutoCommits, Nt as readIssueRecordSync, Ot as init_record, Tn as init_projects, Ut as init_auto_commit, Wt as queueAutoCommit, fn as findProjectByPathSync, ir as FsError, jt as readIssueRecord, mr as init_errors, nn as init_state_read_home, rn as resolveStateReadHomeSync } from "./config-yaml-DvyMuOle.js";
|
|
3
|
+
import { a as PAN_DIRNAME, c as PAN_SESSIONS_FILENAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, l as PAN_SPECS_DIRNAME, m as isPanSpecStatus, n as PAN_CONTEXT_FILENAME, o as PAN_DRAFTS_DIRNAME, p as init_types$1, r as PAN_CONTINUES_DIRNAME, s as PAN_FEEDBACK_DIRNAME, t as LEGACY_WORKSPACE_RUNTIME_DIRNAME, u as PAN_SPEC_FILENAME } from "./types-hraoaQIp.js";
|
|
4
|
+
import { a as generateXBriefFilename, c as parseXBriefFilename, l as resolveXBriefDir, n as LEGACY_VBRIEF_LIFECYCLE_DIRS, o as init_lifecycle, u as slugify } from "./lifecycle-DfeyBDwA.js";
|
|
4
5
|
import { Data, Effect, FileSystem } from "effect";
|
|
5
6
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
|
|
6
7
|
import { basename, join, resolve } from "path";
|
|
8
|
+
import { existsSync as existsSync$1 } from "node:fs";
|
|
7
9
|
import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
|
|
8
10
|
import { readFile, readdir } from "fs/promises";
|
|
9
|
-
//#region ../../lib/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* ./vbrief/cancelled/ — abandoned, immutable archive
|
|
21
|
-
*
|
|
22
|
-
* Filenames are issue-keyed: `YYYY-MM-DD-<ISSUE-ID>-<slug>.vbrief.json` where
|
|
23
|
-
* the date is the immutable creation date. Issue ID gives Overdeck ergonomics
|
|
24
|
-
* (one vBRIEF per issue) and slug gives human readability.
|
|
25
|
-
*/
|
|
26
|
-
/**
|
|
27
|
-
* Slugify an arbitrary string for use in a vBRIEF filename. Lowercases,
|
|
28
|
-
* replaces non-alphanumeric runs with single dashes, trims leading/trailing
|
|
29
|
-
* dashes, and collapses repeats.
|
|
30
|
-
*/
|
|
31
|
-
function slugify(input) {
|
|
32
|
-
return input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").replace(/-+/g, "-") || "plan";
|
|
11
|
+
//#region ../../lib/pan-dir/continue.ts
|
|
12
|
+
function workspacePanPaths(workspacePath) {
|
|
13
|
+
const panDir = join(workspacePath, WORKSPACE_RUNTIME_DIRNAME);
|
|
14
|
+
return {
|
|
15
|
+
panDir,
|
|
16
|
+
specPath: join(panDir, PAN_SPEC_FILENAME),
|
|
17
|
+
continuePath: join(panDir, PAN_CONTINUE_FILENAME),
|
|
18
|
+
sessionsPath: join(panDir, PAN_SESSIONS_FILENAME),
|
|
19
|
+
feedbackDir: join(panDir, PAN_FEEDBACK_DIRNAME),
|
|
20
|
+
contextPath: join(panDir, PAN_CONTEXT_FILENAME)
|
|
21
|
+
};
|
|
33
22
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
*/
|
|
37
|
-
function formatDate(value) {
|
|
38
|
-
const d = typeof value === "string" ? new Date(value) : value;
|
|
39
|
-
if (Number.isNaN(d.getTime())) throw new Error(`Invalid date: ${String(value)}`);
|
|
40
|
-
return `${d.getUTCFullYear().toString().padStart(4, "0")}-${(d.getUTCMonth() + 1).toString().padStart(2, "0")}-${d.getUTCDate().toString().padStart(2, "0")}`;
|
|
23
|
+
function getWorkspacePanPaths(workspacePath) {
|
|
24
|
+
return workspacePanPaths(workspacePath);
|
|
41
25
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
*
|
|
45
|
-
* Format: `YYYY-MM-DD-<ISSUE-ID>-<slug>.vbrief.json`
|
|
46
|
-
* Example: `2026-05-03-PAN-946-vbrief-lifecycle.vbrief.json`
|
|
47
|
-
*
|
|
48
|
-
* @param issueId - Issue identifier in the form `PREFIX-NUMBER` (e.g. `PAN-946`).
|
|
49
|
-
* Normalized to uppercase in the filename — issue IDs are
|
|
50
|
-
* uppercase by convention, and case-preservation let a
|
|
51
|
-
* lowercased caller produce a duplicate, case-colliding
|
|
52
|
-
* spec file (PAN-1050).
|
|
53
|
-
* @param slug - Free-form slug (will be normalized via slugify).
|
|
54
|
-
* @param createdDate - Date or ISO string used for the YYYY-MM-DD prefix.
|
|
55
|
-
* Defaults to "now". Always interpreted in UTC so filenames
|
|
56
|
-
* are stable across timezones.
|
|
57
|
-
*/
|
|
58
|
-
function generateVBriefFilename(issueId, slug, createdDate = /* @__PURE__ */ new Date()) {
|
|
59
|
-
if (!/^[A-Za-z][A-Za-z0-9]*-\d+$/.test(issueId)) throw new Error(`Invalid issue ID for vBRIEF filename: ${issueId} (expected e.g. PAN-946)`);
|
|
60
|
-
const canonicalIssueId = issueId.toUpperCase();
|
|
61
|
-
return `${formatDate(createdDate)}-${canonicalIssueId}-${slugify(slug)}.vbrief.json`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Parse a canonical vBRIEF filename back into its parts. Returns null if the
|
|
65
|
-
* filename doesn't match the convention so callers can ignore stray files.
|
|
66
|
-
*/
|
|
67
|
-
function parseVBriefFilename(filename) {
|
|
68
|
-
const match = filename.match(FILENAME_RE);
|
|
69
|
-
if (!match) return null;
|
|
26
|
+
function getLegacyWorkspacePanPaths(workspacePath) {
|
|
27
|
+
const panDir = join(workspacePath, LEGACY_WORKSPACE_RUNTIME_DIRNAME);
|
|
70
28
|
return {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
29
|
+
panDir,
|
|
30
|
+
specPath: join(panDir, PAN_SPEC_FILENAME),
|
|
31
|
+
continuePath: join(panDir, PAN_CONTINUE_FILENAME),
|
|
32
|
+
sessionsPath: join(panDir, PAN_SESSIONS_FILENAME),
|
|
33
|
+
feedbackDir: join(panDir, PAN_FEEDBACK_DIRNAME),
|
|
34
|
+
contextPath: join(panDir, PAN_CONTEXT_FILENAME)
|
|
74
35
|
};
|
|
75
36
|
}
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
* @param vbriefDirname - Override the default "vbrief" dirname (from projects.yaml `vbrief_dir`).
|
|
81
|
-
*/
|
|
82
|
-
function resolveVBriefDir(projectRoot, lifecycleDir, vbriefDirname) {
|
|
83
|
-
return join(projectRoot, vbriefDirname || "vbrief", lifecycleDir);
|
|
37
|
+
/** Resolve workspace runtime reads to `.overdeck/`, then legacy `.pan/`. */
|
|
38
|
+
function getReadableWorkspacePanPaths(workspacePath) {
|
|
39
|
+
const canonical = getWorkspacePanPaths(workspacePath);
|
|
40
|
+
return existsSync$1(canonical.panDir) ? canonical : getLegacyWorkspacePanPaths(workspacePath);
|
|
84
41
|
}
|
|
85
|
-
|
|
86
|
-
*
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
*
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
42
|
+
function ensureWorkspacePanDir(workspacePath) {
|
|
43
|
+
return Effect.gen(function* () {
|
|
44
|
+
const fs = yield* FileSystem.FileSystem;
|
|
45
|
+
const paths = workspacePanPaths(workspacePath);
|
|
46
|
+
yield* fs.makeDirectory(paths.panDir, { recursive: true }).pipe(Effect.mapError((cause) => new FsError({
|
|
47
|
+
path: paths.panDir,
|
|
48
|
+
operation: "makeDirectory",
|
|
49
|
+
cause
|
|
50
|
+
})));
|
|
51
|
+
yield* fs.makeDirectory(paths.feedbackDir, { recursive: true }).pipe(Effect.mapError((cause) => new FsError({
|
|
52
|
+
path: paths.feedbackDir,
|
|
53
|
+
operation: "makeDirectory",
|
|
54
|
+
cause
|
|
55
|
+
})));
|
|
56
|
+
return paths;
|
|
57
|
+
}).pipe(Effect.provide(NodeFileSystem.layer));
|
|
58
|
+
}
|
|
59
|
+
var init_continue = __esmMin((() => {
|
|
99
60
|
init_errors();
|
|
100
|
-
|
|
101
|
-
"proposed",
|
|
102
|
-
"active",
|
|
103
|
-
"completed",
|
|
104
|
-
"cancelled"
|
|
105
|
-
];
|
|
106
|
-
FILENAME_RE = /^(\d{4}-\d{2}-\d{2})-([A-Za-z][A-Za-z0-9]*-\d+)-([a-z0-9-]+)\.vbrief\.json$/;
|
|
61
|
+
init_types$1();
|
|
107
62
|
}));
|
|
108
63
|
//#endregion
|
|
109
|
-
//#region ../../lib/
|
|
64
|
+
//#region ../../lib/xbrief/xbrief-index.ts
|
|
110
65
|
/**
|
|
111
|
-
*
|
|
66
|
+
* xBRIEF Index — async, cached issue→xBRIEF lookups for server hot paths.
|
|
112
67
|
*
|
|
113
68
|
* PAN-967 Phase 2 makes `.pan/specs/` the canonical spec store. During the
|
|
114
69
|
* migration window, legacy `vbrief/<lifecycle>/` directories remain as fallback
|
|
@@ -124,7 +79,7 @@ async function scanPanSpecs(projectRoot) {
|
|
|
124
79
|
return [];
|
|
125
80
|
}
|
|
126
81
|
return (await Promise.all(names.map(async (name) => {
|
|
127
|
-
const parts =
|
|
82
|
+
const parts = parseXBriefFilename(name);
|
|
128
83
|
if (!parts) return null;
|
|
129
84
|
const path = join(specsDir, name);
|
|
130
85
|
try {
|
|
@@ -152,8 +107,8 @@ async function buildProjectIndex(projectRoot) {
|
|
|
152
107
|
entries.push(entry);
|
|
153
108
|
if (!byIssue.has(entry.issueId)) byIssue.set(entry.issueId, entry);
|
|
154
109
|
}
|
|
155
|
-
for (const lifecycleDir of
|
|
156
|
-
const dirPath =
|
|
110
|
+
for (const lifecycleDir of LEGACY_VBRIEF_LIFECYCLE_DIRS) {
|
|
111
|
+
const dirPath = resolveXBriefDir(projectRoot, lifecycleDir);
|
|
157
112
|
if (!existsSync(dirPath)) continue;
|
|
158
113
|
let names;
|
|
159
114
|
try {
|
|
@@ -162,7 +117,7 @@ async function buildProjectIndex(projectRoot) {
|
|
|
162
117
|
continue;
|
|
163
118
|
}
|
|
164
119
|
for (const name of names) {
|
|
165
|
-
const parts =
|
|
120
|
+
const parts = parseXBriefFilename(name);
|
|
166
121
|
if (!parts || byIssue.has(parts.issueId)) continue;
|
|
167
122
|
const entry = {
|
|
168
123
|
path: join(dirPath, name),
|
|
@@ -189,29 +144,29 @@ async function getOrBuildIndex(projectRoot) {
|
|
|
189
144
|
projectIndexCache.set(projectRoot, fresh);
|
|
190
145
|
return fresh;
|
|
191
146
|
}
|
|
192
|
-
function
|
|
147
|
+
function invalidateXBriefIndex(projectRoot) {
|
|
193
148
|
projectIndexCache.delete(projectRoot);
|
|
194
149
|
}
|
|
195
|
-
var CACHE_TTL_MS, projectIndexCache,
|
|
196
|
-
var
|
|
150
|
+
var CACHE_TTL_MS, projectIndexCache, findXBriefByIssue, readXBriefDocument;
|
|
151
|
+
var init_xbrief_index = __esmMin((() => {
|
|
197
152
|
init_lifecycle();
|
|
198
153
|
init_io();
|
|
199
154
|
init_errors();
|
|
200
155
|
init_types$1();
|
|
201
156
|
CACHE_TTL_MS = 5e3;
|
|
202
157
|
projectIndexCache = /* @__PURE__ */ new Map();
|
|
203
|
-
|
|
158
|
+
findXBriefByIssue = (projectRoot, issueId) => Effect.tryPromise({
|
|
204
159
|
try: async () => {
|
|
205
160
|
const upper = issueId.toUpperCase();
|
|
206
161
|
return (await getOrBuildIndex(projectRoot)).byIssue.get(upper) ?? null;
|
|
207
162
|
},
|
|
208
163
|
catch: (cause) => new FsError({
|
|
209
164
|
path: projectRoot,
|
|
210
|
-
operation: "
|
|
165
|
+
operation: "findXBriefByIssue",
|
|
211
166
|
cause
|
|
212
167
|
})
|
|
213
168
|
});
|
|
214
|
-
|
|
169
|
+
readXBriefDocument = (path) => Effect.gen(function* () {
|
|
215
170
|
const raw = yield* Effect.tryPromise({
|
|
216
171
|
try: () => readFile(path, "utf-8"),
|
|
217
172
|
catch: (cause) => new FsError({
|
|
@@ -220,20 +175,20 @@ var init_vbrief_index = __esmMin((() => {
|
|
|
220
175
|
cause
|
|
221
176
|
})
|
|
222
177
|
});
|
|
223
|
-
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) return yield* Effect.fail(new
|
|
178
|
+
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) return yield* Effect.fail(new XBriefMergeConflictTaggedError({ planPath: path }));
|
|
224
179
|
let parsed;
|
|
225
180
|
try {
|
|
226
|
-
parsed =
|
|
181
|
+
parsed = normalizeXBriefEnvelope(JSON.parse(raw));
|
|
227
182
|
} catch (cause) {
|
|
228
|
-
return yield* Effect.fail(new
|
|
183
|
+
return yield* Effect.fail(new XBriefInvalidFormatError({
|
|
229
184
|
planPath: path,
|
|
230
185
|
reason: `invalid JSON: ${cause.message}`
|
|
231
186
|
}));
|
|
232
187
|
}
|
|
233
188
|
const obj = parsed;
|
|
234
|
-
if (!obj || !obj.
|
|
189
|
+
if (!obj || !obj.xBRIEFInfo || !obj.plan) return yield* Effect.fail(new XBriefInvalidFormatError({
|
|
235
190
|
planPath: path,
|
|
236
|
-
reason: `missing '
|
|
191
|
+
reason: `missing 'xBRIEFInfo' or 'vBRIEFInfo' and/or 'plan' top-level keys`
|
|
237
192
|
}));
|
|
238
193
|
return obj;
|
|
239
194
|
});
|
|
@@ -273,7 +228,7 @@ function ensurePanDirs(projectRoot) {
|
|
|
273
228
|
return paths;
|
|
274
229
|
}).pipe(Effect.provide(NodeFileSystem.layer));
|
|
275
230
|
}
|
|
276
|
-
function
|
|
231
|
+
function mapXBriefPlanStatusToPanSpec(status) {
|
|
277
232
|
if (isPanSpecStatus(status)) return status;
|
|
278
233
|
if (typeof status !== "string") return null;
|
|
279
234
|
switch (status) {
|
|
@@ -286,10 +241,10 @@ function mapVBriefPlanStatusToPanSpec(status) {
|
|
|
286
241
|
}
|
|
287
242
|
}
|
|
288
243
|
function parsePanSpecDocumentFromString(raw, path) {
|
|
289
|
-
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) throw new
|
|
244
|
+
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) throw new XBriefMergeConflictError(path);
|
|
290
245
|
let parsed;
|
|
291
246
|
try {
|
|
292
|
-
parsed =
|
|
247
|
+
parsed = normalizeXBriefEnvelope(JSON.parse(raw));
|
|
293
248
|
} catch (error) {
|
|
294
249
|
throw new Error(`Invalid JSON in pan spec ${path}: ${error.message}`);
|
|
295
250
|
}
|
|
@@ -297,11 +252,15 @@ function parsePanSpecDocumentFromString(raw, path) {
|
|
|
297
252
|
const doc = parsed;
|
|
298
253
|
if (!isPanSpecStatus(doc.status)) {
|
|
299
254
|
const plan = doc.plan;
|
|
300
|
-
const mapped =
|
|
255
|
+
const mapped = mapXBriefPlanStatusToPanSpec(plan?.status);
|
|
301
256
|
if (mapped) doc.status = mapped;
|
|
302
257
|
else throw new Error(`Invalid pan spec format in ${path}: missing valid root status`);
|
|
303
258
|
}
|
|
304
|
-
if (!doc.vBRIEFInfo || !doc.plan) throw new Error(`Invalid
|
|
259
|
+
if (!doc.xBRIEFInfo && !doc.vBRIEFInfo || !doc.plan) throw new Error(`Invalid xBRIEF format in ${path}: missing 'xBRIEFInfo' or legacy 'vBRIEFInfo' and/or 'plan' top-level keys. xBRIEF v0.5-v0.8 requires { "xBRIEFInfo" or legacy "vBRIEFInfo": { "version": "0.5" through "0.8" }, "plan": { ... } }. See docs/XBRIEF.md for the correct format.`);
|
|
260
|
+
if (!doc.xBRIEFInfo && doc.vBRIEFInfo) {
|
|
261
|
+
doc.xBRIEFInfo = doc.vBRIEFInfo;
|
|
262
|
+
delete doc.vBRIEFInfo;
|
|
263
|
+
}
|
|
305
264
|
return doc;
|
|
306
265
|
}
|
|
307
266
|
function readSpec(path) {
|
|
@@ -330,7 +289,7 @@ function writeSpec(path, doc) {
|
|
|
330
289
|
}));
|
|
331
290
|
const fs = yield* FileSystem.FileSystem;
|
|
332
291
|
const tmp = `${path}.tmp`;
|
|
333
|
-
yield* fs.writeFileString(tmp,
|
|
292
|
+
yield* fs.writeFileString(tmp, serializeXBriefDocument(doc)).pipe(Effect.mapError((cause) => new FsError({
|
|
334
293
|
path: tmp,
|
|
335
294
|
operation: "writeFileString",
|
|
336
295
|
cause
|
|
@@ -353,7 +312,7 @@ function writeSpec(path, doc) {
|
|
|
353
312
|
}
|
|
354
313
|
function entryFromFile(specsDir, filename) {
|
|
355
314
|
return Effect.gen(function* () {
|
|
356
|
-
const parts =
|
|
315
|
+
const parts = parseXBriefFilename(filename);
|
|
357
316
|
if (!parts) return null;
|
|
358
317
|
const path = join(specsDir, filename);
|
|
359
318
|
const document = yield* readSpec(path).pipe(Effect.catch((err) => {
|
|
@@ -402,7 +361,9 @@ function findSpecByIssue(projectRoot, issueId) {
|
|
|
402
361
|
cause
|
|
403
362
|
})));
|
|
404
363
|
const upperIssueId = issueId.toUpperCase();
|
|
405
|
-
const matching = filenames.filter((filename) =>
|
|
364
|
+
const matching = filenames.filter((filename) => parseXBriefFilename(filename)?.issueId.toUpperCase() === upperIssueId).sort((a, b) => {
|
|
365
|
+
return Number(!a.endsWith(".xbrief.json")) - Number(!b.endsWith(".xbrief.json")) || a.localeCompare(b);
|
|
366
|
+
});
|
|
406
367
|
for (const filename of matching) {
|
|
407
368
|
const entry = yield* entryFromFile(specsDir, filename);
|
|
408
369
|
if (entry) return entry;
|
|
@@ -414,7 +375,7 @@ function writeSpecForIssue(projectRoot, doc, status, filename) {
|
|
|
414
375
|
return Effect.gen(function* () {
|
|
415
376
|
const paths = yield* ensurePanDirs(projectRoot);
|
|
416
377
|
const specDocument = asPanSpecDocument(doc, status);
|
|
417
|
-
const nextFilename = filename ??
|
|
378
|
+
const nextFilename = filename ?? generateXBriefFilename(doc.plan.id, doc.plan.title);
|
|
418
379
|
const path = join(paths.specsDir, nextFilename);
|
|
419
380
|
yield* writeSpec(path, specDocument);
|
|
420
381
|
queueAutoCommit({
|
|
@@ -428,13 +389,13 @@ function writeSpecForIssue(projectRoot, doc, status, filename) {
|
|
|
428
389
|
operation: "pushSpec",
|
|
429
390
|
cause: new Error(flushed.reason ?? "spec commit was not pushed")
|
|
430
391
|
}));
|
|
431
|
-
|
|
392
|
+
invalidateXBriefIndex(projectRoot);
|
|
432
393
|
return {
|
|
433
394
|
path,
|
|
434
395
|
filename: nextFilename,
|
|
435
396
|
issueId: doc.plan.id,
|
|
436
|
-
slug:
|
|
437
|
-
date:
|
|
397
|
+
slug: parseXBriefFilename(nextFilename)?.slug ?? slugify(doc.plan.title),
|
|
398
|
+
date: parseXBriefFilename(nextFilename)?.date ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
|
|
438
399
|
status,
|
|
439
400
|
document: specDocument
|
|
440
401
|
};
|
|
@@ -464,7 +425,7 @@ function writeSpecDocument(projectRoot, path, doc) {
|
|
|
464
425
|
operation: "pushSpec",
|
|
465
426
|
cause: new Error(flushed.reason ?? "spec commit was not pushed")
|
|
466
427
|
}));
|
|
467
|
-
|
|
428
|
+
invalidateXBriefIndex(projectRoot);
|
|
468
429
|
});
|
|
469
430
|
}
|
|
470
431
|
var init_specs = __esmMin((() => {
|
|
@@ -473,18 +434,18 @@ var init_specs = __esmMin((() => {
|
|
|
473
434
|
init_state_read_home();
|
|
474
435
|
init_io();
|
|
475
436
|
init_lifecycle();
|
|
476
|
-
|
|
437
|
+
init_xbrief_index();
|
|
477
438
|
init_auto_commit();
|
|
478
439
|
init_types$1();
|
|
479
440
|
}));
|
|
480
441
|
//#endregion
|
|
481
|
-
//#region ../../lib/
|
|
442
|
+
//#region ../../lib/xbrief/types.ts
|
|
482
443
|
function subItemsOf(item) {
|
|
483
444
|
return item.items ?? item.subItems ?? [];
|
|
484
445
|
}
|
|
485
|
-
var
|
|
446
|
+
var XBRIEF_INSPECTION_POLICIES;
|
|
486
447
|
var init_types = __esmMin((() => {
|
|
487
|
-
|
|
448
|
+
XBRIEF_INSPECTION_POLICIES = [
|
|
488
449
|
"auto",
|
|
489
450
|
"never",
|
|
490
451
|
"fast",
|
|
@@ -492,25 +453,26 @@ var init_types = __esmMin((() => {
|
|
|
492
453
|
];
|
|
493
454
|
}));
|
|
494
455
|
//#endregion
|
|
495
|
-
//#region ../../lib/
|
|
456
|
+
//#region ../../lib/xbrief/io.ts
|
|
496
457
|
/**
|
|
497
|
-
*
|
|
458
|
+
* xBRIEF File I/O Utilities
|
|
498
459
|
*
|
|
499
|
-
* Single-spec
|
|
500
|
-
*
|
|
501
|
-
* cannot mutate its structure; they
|
|
460
|
+
* Single-spec model (PAN-1124): the canonical xBRIEF spec lives in `specs/`
|
|
461
|
+
* on `overdeck-state` with a `.xbrief.json` filename behind the project state
|
|
462
|
+
* read/write doors. Work and task operations cannot mutate its structure; they
|
|
463
|
+
* may only advance `plan.status` through
|
|
502
464
|
* `updateSpecStatus()` in `pan-dir/specs.ts`. A deliberate return to planning
|
|
503
465
|
* may replace the full document at the same canonical path through
|
|
504
466
|
* `writeSpecDocument()`, preserving stable item IDs so existing progress still
|
|
505
467
|
* applies.
|
|
506
468
|
*
|
|
507
469
|
* Runtime item/subItem status is tracked as a flat `statusOverrides` map in
|
|
508
|
-
* the workspace continue file (`<workspace>/.
|
|
509
|
-
* `readWorkspacePlan()` returns a merged view (
|
|
470
|
+
* the workspace continue file (`<workspace>/.overdeck/continue.json`).
|
|
471
|
+
* `readWorkspacePlan()` returns a merged view (canonical spec + overlay) so
|
|
510
472
|
* callers never need to know about the overlay.
|
|
511
473
|
*
|
|
512
474
|
* `updateItemStatus` and `updateSubItemStatus` write ONLY to the workspace
|
|
513
|
-
* continue file — they cannot mutate the spec
|
|
475
|
+
* continue file — they cannot mutate the canonical spec.
|
|
514
476
|
*/
|
|
515
477
|
/**
|
|
516
478
|
* Synchronous spec lookup that mirrors what `findSpecByIssue` did pre-PAN-1249.
|
|
@@ -533,7 +495,7 @@ function findSpecByIssueSync(projectRoot, issueId) {
|
|
|
533
495
|
}
|
|
534
496
|
filenames.sort();
|
|
535
497
|
for (const filename of filenames) {
|
|
536
|
-
const parts =
|
|
498
|
+
const parts = parseXBriefFilename(filename);
|
|
537
499
|
if (!parts) continue;
|
|
538
500
|
if (parts.issueId.toUpperCase() === upperIssueId) return { path: join(specsDir, filename) };
|
|
539
501
|
}
|
|
@@ -551,7 +513,7 @@ async function findSpecByIssueFromDisk(projectRoot, issueId) {
|
|
|
551
513
|
}
|
|
552
514
|
filenames.sort();
|
|
553
515
|
for (const filename of filenames) {
|
|
554
|
-
const parts =
|
|
516
|
+
const parts = parseXBriefFilename(filename);
|
|
555
517
|
if (!parts) continue;
|
|
556
518
|
if (parts.issueId.toUpperCase() === upperIssueId) return { path: join(specsDir, filename) };
|
|
557
519
|
}
|
|
@@ -570,14 +532,26 @@ function projectRootFromWorkspace(workspacePath) {
|
|
|
570
532
|
return resolve(workspacePath, "..", "..");
|
|
571
533
|
}
|
|
572
534
|
function workspaceDraftPath(workspacePath) {
|
|
573
|
-
return
|
|
535
|
+
return getWorkspacePanPaths(workspacePath).specPath;
|
|
536
|
+
}
|
|
537
|
+
function readableWorkspaceDraftPath(workspacePath) {
|
|
538
|
+
const canonicalPath = workspaceDraftPath(workspacePath);
|
|
539
|
+
if (existsSync(canonicalPath)) return canonicalPath;
|
|
540
|
+
const legacyPath = getLegacyWorkspacePanPaths(workspacePath).specPath;
|
|
541
|
+
return existsSync(legacyPath) ? legacyPath : null;
|
|
574
542
|
}
|
|
575
543
|
function workspaceContinuePath(workspacePath) {
|
|
576
|
-
return
|
|
544
|
+
return getWorkspacePanPaths(workspacePath).continuePath;
|
|
545
|
+
}
|
|
546
|
+
function readableWorkspaceContinuePath(workspacePath) {
|
|
547
|
+
const canonicalPath = workspaceContinuePath(workspacePath);
|
|
548
|
+
if (existsSync(canonicalPath)) return canonicalPath;
|
|
549
|
+
const legacyPath = getLegacyWorkspacePanPaths(workspacePath).continuePath;
|
|
550
|
+
return existsSync(legacyPath) ? legacyPath : canonicalPath;
|
|
577
551
|
}
|
|
578
552
|
function findWorkspaceDraftPlanSync(workspacePath) {
|
|
579
|
-
const path =
|
|
580
|
-
if (!
|
|
553
|
+
const path = readableWorkspaceDraftPath(workspacePath);
|
|
554
|
+
if (!path) return null;
|
|
581
555
|
const issueId = issueIdFromWorkspacePath(workspacePath);
|
|
582
556
|
if (!issueId) return path;
|
|
583
557
|
try {
|
|
@@ -589,7 +563,7 @@ function findWorkspaceDraftPlanSync(workspacePath) {
|
|
|
589
563
|
return path;
|
|
590
564
|
}
|
|
591
565
|
/**
|
|
592
|
-
* Returns the path to this workspace's
|
|
566
|
+
* Returns the path to this workspace's xBRIEF source. The canonical main-side
|
|
593
567
|
* spec wins after promotion; before first promotion, the workspace draft is the
|
|
594
568
|
* only valid source.
|
|
595
569
|
*
|
|
@@ -604,35 +578,31 @@ function findPlanSync(workspacePath) {
|
|
|
604
578
|
const entry = findSpecByIssueSync(projectRootFromWorkspace(workspacePath), issueId);
|
|
605
579
|
return entry ? entry.path : findWorkspaceDraftPlanSync(workspacePath);
|
|
606
580
|
}
|
|
607
|
-
function
|
|
581
|
+
function normalizeXBriefEnvelope(parsed) {
|
|
608
582
|
if (!parsed || typeof parsed !== "object") return parsed;
|
|
609
583
|
const candidate = parsed;
|
|
610
|
-
if ("
|
|
611
|
-
const {
|
|
584
|
+
if ("vBRIEFInfo" in candidate && !("xBRIEFInfo" in candidate)) {
|
|
585
|
+
const { vBRIEFInfo, ...rest } = candidate;
|
|
612
586
|
return {
|
|
613
|
-
|
|
587
|
+
xBRIEFInfo: vBRIEFInfo,
|
|
614
588
|
...rest
|
|
615
589
|
};
|
|
616
590
|
}
|
|
617
591
|
return parsed;
|
|
618
592
|
}
|
|
619
|
-
function
|
|
620
|
-
const
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
...rest
|
|
626
|
-
}, null, 2);
|
|
627
|
-
}
|
|
628
|
-
return JSON.stringify(doc, null, 2);
|
|
593
|
+
function serializeXBriefDocument(doc) {
|
|
594
|
+
const { xBRIEFInfo, vBRIEFInfo, ...rest } = doc;
|
|
595
|
+
return JSON.stringify({
|
|
596
|
+
xBRIEFInfo: xBRIEFInfo ?? vBRIEFInfo,
|
|
597
|
+
...rest
|
|
598
|
+
}, null, 2);
|
|
629
599
|
}
|
|
630
600
|
function readPlanSync(planPath) {
|
|
631
601
|
const raw = readFileSync(planPath, "utf-8");
|
|
632
|
-
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) throw new
|
|
633
|
-
const parsed =
|
|
634
|
-
if (parsed.
|
|
635
|
-
throw new Error(`Invalid
|
|
602
|
+
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) throw new XBriefMergeConflictError(planPath);
|
|
603
|
+
const parsed = normalizeXBriefEnvelope(JSON.parse(raw));
|
|
604
|
+
if (parsed.xBRIEFInfo && parsed.plan) return parsed;
|
|
605
|
+
throw new Error(`Invalid xBRIEF format in ${planPath}: missing 'xBRIEFInfo' or legacy 'vBRIEFInfo' and/or 'plan' top-level keys. xBRIEF v0.5-v0.8 requires { "xBRIEFInfo" or legacy "vBRIEFInfo": { "version": "0.5" through "0.8" }, "plan": { ... } }. See docs/XBRIEF.md for the correct format.`);
|
|
636
606
|
}
|
|
637
607
|
/**
|
|
638
608
|
* Apply statusOverrides from workspace continue.json onto a deep-cloned spec.
|
|
@@ -675,7 +645,7 @@ function readStatusOverridesSync(workspacePath) {
|
|
|
675
645
|
return readIssueRecordSync(project, issueId)?.statusOverrides;
|
|
676
646
|
}
|
|
677
647
|
function readTierOverrides(workspacePath) {
|
|
678
|
-
const path =
|
|
648
|
+
const path = readableWorkspaceContinuePath(workspacePath);
|
|
679
649
|
try {
|
|
680
650
|
const raw = readFileSync(path, "utf-8");
|
|
681
651
|
return JSON.parse(raw).tierOverrides ?? {};
|
|
@@ -685,9 +655,10 @@ function readTierOverrides(workspacePath) {
|
|
|
685
655
|
}
|
|
686
656
|
function recordTierPromotion(workspacePath, itemId, from, to, reason) {
|
|
687
657
|
const path = workspaceContinuePath(workspacePath);
|
|
658
|
+
const readablePath = readableWorkspaceContinuePath(workspacePath);
|
|
688
659
|
let state = {};
|
|
689
660
|
try {
|
|
690
|
-
state = JSON.parse(readFileSync(
|
|
661
|
+
state = JSON.parse(readFileSync(readablePath, "utf-8"));
|
|
691
662
|
} catch {
|
|
692
663
|
state = {};
|
|
693
664
|
}
|
|
@@ -706,14 +677,14 @@ function recordTierPromotion(workspacePath, itemId, from, to, reason) {
|
|
|
706
677
|
}]
|
|
707
678
|
}
|
|
708
679
|
};
|
|
709
|
-
mkdirSync(
|
|
680
|
+
mkdirSync(getWorkspacePanPaths(workspacePath).panDir, { recursive: true });
|
|
710
681
|
writeFileSync(path, JSON.stringify({
|
|
711
682
|
...state,
|
|
712
683
|
tierOverrides: nextOverrides
|
|
713
684
|
}, null, 2), "utf-8");
|
|
714
685
|
}
|
|
715
686
|
/**
|
|
716
|
-
* Reads the
|
|
687
|
+
* Reads the xBRIEF plan for a workspace, returning a merged view with
|
|
717
688
|
* statusOverrides applied from the per-issue record.
|
|
718
689
|
* Returns null if no plan exists on main or locally.
|
|
719
690
|
*/
|
|
@@ -736,20 +707,20 @@ function readWorkspacePlanSync(workspacePath) {
|
|
|
736
707
|
if (overrides && Object.keys(overrides).length > 0) return applyStatusOverrides(doc, overrides);
|
|
737
708
|
return doc;
|
|
738
709
|
}
|
|
739
|
-
var
|
|
710
|
+
var XBriefMergeConflictTaggedError, XBriefInvalidFormatError, XBriefMergeConflictError, PLANNING_FINISHED_STATUSES, readPlan, findWorkspaceDraftPlan, findPlan, readWorkspacePlan, isPlanningComplete;
|
|
740
711
|
var init_io = __esmMin((() => {
|
|
712
|
+
init_continue();
|
|
741
713
|
init_specs();
|
|
742
714
|
init_record();
|
|
743
|
-
init_types$1();
|
|
744
715
|
init_lifecycle();
|
|
745
716
|
init_errors();
|
|
746
717
|
init_types();
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
718
|
+
XBriefMergeConflictTaggedError = class extends Data.TaggedError("XBriefMergeConflictError") {};
|
|
719
|
+
XBriefInvalidFormatError = class extends Data.TaggedError("XBriefInvalidFormatError") {};
|
|
720
|
+
XBriefMergeConflictError = class extends Error {
|
|
750
721
|
constructor(planPath) {
|
|
751
|
-
super(`
|
|
752
|
-
this.name = "
|
|
722
|
+
super(`xBRIEF document at ${planPath} contains unresolved git merge conflict markers. Resolve all <<<<<<</=======/>>>>>>> markers in that file and commit the result before re-requesting review.`);
|
|
723
|
+
this.name = "XBriefMergeConflictError";
|
|
753
724
|
}
|
|
754
725
|
};
|
|
755
726
|
PLANNING_FINISHED_STATUSES = new Set([
|
|
@@ -769,41 +740,46 @@ var init_io = __esmMin((() => {
|
|
|
769
740
|
cause
|
|
770
741
|
})
|
|
771
742
|
});
|
|
772
|
-
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) return yield* Effect.fail(new
|
|
743
|
+
if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) return yield* Effect.fail(new XBriefMergeConflictTaggedError({ planPath }));
|
|
773
744
|
let parsed;
|
|
774
745
|
try {
|
|
775
746
|
parsed = JSON.parse(raw);
|
|
776
747
|
} catch (cause) {
|
|
777
|
-
return yield* Effect.fail(new
|
|
748
|
+
return yield* Effect.fail(new XBriefInvalidFormatError({
|
|
778
749
|
planPath,
|
|
779
750
|
reason: `invalid JSON: ${cause.message}`
|
|
780
751
|
}));
|
|
781
752
|
}
|
|
782
|
-
const obj =
|
|
783
|
-
if (!obj || !obj.
|
|
753
|
+
const obj = normalizeXBriefEnvelope(parsed);
|
|
754
|
+
if (!obj || !obj.xBRIEFInfo || !obj.plan) return yield* Effect.fail(new XBriefInvalidFormatError({
|
|
784
755
|
planPath,
|
|
785
|
-
reason: `missing '
|
|
756
|
+
reason: `missing 'xBRIEFInfo' or 'vBRIEFInfo' and/or 'plan' top-level keys`
|
|
786
757
|
}));
|
|
787
758
|
return obj;
|
|
788
759
|
});
|
|
789
760
|
findWorkspaceDraftPlan = (workspacePath) => Effect.gen(function* () {
|
|
790
|
-
const
|
|
791
|
-
|
|
761
|
+
const paths = [workspaceDraftPath(workspacePath), getLegacyWorkspacePanPaths(workspacePath).specPath];
|
|
762
|
+
let path = null;
|
|
763
|
+
for (const candidate of paths) if (yield* Effect.tryPromise({
|
|
792
764
|
try: async () => {
|
|
793
765
|
try {
|
|
794
|
-
await readFile(
|
|
766
|
+
await readFile(candidate, "utf-8");
|
|
795
767
|
return true;
|
|
796
768
|
} catch (error) {
|
|
797
|
-
if (error
|
|
769
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return false;
|
|
798
770
|
throw error;
|
|
799
771
|
}
|
|
800
772
|
},
|
|
801
773
|
catch: (cause) => new FsError({
|
|
802
|
-
path,
|
|
774
|
+
path: candidate,
|
|
803
775
|
operation: "readFile",
|
|
804
776
|
cause
|
|
805
777
|
})
|
|
806
|
-
}))
|
|
778
|
+
})) {
|
|
779
|
+
path = candidate;
|
|
780
|
+
break;
|
|
781
|
+
}
|
|
782
|
+
if (!path) return null;
|
|
807
783
|
const issueId = issueIdFromWorkspacePath(workspacePath);
|
|
808
784
|
if (!issueId) return path;
|
|
809
785
|
const planIssueId = (yield* readPlan(path).pipe(Effect.orElseSucceed(() => null)))?.plan?.id;
|
|
@@ -851,6 +827,6 @@ var init_io = __esmMin((() => {
|
|
|
851
827
|
});
|
|
852
828
|
}));
|
|
853
829
|
//#endregion
|
|
854
|
-
export {
|
|
830
|
+
export { init_xbrief_index as A, init_specs as C, writeSpecDocument as D, writeSpec as E, getReadableWorkspacePanPaths as F, getWorkspacePanPaths as I, init_continue as L, readXBriefDocument as M, ensureWorkspacePanDir as N, writeSpecForIssue as O, getLegacyWorkspacePanPaths as P, getProjectPanPaths as S, readSpec as T, XBRIEF_INSPECTION_POLICIES as _, findWorkspaceDraftPlan as a, ensurePanDirs as b, mergeRecordStatusOverrides as c, readPlanSync as d, readTierOverrides as f, serializeXBriefDocument as g, recordTierPromotion as h, findPlanSync as i, invalidateXBriefIndex as j, findXBriefByIssue as k, normalizeXBriefEnvelope as l, readWorkspacePlanSync as m, applyStatusOverrides as n, init_io as o, readWorkspacePlan as p, findPlan as r, isPlanningComplete as s, XBriefMergeConflictError as t, readPlan as u, init_types as v, listSpecs as w, findSpecByIssue as x, subItemsOf as y };
|
|
855
831
|
|
|
856
|
-
//# sourceMappingURL=io-
|
|
832
|
+
//# sourceMappingURL=io-B3_AHDfr.js.map
|