@overdeck/desktop 0.45.22 → 0.45.24

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.
Files changed (429) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +2 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
  4. package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
  5. package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
  6. package/server/agent-state-Bc3tzUC8.js +3 -0
  7. package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
  8. package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
  9. package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
  10. package/server/agents-wi9NWzs2.js +3 -0
  11. package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
  12. package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
  13. package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
  14. package/server/assemble-J2ZZ2C15.js +339 -0
  15. package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
  16. package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
  17. package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
  18. package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
  19. package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
  20. package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
  21. package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
  24. package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
  25. package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
  26. package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
  27. package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
  28. package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
  29. package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
  30. package/server/cli-B86rejVV.js +3 -0
  31. package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
  32. package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
  33. package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
  34. package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
  35. package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
  36. package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
  37. package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
  38. package/server/codex-GcHuUF-k.js +3 -0
  39. package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
  40. package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
  41. package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
  42. package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
  43. package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
  44. package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
  45. package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
  46. package/server/context-layers-BrPmE__h.js +4 -0
  47. package/server/context-layers-igZ4FI4_.js +37 -0
  48. package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
  49. package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
  50. package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
  51. package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
  52. package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
  53. package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
  54. package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
  55. package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
  56. package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
  57. package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
  58. package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
  59. package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
  60. package/server/dashboard-db-worker.js +7 -7
  61. package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
  62. package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
  63. package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
  64. package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
  65. package/server/deacon-swarm-C-GwfjJy.js +2 -0
  66. package/server/deacon.js +8 -8
  67. package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
  68. package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
  69. package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
  70. package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
  71. package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
  72. package/server/dist-Bzy0y69j.js +3 -0
  73. package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
  74. package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
  75. package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
  76. package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
  77. package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
  78. package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
  79. package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
  80. package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
  81. package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
  82. package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
  83. package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
  84. package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
  85. package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
  86. package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
  87. package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
  88. package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
  89. package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
  90. package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
  91. package/server/flywheel-DHrgCphM.js +1084 -0
  92. package/server/flywheel-DzGtWnJ1.js +477 -0
  93. package/server/flywheel-SVF02Jpq.js +2 -0
  94. package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
  95. package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
  96. package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
  97. package/server/forge-DXnS_YFH.js +2 -0
  98. package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
  99. package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
  100. package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
  101. package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
  102. package/server/git-utils-D0_yhCgF.js +3 -0
  103. package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
  104. package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
  105. package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
  106. package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
  107. package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
  108. package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
  109. package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
  110. package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
  111. package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
  112. package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
  113. package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
  114. package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
  115. package/server/hume-ccTf4wTX.js +3 -0
  116. package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
  117. package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
  118. package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
  119. package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
  120. package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
  121. package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
  122. package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
  123. package/server/inspect-agent-Brtz0URj.js +2 -0
  124. package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
  125. package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
  126. package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
  127. package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
  128. package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
  129. package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
  130. package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
  131. package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
  132. package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
  133. package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
  134. package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
  135. package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
  136. package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
  137. package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
  138. package/server/lifecycle-io-DPo7x11I.js +3 -0
  139. package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
  140. package/server/lifecycle-yPd___5E.js +121 -0
  141. package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
  142. package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
  143. package/server/memory-fts-worker.js +1 -1
  144. package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
  145. package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
  146. package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
  147. package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
  148. package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
  149. package/server/merge-ops-CR44oU9-.js +2 -0
  150. package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
  151. package/server/merge-set-DJ8-UErs.js +83 -0
  152. package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
  153. package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
  154. package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
  155. package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
  156. package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
  157. package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
  158. package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
  159. package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
  160. package/server/node_modules/.package-lock.json +8 -8
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  162. package/server/node_modules/undici/README.md +5 -0
  163. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  164. package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
  165. package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
  166. package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
  167. package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
  168. package/server/node_modules/undici/docs/docs/index.md +5 -0
  169. package/server/node_modules/undici/lib/core/request.js +1 -1
  170. package/server/node_modules/undici/lib/core/util.js +6 -1
  171. package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
  172. package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
  173. package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
  174. package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
  175. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  176. package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
  177. package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
  178. package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
  179. package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
  180. package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  181. package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
  182. package/server/node_modules/undici/lib/util/cache.js +49 -7
  183. package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
  184. package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
  185. package/server/node_modules/undici/package.json +2 -2
  186. package/server/node_modules/undici/types/client.d.ts +2 -2
  187. package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
  188. package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  189. package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
  190. package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
  191. package/server/package-lock.json +9 -9
  192. package/server/package.json +1 -1
  193. package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
  194. package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
  195. package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
  196. package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
  197. package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
  198. package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
  199. package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
  200. package/server/project-repos-B6GycDh9.js +94 -0
  201. package/server/project-repos-DXKQsc_m.js +3 -0
  202. package/server/projects-vjjcmiN8.js +3 -0
  203. package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
  204. package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
  205. package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
  206. package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
  207. package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
  208. package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
  209. package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
  210. package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
  211. package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
  212. package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
  213. package/server/public/assets/index-CenuJ3Cw.css +1 -0
  214. package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
  215. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
  216. package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
  217. package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
  218. package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
  219. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
  220. package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
  221. package/server/public/index.html +2 -2
  222. package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
  223. package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
  224. package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
  225. package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
  226. package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
  227. package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
  228. package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
  229. package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
  230. package/server/rally-zhhtXuDP.js +3 -0
  231. package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
  232. package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
  233. package/server/rebuild-stack-CFvcBHsS.js +4 -0
  234. package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
  235. package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
  236. package/server/record-CN0pj4_5.js +3 -0
  237. package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
  238. package/server/record-update-dE1Aw83j.js +310 -0
  239. package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
  240. package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
  241. package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
  242. package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
  243. package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
  244. package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
  245. package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
  246. package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
  247. package/server/resume-BFv1PGpA.js +3 -0
  248. package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
  249. package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
  250. package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
  251. package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
  252. package/server/review-status-btEYlaxA.js +3 -0
  253. package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
  254. package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
  255. package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
  256. package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
  257. package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
  258. package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
  259. package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
  260. package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
  261. package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
  262. package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
  263. package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
  264. package/server/server.js +2961 -919
  265. package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
  266. package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
  267. package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
  268. package/server/settings-66A6uvIA.js +2 -0
  269. package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
  270. package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
  271. package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
  272. package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
  273. package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
  274. package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
  275. package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
  276. package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
  277. package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
  278. package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
  279. package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
  280. package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
  281. package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
  282. package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
  283. package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
  284. package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
  285. package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
  286. package/server/specialists-DM6bWjsi.js +3 -0
  287. package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
  288. package/server/specs-C8Wsn2XO.js +3 -0
  289. package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
  290. package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
  291. package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
  292. package/server/stack-health-Bn3o8FBX.js +3 -0
  293. package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
  294. package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
  295. package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
  296. package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
  297. package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
  298. package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
  299. package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
  300. package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
  301. package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
  302. package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
  303. package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
  304. package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
  305. package/server/supervisor/pty-supervisor.js +2 -1
  306. package/server/supervisor/pty-token-x-ea28Us.js +43 -0
  307. package/server/supervisor-FTJAIsAK.js +2 -0
  308. package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
  309. package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
  310. package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
  311. package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
  312. package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
  313. package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
  314. package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
  315. package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
  316. package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
  317. package/server/tmux-B6z7h_vZ.js +3 -0
  318. package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
  319. package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
  320. package/server/token-util-DuPuNriz.js +3 -0
  321. package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
  322. package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
  323. package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
  324. package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
  325. package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
  326. package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
  327. package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
  328. package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
  329. package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
  330. package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
  331. package/server/validate-IfDGkaVR.js +177 -0
  332. package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
  333. package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
  334. package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
  335. package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
  336. package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
  337. package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
  338. package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
  339. package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
  340. package/server/workflows-BQu4RFQ-.js +2 -0
  341. package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
  342. package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
  343. package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
  344. package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
  345. package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
  346. package/server/workspace-manager-CWT55qeI.js +3 -0
  347. package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
  348. package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
  349. package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
  350. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  351. package/sync-sources/agents/pan-merge-agent.md +1 -1
  352. package/sync-sources/agents/pan-planning-agent.md +4 -4
  353. package/sync-sources/agents/pan-work-agent.md +1 -1
  354. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  355. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  356. package/sync-sources/hooks/record-cost-event.js +369 -75
  357. package/sync-sources/hooks/session-start-hook +7 -0
  358. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  359. package/sync-sources/rules/per-bead-durability.md +1 -1
  360. package/sync-sources/rules/prd-authoring.md +1 -1
  361. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  362. package/sync-sources/skills/okf/README.md +11 -3
  363. package/sync-sources/skills/okf/SKILL.md +12 -1
  364. package/sync-sources/skills/okf/docs/USAGE.md +15 -0
  365. package/sync-sources/skills/okf/references/overdeck.md +28 -0
  366. package/sync-sources/skills/pan/SKILL.md +2 -2
  367. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  368. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  369. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  370. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  371. package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
  372. package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
  373. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  374. package/sync-sources/skills/pan-orders/SKILL.md +33 -0
  375. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  376. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  377. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  378. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  379. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  380. package/sync-sources/skills/pan-start/SKILL.md +7 -3
  381. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  382. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  383. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  384. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  385. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  386. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  387. package/sync-sources/skills/plan/SKILL.md +11 -11
  388. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  389. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  390. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  391. package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
  392. package/server/agent-state-Co5Sy2Fw.js +0 -3
  393. package/server/agents-DyHKlq1I.js +0 -3
  394. package/server/cli-BRORS9qY.js +0 -3
  395. package/server/codex-DNyiQDKW.js +0 -3
  396. package/server/context-layers-15gDOk20.js +0 -165
  397. package/server/context-layers-DlQKkHH2.js +0 -4
  398. package/server/deacon-swarm-CV54eNmU.js +0 -2
  399. package/server/dist-j64RzSrQ.js +0 -3
  400. package/server/flywheel-6WHU4O7A.js +0 -207
  401. package/server/flywheel-COR0mbRI.js +0 -522
  402. package/server/flywheel-Ctr5uuvo.js +0 -2
  403. package/server/forge-B0_opi-V.js +0 -2
  404. package/server/git-utils-CsKGnzFA.js +0 -3
  405. package/server/hume-BmhvfVbV.js +0 -3
  406. package/server/inspect-agent-Dq0z1k3H.js +0 -2
  407. package/server/layers-Cp1To4L8.js +0 -93
  408. package/server/lifecycle-io-DmY2qwCn.js +0 -3
  409. package/server/merge-blockers-BYjeXrVN.js +0 -41
  410. package/server/merge-ops-DwWCkSgo.js +0 -2
  411. package/server/merge-set-DiISXcC-.js +0 -139
  412. package/server/projects-BKkwpH6q.js +0 -3
  413. package/server/public/assets/index-Bdc4V9ba.css +0 -1
  414. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
  415. package/server/rally-OSJXdiHK.js +0 -3
  416. package/server/rebuild-stack-CKjJAI8L.js +0 -3
  417. package/server/record-rwK-nKv_.js +0 -3
  418. package/server/record-update-Crz74r-6.js +0 -168
  419. package/server/resume-wZZsWtzz.js +0 -3
  420. package/server/review-status-Bnh-rdkY.js +0 -3
  421. package/server/settings-BlUsVaUc.js +0 -2
  422. package/server/specialists-Dqe6_HE5.js +0 -3
  423. package/server/specs-BhOKBzqk.js +0 -3
  424. package/server/stack-health-Bd06frFn.js +0 -3
  425. package/server/supervisor-COVHrBTg.js +0 -2
  426. package/server/tmux-BAvtac_u.js +0 -3
  427. package/server/token-util-BArZLN6w.js +0 -3
  428. package/server/workflows-C4mR0Reb.js +0 -2
  429. package/server/workspace-manager-B1WOfKvB.js +0 -3
@@ -1,114 +1,69 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Bt as resolveProjectForIssue, Hn as init_projects, It as readIssueRecord, Mt as getProjectConfigFromWorkspacePath, Nt as init_record, Rt as readIssueRecordSync, an as deriveProjectRoot, bn as resolveStateReadHomeSync, cn as init_auto_commit, jr as init_errors, kn as findProjectByPathSync, ln as queueAutoCommit, sn as flushAutoCommits, xr as FsError, yn as init_state_read_home } from "./config-yaml-ig8Nwtiw.js";
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-hraoaQIp.js";
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-DySPNmKN.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-yPd___5E.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/vbrief/lifecycle.ts
10
- /**
11
- * vBRIEF Lifecycle Foundation
12
- *
13
- * Filesystem-as-state lifecycle model for scope vBRIEFs. Each registered
14
- * project gets a `./vbrief/` directory at its repo root with four lifecycle
15
- * subdirectories that act as the source of truth for plan status:
16
- *
17
- * ./vbrief/proposed/ — planning complete, awaiting approval
18
- * ./vbrief/active/ — agent is working on it
19
- * ./vbrief/completed/ — merged/closed, immutable archive
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
- * Format a JS Date (or ISO string / YYYY-MM-DD) as YYYY-MM-DD in UTC.
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
- * Generate the canonical vBRIEF filename for an issue.
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
- date: match[1],
72
- issueId: match[2],
73
- slug: match[3]
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
- * Resolve the absolute path of a specific lifecycle directory under a project's
78
- * vBRIEF root. Pure path math — does not check existence or create dirs.
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
- * Ensure the vBRIEF lifecycle directories exist under the given project root.
87
- * Returns the absolute path to the vBRIEF root. Idempotent.
88
- *
89
- * @param vbriefDirname - Override the default "vbrief" dirname (from projects.yaml `vbrief_dir`).
90
- */
91
- function ensureVBriefDirsSync(projectRoot, vbriefDirname) {
92
- const root = join(projectRoot, vbriefDirname || "vbrief");
93
- mkdirSync(root, { recursive: true });
94
- for (const dir of VBRIEF_LIFECYCLE_DIRS) mkdirSync(join(root, dir), { recursive: true });
95
- return root;
96
- }
97
- var VBRIEF_LIFECYCLE_DIRS, FILENAME_RE;
98
- var init_lifecycle = __esmMin((() => {
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
- VBRIEF_LIFECYCLE_DIRS = [
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/vbrief/vbrief-index.ts
64
+ //#region ../../lib/xbrief/xbrief-index.ts
110
65
  /**
111
- * vBRIEF Index — async, cached issue→vBRIEF lookups for server hot paths.
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 = parseVBriefFilename(name);
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 VBRIEF_LIFECYCLE_DIRS) {
156
- const dirPath = resolveVBriefDir(projectRoot, lifecycleDir);
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 = parseVBriefFilename(name);
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 invalidateVBriefIndex(projectRoot) {
147
+ function invalidateXBriefIndex(projectRoot) {
193
148
  projectIndexCache.delete(projectRoot);
194
149
  }
195
- var CACHE_TTL_MS, projectIndexCache, findVBriefByIssue, readVBriefDocument;
196
- var init_vbrief_index = __esmMin((() => {
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
- findVBriefByIssue = (projectRoot, issueId) => Effect.tryPromise({
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: "findVBriefByIssue",
165
+ operation: "findXBriefByIssue",
211
166
  cause
212
167
  })
213
168
  });
214
- readVBriefDocument = (path) => Effect.gen(function* () {
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 VBriefMergeConflictTaggedError({ planPath: path }));
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 = normalizeVBriefEnvelope(JSON.parse(raw));
181
+ parsed = normalizeXBriefEnvelope(JSON.parse(raw));
227
182
  } catch (cause) {
228
- return yield* Effect.fail(new VBriefInvalidFormatError({
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.vBRIEFInfo || !obj.plan) return yield* Effect.fail(new VBriefInvalidFormatError({
189
+ if (!obj || !obj.xBRIEFInfo || !obj.plan) return yield* Effect.fail(new XBriefInvalidFormatError({
235
190
  planPath: path,
236
- reason: `missing 'vBRIEFInfo' or 'xBRIEFInfo' and/or 'plan' top-level keys`
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 mapVBriefPlanStatusToPanSpec(status) {
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 VBriefMergeConflictError(path);
244
+ if (raw.includes("<<<<<<<") && raw.includes("=======") && raw.includes(">>>>>>>")) throw new XBriefMergeConflictError(path);
290
245
  let parsed;
291
246
  try {
292
- parsed = normalizeVBriefEnvelope(JSON.parse(raw));
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 = mapVBriefPlanStatusToPanSpec(plan?.status);
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 vBRIEF format in ${path}: missing 'vBRIEFInfo' or 'xBRIEFInfo' and/or 'plan' top-level keys. vBRIEF/xBRIEF v0.5-v0.8 requires { "vBRIEFInfo" or "xBRIEFInfo": { "version": "0.5" through "0.8" }, "plan": { ... } }. See docs/VBRIEF.md for the correct format.`);
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, serializeVBriefDocument(doc)).pipe(Effect.mapError((cause) => new FsError({
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 = parseVBriefFilename(filename);
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) => parseVBriefFilename(filename)?.issueId.toUpperCase() === upperIssueId).sort((a, b) => a.localeCompare(b));
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 ?? generateVBriefFilename(doc.plan.id, doc.plan.title);
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
- invalidateVBriefIndex(projectRoot);
392
+ invalidateXBriefIndex(projectRoot);
432
393
  return {
433
394
  path,
434
395
  filename: nextFilename,
435
396
  issueId: doc.plan.id,
436
- slug: parseVBriefFilename(nextFilename)?.slug ?? slugify(doc.plan.title),
437
- date: parseVBriefFilename(nextFilename)?.date ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
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
- invalidateVBriefIndex(projectRoot);
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
- init_vbrief_index();
437
+ init_xbrief_index();
477
438
  init_auto_commit();
478
439
  init_types$1();
479
440
  }));
480
441
  //#endregion
481
- //#region ../../lib/vbrief/types.ts
442
+ //#region ../../lib/xbrief/types.ts
482
443
  function subItemsOf(item) {
483
444
  return item.items ?? item.subItems ?? [];
484
445
  }
485
- var VBRIEF_INSPECTION_POLICIES;
446
+ var XBRIEF_INSPECTION_POLICIES;
486
447
  var init_types = __esmMin((() => {
487
- VBRIEF_INSPECTION_POLICIES = [
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/vbrief/io.ts
456
+ //#region ../../lib/xbrief/io.ts
496
457
  /**
497
- * vBRIEF File I/O Utilities
458
+ * xBRIEF File I/O Utilities
498
459
  *
499
- * Single-spec-on-main model (PAN-1124): the canonical vBRIEF spec lives at
500
- * `<projectRoot>/.pan/specs/<canonical>.vbrief.json`. Work and task operations
501
- * cannot mutate its structure; they may only advance `plan.status` through
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>/.pan/continue.json`).
509
- * `readWorkspacePlan()` returns a merged view (main spec + overlay) so
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 on main.
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 = parseVBriefFilename(filename);
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 = parseVBriefFilename(filename);
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 join(workspacePath, PAN_DIRNAME, PAN_SPEC_FILENAME);
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 join(workspacePath, PAN_DIRNAME, "continue.json");
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 = workspaceDraftPath(workspacePath);
580
- if (!existsSync(path)) return null;
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 vBRIEF source. The canonical main-side
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 normalizeVBriefEnvelope(parsed) {
581
+ function normalizeXBriefEnvelope(parsed) {
608
582
  if (!parsed || typeof parsed !== "object") return parsed;
609
583
  const candidate = parsed;
610
- if ("xBRIEFInfo" in candidate && !("vBRIEFInfo" in candidate)) {
611
- const { xBRIEFInfo, ...rest } = candidate;
584
+ if ("vBRIEFInfo" in candidate && !("xBRIEFInfo" in candidate)) {
585
+ const { vBRIEFInfo, ...rest } = candidate;
612
586
  return {
613
- vBRIEFInfo: xBRIEFInfo,
587
+ xBRIEFInfo: vBRIEFInfo,
614
588
  ...rest
615
589
  };
616
590
  }
617
591
  return parsed;
618
592
  }
619
- function serializeVBriefDocument(doc) {
620
- const version = Number.parseFloat(doc.vBRIEFInfo.version);
621
- if (Number.isFinite(version) && version >= .7) {
622
- const { vBRIEFInfo, ...rest } = doc;
623
- return JSON.stringify({
624
- xBRIEFInfo: vBRIEFInfo,
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 VBriefMergeConflictError(planPath);
633
- const parsed = normalizeVBriefEnvelope(JSON.parse(raw));
634
- if (parsed.vBRIEFInfo && parsed.plan) return parsed;
635
- throw new Error(`Invalid vBRIEF format in ${planPath}: missing 'vBRIEFInfo' or 'xBRIEFInfo' and/or 'plan' top-level keys. vBRIEF/xBRIEF v0.5-v0.8 requires { "vBRIEFInfo" or "xBRIEFInfo": { "version": "0.5" through "0.8" }, "plan": { ... } }. See docs/VBRIEF.md for the correct format.`);
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 = workspaceContinuePath(workspacePath);
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(path, "utf-8"));
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(join(workspacePath, PAN_DIRNAME), { recursive: true });
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 vBRIEF plan for a workspace, returning a merged view with
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 VBriefMergeConflictTaggedError, VBriefInvalidFormatError, VBriefMergeConflictError, PLANNING_FINISHED_STATUSES, readPlan, findWorkspaceDraftPlan, findPlan, readWorkspacePlan, isPlanningComplete;
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
- VBriefMergeConflictTaggedError = class extends Data.TaggedError("VBriefMergeConflictError") {};
748
- VBriefInvalidFormatError = class extends Data.TaggedError("VBriefInvalidFormatError") {};
749
- VBriefMergeConflictError = class extends Error {
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(`plan.vbrief.json at ${planPath} contains unresolved git merge conflict markers. Resolve all <<<<<<</=======/>>>>>>> markers in that file and commit the result before re-requesting review.`);
752
- this.name = "VBriefMergeConflictError";
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 VBriefMergeConflictTaggedError({ planPath }));
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 VBriefInvalidFormatError({
748
+ return yield* Effect.fail(new XBriefInvalidFormatError({
778
749
  planPath,
779
750
  reason: `invalid JSON: ${cause.message}`
780
751
  }));
781
752
  }
782
- const obj = normalizeVBriefEnvelope(parsed);
783
- if (!obj || !obj.vBRIEFInfo || !obj.plan) return yield* Effect.fail(new VBriefInvalidFormatError({
753
+ const obj = normalizeXBriefEnvelope(parsed);
754
+ if (!obj || !obj.xBRIEFInfo || !obj.plan) return yield* Effect.fail(new XBriefInvalidFormatError({
784
755
  planPath,
785
- reason: `missing 'vBRIEFInfo' or 'xBRIEFInfo' and/or 'plan' top-level keys`
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 path = workspaceDraftPath(workspacePath);
791
- if (!(yield* Effect.tryPromise({
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(path, "utf-8");
766
+ await readFile(candidate, "utf-8");
795
767
  return true;
796
768
  } catch (error) {
797
- if (error?.code === "ENOENT") return false;
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
- }))) return null;
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 { init_vbrief_index as A, init_specs as C, writeSpecDocument as D, writeSpec as E, generateVBriefFilename as F, init_lifecycle as I, parseVBriefFilename as L, readVBriefDocument as M, VBRIEF_LIFECYCLE_DIRS as N, writeSpecForIssue as O, ensureVBriefDirsSync as P, resolveVBriefDir as R, getProjectPanPaths as S, readSpec as T, VBRIEF_INSPECTION_POLICIES as _, findWorkspaceDraftPlan as a, ensurePanDirs as b, mergeRecordStatusOverrides as c, readPlanSync as d, readTierOverrides as f, serializeVBriefDocument as g, recordTierPromotion as h, findPlanSync as i, invalidateVBriefIndex as j, findVBriefByIssue as k, normalizeVBriefEnvelope as l, readWorkspacePlanSync as m, applyStatusOverrides as n, init_io as o, readWorkspacePlan as p, findPlan as r, isPlanningComplete as s, VBriefMergeConflictError as t, readPlan as u, init_types as v, listSpecs as w, findSpecByIssue as x, subItemsOf as y, slugify as z };
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-DQR9PMgS.js.map
832
+ //# sourceMappingURL=io-C9kF1wtJ.js.map