panopticon-cli 0.6.4 → 0.6.6

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 (311) hide show
  1. package/README.md +2 -2
  2. package/dist/{agents-DfYify9s.js → agents-CfFDs52G.js} +14 -14
  3. package/dist/{agents-DfYify9s.js.map → agents-CfFDs52G.js.map} +1 -1
  4. package/dist/{agents-BKsVoIc9.js → agents-D_2oRFVf.js} +1 -1
  5. package/dist/{archive-planning-BJrZ3tmN.js → archive-planning-D97ziGec.js} +3 -3
  6. package/dist/{archive-planning-BJrZ3tmN.js.map → archive-planning-D97ziGec.js.map} +1 -1
  7. package/dist/{archive-planning-C3m3hfa5.js → archive-planning-DK90wn9Q.js} +1 -1
  8. package/dist/{browser-Cvdznzc0.js → browser-CX7jXfXX.js} +1 -1
  9. package/dist/{browser-Cvdznzc0.js.map → browser-CX7jXfXX.js.map} +1 -1
  10. package/dist/{clean-planning-DvhZAUv4.js → clean-planning-D_lz4aQq.js} +2 -2
  11. package/dist/{clean-planning-DvhZAUv4.js.map → clean-planning-D_lz4aQq.js.map} +1 -1
  12. package/dist/clean-planning-x1S-JdmO.js +2 -0
  13. package/dist/cli/index.js +291 -760
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/{close-issue-Dr7yZmrr.js → close-issue-CaFE0stN.js} +11 -7
  16. package/dist/close-issue-CaFE0stN.js.map +1 -0
  17. package/dist/close-issue-CjcfZI9s.js +2 -0
  18. package/dist/compact-beads-B0_qE1w3.js +2 -0
  19. package/dist/{compact-beads-BCOtIIRl.js → compact-beads-CjFkteSU.js} +2 -2
  20. package/dist/{compact-beads-BCOtIIRl.js.map → compact-beads-CjFkteSU.js.map} +1 -1
  21. package/dist/{config-CRzMQRgA.js → config-BQNKsi9G.js} +2 -2
  22. package/dist/{config-CRzMQRgA.js.map → config-BQNKsi9G.js.map} +1 -1
  23. package/dist/{config-BYgUzQ21.js → config-agyKgF5C.js} +1 -1
  24. package/dist/{config-yaml-BgOACZAB.js → config-yaml-DGbLSMCa.js} +1 -1
  25. package/dist/{config-yaml-BgOACZAB.js.map → config-yaml-DGbLSMCa.js.map} +1 -1
  26. package/dist/{config-yaml-fdyvyL0S.js → config-yaml-Dqt4FWQH.js} +1 -1
  27. package/dist/dashboard/{acceptance-criteria-e5iiHlRx.js → acceptance-criteria-Dk9hhiYj.js} +1 -1
  28. package/dist/dashboard/{acceptance-criteria-e5iiHlRx.js.map → acceptance-criteria-Dk9hhiYj.js.map} +1 -1
  29. package/dist/dashboard/{agent-enrichment-C67LJBgD.js → agent-enrichment-DdO7ZqjI.js} +11 -7
  30. package/dist/dashboard/agent-enrichment-DdO7ZqjI.js.map +1 -0
  31. package/dist/dashboard/{agent-enrichment-Cq0P1cNZ.js → agent-enrichment-dLeGE1fX.js} +1 -1
  32. package/dist/dashboard/{agents-YyO6t5Xa.js → agents-DCpQQ_W5.js} +14 -14
  33. package/dist/dashboard/{agents-YyO6t5Xa.js.map → agents-DCpQQ_W5.js.map} +1 -1
  34. package/dist/dashboard/{agents-BVBVCyat.js → agents-Dgh2TjSp.js} +1 -1
  35. package/dist/dashboard/{archive-planning-h-hAjk0P.js → archive-planning-BmW9UDTr.js} +3 -3
  36. package/dist/dashboard/{archive-planning-h-hAjk0P.js.map → archive-planning-BmW9UDTr.js.map} +1 -1
  37. package/dist/dashboard/{archive-planning-CScs1MOC.js → archive-planning-C3Ebf9yC.js} +1 -1
  38. package/dist/dashboard/{beads-qNB0yAHV.js → beads-Bv-AdX7G.js} +3 -3
  39. package/dist/dashboard/{beads-qNB0yAHV.js.map → beads-Bv-AdX7G.js.map} +1 -1
  40. package/dist/dashboard/{beads-D_FRedEJ.js → beads-By6-X07V.js} +1 -1
  41. package/dist/dashboard/clean-planning-D60L8rPY.js +2 -0
  42. package/dist/dashboard/{clean-planning-qafw99vY.js → clean-planning-VEJu5suh.js} +2 -2
  43. package/dist/dashboard/{clean-planning-qafw99vY.js.map → clean-planning-VEJu5suh.js.map} +1 -1
  44. package/dist/dashboard/close-issue-C2KeSKKJ.js +2 -0
  45. package/dist/dashboard/{close-issue-DfIggeZD.js → close-issue-DtKdsSTm.js} +11 -7
  46. package/dist/dashboard/close-issue-DtKdsSTm.js.map +1 -0
  47. package/dist/dashboard/compact-beads-C7BN5N11.js +2 -0
  48. package/dist/dashboard/{compact-beads-Dt0qTqsC.js → compact-beads-D8Vt3qyv.js} +2 -2
  49. package/dist/dashboard/{compact-beads-Dt0qTqsC.js.map → compact-beads-D8Vt3qyv.js.map} +1 -1
  50. package/dist/dashboard/{config-CUREjHP7.js → config-CDkGjnwy.js} +2 -2
  51. package/dist/dashboard/{config-CUREjHP7.js.map → config-CDkGjnwy.js.map} +1 -1
  52. package/dist/dashboard/{config-BeI3uy-8.js → config-CTXkBATQ.js} +1 -1
  53. package/dist/dashboard/{database-CozA13Wy.js → database-DhqASALP.js} +1 -1
  54. package/dist/dashboard/{database-C0y0hXBx.js → database-cxmQryoh.js} +2 -2
  55. package/dist/dashboard/{database-C0y0hXBx.js.map → database-cxmQryoh.js.map} +1 -1
  56. package/dist/dashboard/{dist-src-oG2iHzgI.js → dist-src-DTm11oQr.js} +1 -1
  57. package/dist/dashboard/{dist-src-oG2iHzgI.js.map → dist-src-DTm11oQr.js.map} +1 -1
  58. package/dist/dashboard/{event-store-D7kLBd07.js → event-store-VWWUmOfn.js} +1 -1
  59. package/dist/dashboard/{event-store-O9q0Gweh.js → event-store-vSmAA3Zp.js} +9 -4
  60. package/dist/dashboard/event-store-vSmAA3Zp.js.map +1 -0
  61. package/dist/dashboard/{factory-BnLdiQW-.js → factory-C8nhLGHB.js} +3 -3
  62. package/dist/dashboard/{factory-BnLdiQW-.js.map → factory-C8nhLGHB.js.map} +1 -1
  63. package/dist/dashboard/{feedback-writer-DyovUANg.js → feedback-writer-CudSe1WK.js} +2 -2
  64. package/dist/dashboard/{feedback-writer-DyovUANg.js.map → feedback-writer-CudSe1WK.js.map} +1 -1
  65. package/dist/dashboard/{feedback-writer-gSUv_W0h.js → feedback-writer-Wgv1cd1r.js} +1 -1
  66. package/dist/dashboard/{git-utils-BJRioREj.js → git-utils-C1m4SwAe.js} +1 -1
  67. package/dist/dashboard/{git-utils-BJRioREj.js.map → git-utils-C1m4SwAe.js.map} +1 -1
  68. package/dist/dashboard/{git-utils-BtCRddq3.js → git-utils-DQI8EYoj.js} +1 -1
  69. package/dist/dashboard/{github-app-XO-LBUGk.js → github-app-DClWjjHr.js} +1 -1
  70. package/dist/dashboard/{github-app-XO-LBUGk.js.map → github-app-DClWjjHr.js.map} +1 -1
  71. package/dist/dashboard/{health-events-db-584nYgJB.js → health-events-db-BMXQfInV.js} +1 -1
  72. package/dist/dashboard/{health-events-db-B3ChzN65.js → health-events-db-Do4NrOhC.js} +2 -2
  73. package/dist/dashboard/{health-events-db-B3ChzN65.js.map → health-events-db-Do4NrOhC.js.map} +1 -1
  74. package/dist/dashboard/{hooks-CKhs3N68.js → hooks-CB4T47NC.js} +1 -1
  75. package/dist/dashboard/{hooks-CErbP8Oq.js → hooks-CjqXOlNb.js} +2 -2
  76. package/dist/dashboard/{hooks-CErbP8Oq.js.map → hooks-CjqXOlNb.js.map} +1 -1
  77. package/dist/dashboard/hume-CA2pftu_.js +3 -0
  78. package/dist/dashboard/{hume-CX_U3Qha.js → hume-JsAlMOJC.js} +2 -2
  79. package/dist/dashboard/{hume-CX_U3Qha.js.map → hume-JsAlMOJC.js.map} +1 -1
  80. package/dist/dashboard/{inspect-agent-B57kGDUV.js → inspect-agent-7eour7EA.js} +3 -3
  81. package/dist/dashboard/{inspect-agent-B57kGDUV.js.map → inspect-agent-7eour7EA.js.map} +1 -1
  82. package/dist/dashboard/{io-yGovuG4U.js → io-CWlFW78i.js} +1 -1
  83. package/dist/dashboard/{io-AJg-mzFi.js → io-DKS6359z.js} +1 -1
  84. package/dist/dashboard/{io-AJg-mzFi.js.map → io-DKS6359z.js.map} +1 -1
  85. package/dist/dashboard/issue-id-vwYJdsf8.js +62 -0
  86. package/dist/dashboard/issue-id-vwYJdsf8.js.map +1 -0
  87. package/dist/dashboard/{issue-service-singleton-DQK42EqH.js → issue-service-singleton-Co__-6kL.js} +1 -1
  88. package/dist/dashboard/{issue-service-singleton-sb2HkB9f.js → issue-service-singleton-Wv4xBm3y.js} +7 -7
  89. package/dist/dashboard/{issue-service-singleton-sb2HkB9f.js.map → issue-service-singleton-Wv4xBm3y.js.map} +1 -1
  90. package/dist/dashboard/{label-cleanup-CZEsbtq9.js → label-cleanup-nVKTmIIW.js} +7 -4
  91. package/dist/dashboard/label-cleanup-nVKTmIIW.js.map +1 -0
  92. package/dist/dashboard/lifecycle-BcUmtkR4.js +7 -0
  93. package/dist/dashboard/{merge-agent-GLtMEsTu.js → merge-agent-CGN3TT0a.js} +1 -1
  94. package/dist/dashboard/{merge-agent-twroFuAh.js → merge-agent-yudQOPZc.js} +148 -46
  95. package/dist/dashboard/merge-agent-yudQOPZc.js.map +1 -0
  96. package/dist/dashboard/{paths-COdEvoXR.js → paths-BDyJ7BiV.js} +19 -2
  97. package/dist/dashboard/{paths-COdEvoXR.js.map → paths-BDyJ7BiV.js.map} +1 -1
  98. package/dist/dashboard/{pipeline-notifier-DM5AHG5Q.js → pipeline-notifier-CCSN-jar.js} +1 -1
  99. package/dist/dashboard/{pipeline-notifier-DM5AHG5Q.js.map → pipeline-notifier-CCSN-jar.js.map} +1 -1
  100. package/dist/dashboard/{plan-utils-BkCIhn3B.js → plan-utils-Bkcsqr_s.js} +3 -3
  101. package/dist/dashboard/{plan-utils-BkCIhn3B.js.map → plan-utils-Bkcsqr_s.js.map} +1 -1
  102. package/dist/dashboard/{prd-draft-D09Afalc.js → prd-draft-BD8oMkZ1.js} +2 -2
  103. package/dist/dashboard/{prd-draft-D09Afalc.js.map → prd-draft-BD8oMkZ1.js.map} +1 -1
  104. package/dist/dashboard/{projection-cache-DQ9zegkK.js → projection-cache-C0EL8s8h.js} +1 -1
  105. package/dist/dashboard/{projection-cache-DQ9zegkK.js.map → projection-cache-C0EL8s8h.js.map} +1 -1
  106. package/dist/dashboard/{projects-DyT3vSy-.js → projects-C5ozxjwP.js} +1 -1
  107. package/dist/dashboard/{projects-Cq3TWdPS.js → projects-CFVl4oHn.js} +25 -13
  108. package/dist/dashboard/projects-CFVl4oHn.js.map +1 -0
  109. package/dist/dashboard/{providers-Ck2sQd_F.js → providers-B5Y4H2Mg.js} +4 -4
  110. package/dist/dashboard/providers-B5Y4H2Mg.js.map +1 -0
  111. package/dist/dashboard/{providers-DVQnDekG.js → providers-csVZVPkE.js} +1 -1
  112. package/dist/dashboard/public/assets/{dist-CCJbQrSB.js → dist-BaQPC-c6.js} +1 -1
  113. package/dist/dashboard/public/assets/index-ByLmYGhW.js +212 -0
  114. package/dist/dashboard/public/assets/index-OEEbThNN.css +1 -0
  115. package/dist/dashboard/public/index.html +2 -2
  116. package/dist/dashboard/rally-6McpKKRa.js +3 -0
  117. package/dist/dashboard/{rally-Cwuae-4C.js → rally-YjFRxIiC.js} +2 -2
  118. package/dist/dashboard/{rally-Cwuae-4C.js.map → rally-YjFRxIiC.js.map} +1 -1
  119. package/dist/dashboard/{rally-api-DSUxm7EO.js → rally-api-C0WqCSkT.js} +1 -1
  120. package/dist/dashboard/{rally-api-DSUxm7EO.js.map → rally-api-C0WqCSkT.js.map} +1 -1
  121. package/dist/dashboard/{rally-api-CEH5KZi4.js → rally-api-DNttdCW4.js} +1 -1
  122. package/dist/dashboard/{remote-BHTTMpJJ.js → remote-Cigqjj3f.js} +2 -2
  123. package/dist/dashboard/{remote-BXo_iIku.js → remote-ObpNZ7hF.js} +2 -2
  124. package/dist/dashboard/{remote-BXo_iIku.js.map → remote-ObpNZ7hF.js.map} +1 -1
  125. package/dist/dashboard/{remote-agents-CTKVhFFY.js → remote-agents-Bf3GuM7t.js} +1 -1
  126. package/dist/dashboard/{remote-agents-C0_0LLNd.js → remote-agents-DFyjT1Le.js} +1 -1
  127. package/dist/dashboard/{remote-agents-C0_0LLNd.js.map → remote-agents-DFyjT1Le.js.map} +1 -1
  128. package/dist/dashboard/{review-status-CK3eBGyb.js → review-status-BtXqWBhS.js} +1 -1
  129. package/dist/dashboard/{review-status-CV55Tl-n.js → review-status-Bymwzh2i.js} +44 -4
  130. package/dist/dashboard/{review-status-CV55Tl-n.js.map → review-status-Bymwzh2i.js.map} +1 -1
  131. package/dist/dashboard/server.js +565 -265
  132. package/dist/dashboard/server.js.map +1 -1
  133. package/dist/dashboard/{settings-CuHV-wcv.js → settings-BHlDG7TK.js} +2 -2
  134. package/dist/dashboard/settings-BHlDG7TK.js.map +1 -0
  135. package/dist/dashboard/settings-XWvDcj-D.js +2 -0
  136. package/dist/dashboard/{shadow-engineering-BUeZunaE.js → shadow-engineering-lIn1W_95.js} +1 -1
  137. package/dist/dashboard/{shadow-engineering-BUeZunaE.js.map → shadow-engineering-lIn1W_95.js.map} +1 -1
  138. package/dist/dashboard/{shadow-state-DHQ-kASN.js → shadow-state-BIexcxkv.js} +1 -1
  139. package/dist/dashboard/{shadow-state-DHQ-kASN.js.map → shadow-state-BIexcxkv.js.map} +1 -1
  140. package/dist/dashboard/{spawn-planning-session-8FFAqLdK.js → spawn-planning-session-33Jf-d5T.js} +6 -6
  141. package/dist/dashboard/{spawn-planning-session-8FFAqLdK.js.map → spawn-planning-session-33Jf-d5T.js.map} +1 -1
  142. package/dist/dashboard/{spawn-planning-session-U0Lqpjen.js → spawn-planning-session-D5hrVdWM.js} +1 -1
  143. package/dist/dashboard/{specialist-context-ColzlmGE.js → specialist-context-DGukHSn8.js} +6 -6
  144. package/dist/dashboard/{specialist-context-ColzlmGE.js.map → specialist-context-DGukHSn8.js.map} +1 -1
  145. package/dist/dashboard/{specialist-logs-BhmDpFIq.js → specialist-logs-CIw4qfTy.js} +1 -1
  146. package/dist/dashboard/{specialists-C6s3U6tX.js → specialists-B_zrayaP.js} +37 -36
  147. package/dist/dashboard/specialists-B_zrayaP.js.map +1 -0
  148. package/dist/dashboard/{specialists-Cny632-T.js → specialists-Cp-PgspS.js} +1 -1
  149. package/dist/dashboard/{test-agent-queue-tqI4VDsu.js → test-agent-queue-ypF_ecHo.js} +4 -4
  150. package/dist/dashboard/{test-agent-queue-tqI4VDsu.js.map → test-agent-queue-ypF_ecHo.js.map} +1 -1
  151. package/dist/dashboard/{tldr-daemon-BNFyS7W_.js → tldr-daemon-B_oLRD8z.js} +2 -2
  152. package/dist/dashboard/{tldr-daemon-BNFyS7W_.js.map → tldr-daemon-B_oLRD8z.js.map} +1 -1
  153. package/dist/dashboard/{tldr-daemon-A6JqC59u.js → tldr-daemon-Cfs0bXTi.js} +1 -1
  154. package/dist/dashboard/{tmux-DYGAVJfb.js → tmux-BzxdKItf.js} +1 -1
  155. package/dist/dashboard/{tmux-IlN1Slv-.js → tmux-LwG0tHhU.js} +2 -2
  156. package/dist/dashboard/{tmux-IlN1Slv-.js.map → tmux-LwG0tHhU.js.map} +1 -1
  157. package/dist/dashboard/{tracker-config-BzNLnmcE.js → tracker-config-BP59uH4V.js} +1 -1
  158. package/dist/dashboard/{tracker-config-CNM_5rEf.js → tracker-config-e7ph1QqT.js} +2 -2
  159. package/dist/dashboard/{tracker-config-CNM_5rEf.js.map → tracker-config-e7ph1QqT.js.map} +1 -1
  160. package/dist/dashboard/{tunnel-D2BkwU7k.js → tunnel-0RzzuXPf.js} +1 -1
  161. package/dist/dashboard/{tunnel-Dub2hiAA.js → tunnel-DldbBPWL.js} +2 -2
  162. package/dist/dashboard/{tunnel-Dub2hiAA.js.map → tunnel-DldbBPWL.js.map} +1 -1
  163. package/dist/dashboard/{types-CWA-o4UN.js → types-RKZjGE5N.js} +1 -1
  164. package/dist/dashboard/{types-CWA-o4UN.js.map → types-RKZjGE5N.js.map} +1 -1
  165. package/dist/dashboard/{vtt-parser-BAXygRf0.js → vtt-parser-99vFekRQ.js} +1 -1
  166. package/dist/dashboard/{vtt-parser-BAXygRf0.js.map → vtt-parser-99vFekRQ.js.map} +1 -1
  167. package/dist/dashboard/{work-agent-prompt-JYq_OugP.js → work-agent-prompt-fCg67nyo.js} +65 -10
  168. package/dist/dashboard/{work-agent-prompt-JYq_OugP.js.map → work-agent-prompt-fCg67nyo.js.map} +1 -1
  169. package/dist/dashboard/{work-type-router-Cxp8_ur2.js → work-type-router-CWVW2Wk_.js} +1 -1
  170. package/dist/dashboard/{work-type-router-Cxp8_ur2.js.map → work-type-router-CWVW2Wk_.js.map} +1 -1
  171. package/dist/dashboard/{work-type-router-Com2amST.js → work-type-router-Di5gCQwh.js} +1 -1
  172. package/dist/dashboard/{workflows-N1UTipYl.js → workflows-BSMipN07.js} +35 -17
  173. package/dist/dashboard/workflows-BSMipN07.js.map +1 -0
  174. package/dist/dashboard/workflows-DaYWQIS2.js +2 -0
  175. package/dist/dashboard/{workspace-config-cmp5_ipD.js → workspace-config-DVDR-Ukh.js} +1 -1
  176. package/dist/dashboard/workspace-config-DVDR-Ukh.js.map +1 -0
  177. package/dist/dashboard/{workspace-manager-CjpWPgzL.js → workspace-manager-BYfzs_t2.js} +1 -1
  178. package/dist/dashboard/{workspace-manager-D_y9ZmW_.js → workspace-manager-C7OfT62A.js} +44 -24
  179. package/dist/dashboard/workspace-manager-C7OfT62A.js.map +1 -0
  180. package/dist/{dns-BKzHm-2q.js → dns-D_aKQJjb.js} +1 -1
  181. package/dist/{dns-DZwOWvVO.js → dns-Yxq4NNS7.js} +1 -1
  182. package/dist/{dns-DZwOWvVO.js.map → dns-Yxq4NNS7.js.map} +1 -1
  183. package/dist/{factory-DFu3IT4r.js → factory-BRBGw6OB.js} +1 -1
  184. package/dist/{factory-DfzczxN1.js → factory-DzsOiZVc.js} +3 -3
  185. package/dist/{factory-DfzczxN1.js.map → factory-DzsOiZVc.js.map} +1 -1
  186. package/dist/{feedback-writer-CwdnOkPO.js → feedback-writer-ygXN5F9N.js} +2 -2
  187. package/dist/{feedback-writer-CwdnOkPO.js.map → feedback-writer-ygXN5F9N.js.map} +1 -1
  188. package/dist/{github-app-CHKwxOeQ.js → github-app-DykduJ0X.js} +1 -1
  189. package/dist/{github-app-CHKwxOeQ.js.map → github-app-DykduJ0X.js.map} +1 -1
  190. package/dist/hume-9nv1VmMV.js +3 -0
  191. package/dist/{hume-DnV-tDsh.js → hume-DoCbph2h.js} +2 -2
  192. package/dist/{hume-DnV-tDsh.js.map → hume-DoCbph2h.js.map} +1 -1
  193. package/dist/index.d.ts +17 -2
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +8 -7
  196. package/dist/issue-id-CAcekoIw.js +62 -0
  197. package/dist/issue-id-CAcekoIw.js.map +1 -0
  198. package/dist/{label-cleanup-31ElPqqv.js → label-cleanup-C8R9Rspn.js} +7 -4
  199. package/dist/label-cleanup-C8R9Rspn.js.map +1 -0
  200. package/dist/{manifest-DL0oDbpv.js → manifest-B4ghOD-V.js} +1 -1
  201. package/dist/{manifest-DL0oDbpv.js.map → manifest-B4ghOD-V.js.map} +1 -1
  202. package/dist/{merge-agent-VQH9z9t8.js → merge-agent-DlUiUanN.js} +86 -33
  203. package/dist/merge-agent-DlUiUanN.js.map +1 -0
  204. package/dist/{paths-lMaxrYtT.js → paths-CDJ_HsbN.js} +19 -2
  205. package/dist/{paths-lMaxrYtT.js.map → paths-CDJ_HsbN.js.map} +1 -1
  206. package/dist/{pipeline-notifier-OJ-d3Y60.js → pipeline-notifier-XgDdCdvT.js} +1 -1
  207. package/dist/{pipeline-notifier-OJ-d3Y60.js.map → pipeline-notifier-XgDdCdvT.js.map} +1 -1
  208. package/dist/{projects-CvLepaxC.js → projects-Bk-5QhFQ.js} +25 -13
  209. package/dist/projects-Bk-5QhFQ.js.map +1 -0
  210. package/dist/{projects-DMWmPeIU.js → projects-DhU7rAVN.js} +1 -1
  211. package/dist/{providers-DcCPZ5K4.js → providers-DSU1vfQF.js} +4 -4
  212. package/dist/providers-DSU1vfQF.js.map +1 -0
  213. package/dist/rally-DdPvGa-w.js +3 -0
  214. package/dist/{rally-uUUZXp1h.js → rally-Dy00NElU.js} +1 -1
  215. package/dist/{rally-uUUZXp1h.js.map → rally-Dy00NElU.js.map} +1 -1
  216. package/dist/{remote-CkLBqLJc.js → remote-CYiOJg0q.js} +2 -2
  217. package/dist/{remote-CkLBqLJc.js.map → remote-CYiOJg0q.js.map} +1 -1
  218. package/dist/{remote-agents-C5Bd2fgt.js → remote-agents-CZXrUF4f.js} +1 -1
  219. package/dist/{remote-agents-C5Bd2fgt.js.map → remote-agents-CZXrUF4f.js.map} +1 -1
  220. package/dist/{remote-agents-BTzD-wMQ.js → remote-agents-ycHHVsgf.js} +1 -1
  221. package/dist/{remote-workspace-Dxghqiti.js → remote-workspace-CA33UuVI.js} +4 -4
  222. package/dist/{remote-workspace-Dxghqiti.js.map → remote-workspace-CA33UuVI.js.map} +1 -1
  223. package/dist/{review-status-2TdtHNcs.js → review-status-D6H2WOw8.js} +1 -1
  224. package/dist/{review-status-Bm1bWNEa.js → review-status-DEDvCKMP.js} +44 -4
  225. package/dist/{review-status-Bm1bWNEa.js.map → review-status-DEDvCKMP.js.map} +1 -1
  226. package/dist/{tracker-C_62ukEq.js → settings-BcWPTrua.js} +7 -199
  227. package/dist/settings-BcWPTrua.js.map +1 -0
  228. package/dist/shadow-state-BZzxfEGw.js +2 -0
  229. package/dist/{shadow-state-CFFHf05M.js → shadow-state-CE3dQfll.js} +1 -1
  230. package/dist/{shadow-state-CFFHf05M.js.map → shadow-state-CE3dQfll.js.map} +1 -1
  231. package/dist/{specialist-context-BdNFsfMG.js → specialist-context-BAUWL1Fl.js} +6 -6
  232. package/dist/{specialist-context-BdNFsfMG.js.map → specialist-context-BAUWL1Fl.js.map} +1 -1
  233. package/dist/{specialist-logs-CLztE_bE.js → specialist-logs-DQKKQV9B.js} +1 -1
  234. package/dist/{specialists-aUoUVWsN.js → specialists-Bfb9ATzw.js} +1 -1
  235. package/dist/{specialists-DEKqgkxp.js → specialists-D7Kj5o6s.js} +35 -34
  236. package/dist/specialists-D7Kj5o6s.js.map +1 -0
  237. package/dist/sync-DMfgd389.js +693 -0
  238. package/dist/sync-DMfgd389.js.map +1 -0
  239. package/dist/sync-TL6y-8K6.js +2 -0
  240. package/dist/{tldr-daemon-BCEFPItr.js → tldr-daemon-CFx4LXAl.js} +2 -2
  241. package/dist/{tldr-daemon-BCEFPItr.js.map → tldr-daemon-CFx4LXAl.js.map} +1 -1
  242. package/dist/{tldr-daemon-xBAx4cBE.js → tldr-daemon-D_EooADG.js} +1 -1
  243. package/dist/{tmux-DN6H886Y.js → tmux-CBtui_Cl.js} +1 -1
  244. package/dist/{tmux-CKdNxxJx.js → tmux-D6Ah4I8z.js} +2 -2
  245. package/dist/{tmux-CKdNxxJx.js.map → tmux-D6Ah4I8z.js.map} +1 -1
  246. package/dist/tracker-BhYYvU3p.js +198 -0
  247. package/dist/tracker-BhYYvU3p.js.map +1 -0
  248. package/dist/{tracker-utils-CVU2W1sX.js → tracker-utils-ChQyut8w.js} +34 -12
  249. package/dist/tracker-utils-ChQyut8w.js.map +1 -0
  250. package/dist/{traefik-DHgBoWXX.js → traefik-C80EbDu_.js} +4 -4
  251. package/dist/{traefik-DHgBoWXX.js.map → traefik-C80EbDu_.js.map} +1 -1
  252. package/dist/{traefik-BR-edbZv.js → traefik-CgHl7Bge.js} +1 -1
  253. package/dist/{tunnel-BZO9Q5oe.js → tunnel-DXOJ1wMM.js} +1 -1
  254. package/dist/{tunnel-Bl1qNSyQ.js → tunnel-DzXEPwIc.js} +2 -2
  255. package/dist/{tunnel-Bl1qNSyQ.js.map → tunnel-DzXEPwIc.js.map} +1 -1
  256. package/dist/{types-DewGdaIP.js → types-BhJj1SP1.js} +1 -1
  257. package/dist/{types-DewGdaIP.js.map → types-BhJj1SP1.js.map} +1 -1
  258. package/dist/{work-type-router-CS2BB1vS.js → work-type-router-CHjciPyS.js} +3 -3
  259. package/dist/{work-type-router-CS2BB1vS.js.map → work-type-router-CHjciPyS.js.map} +1 -1
  260. package/dist/{workspace-config-CNXOpKuj.js → workspace-config-fUafvYMp.js} +1 -1
  261. package/dist/workspace-config-fUafvYMp.js.map +1 -0
  262. package/dist/workspace-manager-B9jS4Dsq.js +3 -0
  263. package/dist/{workspace-manager-CncdZkIy.js → workspace-manager-DuLhnzJV.js} +112 -27
  264. package/dist/workspace-manager-DuLhnzJV.js.map +1 -0
  265. package/package.json +2 -1
  266. package/scripts/post-merge-deploy.sh +25 -5
  267. package/scripts/record-cost-event.js +57 -7
  268. package/scripts/record-cost-event.js.map +1 -1
  269. package/skills/pan-help/SKILL.md +1 -1
  270. package/skills/pan-sync/SKILL.md +6 -6
  271. package/skills/workspace-add-repo/skill.md +46 -0
  272. package/templates/claude-md/sections/warnings.md +15 -2
  273. package/dist/clean-planning-sZXvy3Y5.js +0 -2
  274. package/dist/close-issue-Dml437qV.js +0 -2
  275. package/dist/close-issue-Dr7yZmrr.js.map +0 -1
  276. package/dist/compact-beads-iu218JcO.js +0 -2
  277. package/dist/dashboard/agent-enrichment-C67LJBgD.js.map +0 -1
  278. package/dist/dashboard/clean-planning-DCu3cOTu.js +0 -2
  279. package/dist/dashboard/close-issue-DfIggeZD.js.map +0 -1
  280. package/dist/dashboard/close-issue-DwdwYtar.js +0 -2
  281. package/dist/dashboard/compact-beads-DXY2fK2s.js +0 -2
  282. package/dist/dashboard/event-store-O9q0Gweh.js.map +0 -1
  283. package/dist/dashboard/hume-MZndNDVU.js +0 -3
  284. package/dist/dashboard/label-cleanup-CZEsbtq9.js.map +0 -1
  285. package/dist/dashboard/lifecycle-ZTYdrr2O.js +0 -7
  286. package/dist/dashboard/merge-agent-twroFuAh.js.map +0 -1
  287. package/dist/dashboard/projects-Cq3TWdPS.js.map +0 -1
  288. package/dist/dashboard/providers-Ck2sQd_F.js.map +0 -1
  289. package/dist/dashboard/public/assets/index-CpSmB2ts.css +0 -1
  290. package/dist/dashboard/public/assets/index-yarWhi0M.js +0 -214
  291. package/dist/dashboard/rally-CQ1OBJrJ.js +0 -3
  292. package/dist/dashboard/settings-CuHV-wcv.js.map +0 -1
  293. package/dist/dashboard/settings-DMeGBRsk.js +0 -2
  294. package/dist/dashboard/specialists-C6s3U6tX.js.map +0 -1
  295. package/dist/dashboard/workflows-B2ARUpOa.js +0 -2
  296. package/dist/dashboard/workflows-N1UTipYl.js.map +0 -1
  297. package/dist/dashboard/workspace-config-cmp5_ipD.js.map +0 -1
  298. package/dist/dashboard/workspace-manager-D_y9ZmW_.js.map +0 -1
  299. package/dist/hume-BjmwmJ9E.js +0 -3
  300. package/dist/label-cleanup-31ElPqqv.js.map +0 -1
  301. package/dist/merge-agent-VQH9z9t8.js.map +0 -1
  302. package/dist/projects-CvLepaxC.js.map +0 -1
  303. package/dist/providers-DcCPZ5K4.js.map +0 -1
  304. package/dist/rally-DR9x8--6.js +0 -3
  305. package/dist/shadow-state-p3jpGRPJ.js +0 -2
  306. package/dist/specialists-DEKqgkxp.js.map +0 -1
  307. package/dist/tracker-C_62ukEq.js.map +0 -1
  308. package/dist/tracker-utils-CVU2W1sX.js.map +0 -1
  309. package/dist/workspace-config-CNXOpKuj.js.map +0 -1
  310. package/dist/workspace-manager-CncdZkIy.js.map +0 -1
  311. package/dist/workspace-manager-Cx0r2Jnv.js +0 -3
@@ -0,0 +1,693 @@
1
+ import { G as init_paths, K as isDevMode, R as SYNC_TARGET, b as PANOPTICON_HOME } from "./paths-CDJ_HsbN.js";
2
+ import { a as init_config, i as getDevrootPath, o as loadConfig } from "./config-BQNKsi9G.js";
3
+ import { d as migrateStalePersonalContent, f as planHooksSync, g as syncStatusline, h as syncHooks, l as executeSync, m as refreshCache, o as loadSettings, p as planSync, v as createBackup } from "./settings-BcWPTrua.js";
4
+ import { h as listProjects, p as init_projects } from "./projects-Bk-5QhFQ.js";
5
+ import { a as migratePanopticonToPan, i as init_workspace_manager } from "./workspace-manager-DuLhnzJV.js";
6
+ import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, renameSync, statSync, symlinkSync, unlinkSync, writeFileSync } from "fs";
7
+ import { dirname, join } from "path";
8
+ import { homedir } from "os";
9
+ import chalk from "chalk";
10
+ import { fileURLToPath } from "url";
11
+ import ora from "ora";
12
+ import { execSync } from "child_process";
13
+ import yaml from "js-yaml";
14
+ //#region src/lib/config-migration.ts
15
+ /**
16
+ * Configuration Migration
17
+ *
18
+ * Migrates from legacy settings.json format to new config.yaml format.
19
+ * Legacy presets are no longer supported - all selection is now smart/capability-based.
20
+ */
21
+ /** Path to legacy settings file */
22
+ const LEGACY_SETTINGS_PATH = join(homedir(), ".panopticon", "settings.json");
23
+ /** Path to new config file */
24
+ const NEW_CONFIG_PATH = join(homedir(), ".panopticon", "config.yaml");
25
+ /** Path to backup of legacy settings */
26
+ const BACKUP_SETTINGS_PATH = join(homedir(), ".panopticon", "settings.json.backup");
27
+ /**
28
+ * Check if migration is needed
29
+ * Returns true if settings.json exists and config.yaml doesn't
30
+ */
31
+ function needsMigration() {
32
+ return existsSync(LEGACY_SETTINGS_PATH) && !existsSync(NEW_CONFIG_PATH);
33
+ }
34
+ /**
35
+ * Check if legacy settings exist (even if already migrated)
36
+ */
37
+ function hasLegacySettings() {
38
+ return existsSync(LEGACY_SETTINGS_PATH);
39
+ }
40
+ /**
41
+ * Determine which providers are enabled based on API keys
42
+ */
43
+ function detectEnabledProviders(settings) {
44
+ return {
45
+ anthropic: true,
46
+ openai: !!settings.api_keys.openai,
47
+ google: !!settings.api_keys.google,
48
+ zai: !!settings.api_keys.zai,
49
+ kimi: false
50
+ };
51
+ }
52
+ /**
53
+ * Convert legacy settings.json to new config.yaml format
54
+ */
55
+ function convertToYamlConfig(settings) {
56
+ return {
57
+ models: {
58
+ providers: detectEnabledProviders(settings),
59
+ overrides: {},
60
+ gemini_thinking_level: 3
61
+ },
62
+ api_keys: settings.api_keys
63
+ };
64
+ }
65
+ function migrateConfig(options = {}) {
66
+ const { backup = true, deleteLegacy = false, dryRun = false } = options;
67
+ try {
68
+ if (!needsMigration()) {
69
+ if (existsSync(NEW_CONFIG_PATH)) return {
70
+ success: true,
71
+ overridesCount: 0,
72
+ providersEnabled: ["anthropic"],
73
+ message: "Config already migrated (config.yaml exists)"
74
+ };
75
+ return {
76
+ success: false,
77
+ overridesCount: 0,
78
+ providersEnabled: [],
79
+ message: "No legacy settings.json found to migrate"
80
+ };
81
+ }
82
+ const yamlConfig = convertToYamlConfig(loadSettings());
83
+ const yamlContent = yaml.dump(yamlConfig, {
84
+ indent: 2,
85
+ lineWidth: 120,
86
+ noRefs: true
87
+ });
88
+ if (dryRun) {
89
+ const providersEnabled = Object.entries(yamlConfig.models?.providers || {}).filter(([_, enabled]) => enabled).map(([name]) => name);
90
+ return {
91
+ success: true,
92
+ overridesCount: Object.keys(yamlConfig.models?.overrides || {}).length,
93
+ providersEnabled,
94
+ message: `Would migrate to smart selection with ${providersEnabled.length} providers enabled`
95
+ };
96
+ }
97
+ writeFileSync(NEW_CONFIG_PATH, yamlContent, "utf-8");
98
+ if (backup) writeFileSync(BACKUP_SETTINGS_PATH, readFileSync(LEGACY_SETTINGS_PATH, "utf-8"), "utf-8");
99
+ if (deleteLegacy) renameSync(LEGACY_SETTINGS_PATH, `${LEGACY_SETTINGS_PATH}.migrated`);
100
+ const providersEnabled = Object.entries(yamlConfig.models?.providers || {}).filter(([_, enabled]) => enabled).map(([name]) => name);
101
+ return {
102
+ success: true,
103
+ overridesCount: Object.keys(yamlConfig.models?.overrides || {}).length,
104
+ providersEnabled,
105
+ message: `Successfully migrated to smart selection with ${providersEnabled.length} providers`
106
+ };
107
+ } catch (error) {
108
+ return {
109
+ success: false,
110
+ overridesCount: 0,
111
+ providersEnabled: [],
112
+ message: "Migration failed",
113
+ error: error.message
114
+ };
115
+ }
116
+ }
117
+ function cleanupLegacyRuntimeSymlinks() {
118
+ const legacyDirs = [
119
+ {
120
+ name: "codex",
121
+ base: join(homedir(), ".codex")
122
+ },
123
+ {
124
+ name: "cursor",
125
+ base: join(homedir(), ".cursor")
126
+ },
127
+ {
128
+ name: "gemini",
129
+ base: join(homedir(), ".gemini")
130
+ },
131
+ {
132
+ name: "opencode",
133
+ base: join(homedir(), ".opencode")
134
+ }
135
+ ];
136
+ const cleaned = [];
137
+ const errors = [];
138
+ for (const { name, base } of legacyDirs) for (const subdir of [
139
+ "skills",
140
+ "commands",
141
+ "agents"
142
+ ]) {
143
+ const dir = join(base, subdir);
144
+ if (!existsSync(dir)) continue;
145
+ try {
146
+ const entries = readdirSync(dir);
147
+ for (const entry of entries) {
148
+ const entryPath = join(dir, entry);
149
+ try {
150
+ if (!lstatSync(entryPath).isSymbolicLink()) continue;
151
+ if (readlinkSync(entryPath).includes(".panopticon")) {
152
+ unlinkSync(entryPath);
153
+ cleaned.push(`${name}/${subdir}/${entry}`);
154
+ }
155
+ } catch (err) {
156
+ errors.push(`${name}/${subdir}/${entry}: ${err.message}`);
157
+ }
158
+ }
159
+ } catch (err) {
160
+ errors.push(`${name}/${subdir}: ${err.message}`);
161
+ }
162
+ }
163
+ return {
164
+ cleaned,
165
+ total: cleaned.length,
166
+ errors
167
+ };
168
+ }
169
+ /**
170
+ * Migrate legacy sync config by stripping the 'targets' field from config.toml.
171
+ * This handles users who had `targets = ["claude", "codex"]` in their config.
172
+ */
173
+ function migrateSyncTargets() {
174
+ const configPath = join(homedir(), ".panopticon", "config.toml");
175
+ if (!existsSync(configPath)) return {
176
+ migrated: false,
177
+ hadNonClaudeTargets: false
178
+ };
179
+ try {
180
+ const content = readFileSync(configPath, "utf-8");
181
+ const targetsMatch = content.match(/^targets\s*=\s*\[([^\]]*)\]/m);
182
+ if (!targetsMatch) return {
183
+ migrated: false,
184
+ hadNonClaudeTargets: false
185
+ };
186
+ const targetsStr = targetsMatch[1];
187
+ const hadNonClaudeTargets = /codex|cursor|gemini|opencode/i.test(targetsStr);
188
+ writeFileSync(configPath, content.replace(/^targets\s*=\s*\[[^\]]*\]\s*\n?/m, ""), "utf-8");
189
+ return {
190
+ migrated: true,
191
+ hadNonClaudeTargets
192
+ };
193
+ } catch {
194
+ return {
195
+ migrated: false,
196
+ hadNonClaudeTargets: false
197
+ };
198
+ }
199
+ }
200
+ //#endregion
201
+ //#region src/lib/multi-tool-sync.ts
202
+ /**
203
+ * Multi-Tool Skill Sync
204
+ *
205
+ * Writes Panopticon skills to other AI tool formats so skills authored once
206
+ * in .pan/skills/ are available across all configured tools.
207
+ *
208
+ * Configured via `tools.also_sync` in ~/.panopticon/config.yaml and .pan.yaml.
209
+ * Per-project .pan.yaml values are merged additively with global config.
210
+ *
211
+ * Supported targets:
212
+ * cursor → .cursor/rules/<skill-name>.mdc
213
+ * codex → AGENTS.md (named blocks)
214
+ * windsurf → .windsurf/rules/<skill-name>.md
215
+ * cline → .clinerules/<skill-name>.md
216
+ * copilot → .github/instructions/<skill-name>.instructions.md
217
+ * aider → CONVENTIONS.md (named blocks)
218
+ */
219
+ init_paths();
220
+ /** Strip YAML frontmatter from a skill markdown file */
221
+ function stripFrontmatter(content) {
222
+ if (!content.startsWith("---")) return content;
223
+ const end = content.indexOf("\n---", 4);
224
+ if (end === -1) return content;
225
+ return content.slice(end + 4).trimStart();
226
+ }
227
+ /** Extract the skill name from frontmatter, or fall back to dir name */
228
+ function extractSkillName(content, fallback) {
229
+ if (!content.startsWith("---")) return fallback;
230
+ const end = content.indexOf("\n---", 4);
231
+ if (end === -1) return fallback;
232
+ const match = content.slice(4, end).match(/^name:\s*(.+)$/m);
233
+ return match ? match[1].trim() : fallback;
234
+ }
235
+ /** Read main SKILL.md content for a skill directory */
236
+ function readSkillContent(skillDir) {
237
+ const skillMd = join(skillDir, "SKILL.md");
238
+ if (!existsSync(skillMd)) {
239
+ const files = existsSync(skillDir) ? readdirSync(skillDir).filter((f) => f.endsWith(".md")) : [];
240
+ if (files.length === 0) return null;
241
+ return readFileSync(join(skillDir, files[0]), "utf-8");
242
+ }
243
+ return readFileSync(skillMd, "utf-8");
244
+ }
245
+ /** Collect all skill directories from the given skills root */
246
+ function collectSkillDirs(skillsDir) {
247
+ if (!existsSync(skillsDir)) return [];
248
+ return readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => ({
249
+ name: e.name,
250
+ dir: join(skillsDir, e.name)
251
+ }));
252
+ }
253
+ /**
254
+ * Update or insert a named block in a file.
255
+ * Blocks are delimited by: <!-- panopticon:<skill-name> start --> ... <!-- panopticon:<skill-name> end -->
256
+ */
257
+ function upsertNamedBlock(filePath, blockName, content) {
258
+ const startTag = `<!-- panopticon:${blockName} start -->`;
259
+ const endTag = `<!-- panopticon:${blockName} end -->`;
260
+ const block = `${startTag}\n${content}\n${endTag}`;
261
+ let existing = existsSync(filePath) ? readFileSync(filePath, "utf-8") : "";
262
+ const startIdx = existing.indexOf(startTag);
263
+ const endIdx = existing.indexOf(endTag);
264
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) existing = existing.slice(0, startIdx) + block + existing.slice(endIdx + endTag.length);
265
+ else {
266
+ if (existing.length > 0 && !existing.endsWith("\n")) existing += "\n";
267
+ existing += "\n" + block + "\n";
268
+ }
269
+ writeFileSync(filePath, existing, "utf-8");
270
+ }
271
+ /** Sync a single skill to the cursor target */
272
+ function syncToCursor(projectPath, skillName, rawContent) {
273
+ const rulesDir = join(projectPath, ".cursor", "rules");
274
+ mkdirSync(rulesDir, { recursive: true });
275
+ const body = stripFrontmatter(rawContent);
276
+ writeFileSync(join(rulesDir, `${skillName}.mdc`), body, "utf-8");
277
+ }
278
+ /** Sync a single skill to the windsurf target */
279
+ function syncToWindsurf(projectPath, skillName, rawContent) {
280
+ const rulesDir = join(projectPath, ".windsurf", "rules");
281
+ mkdirSync(rulesDir, { recursive: true });
282
+ writeFileSync(join(rulesDir, `${skillName}.md`), stripFrontmatter(rawContent), "utf-8");
283
+ }
284
+ /** Sync a single skill to the cline target */
285
+ function syncToCline(projectPath, skillName, rawContent) {
286
+ const rulesDir = join(projectPath, ".clinerules");
287
+ mkdirSync(rulesDir, { recursive: true });
288
+ writeFileSync(join(rulesDir, `${skillName}.md`), stripFrontmatter(rawContent), "utf-8");
289
+ }
290
+ /** Sync a single skill to the copilot target */
291
+ function syncToCopilot(projectPath, skillName, rawContent) {
292
+ const instructionsDir = join(projectPath, ".github", "instructions");
293
+ mkdirSync(instructionsDir, { recursive: true });
294
+ writeFileSync(join(instructionsDir, `${skillName}.instructions.md`), stripFrontmatter(rawContent), "utf-8");
295
+ }
296
+ /** Sync a single skill to AGENTS.md (codex) as a named block */
297
+ function syncToCodex(projectPath, skillName, rawContent) {
298
+ upsertNamedBlock(join(projectPath, "AGENTS.md"), skillName, `## ${skillName}\n\n${stripFrontmatter(rawContent)}`);
299
+ }
300
+ /** Sync a single skill to CONVENTIONS.md (aider) as a named block */
301
+ function syncToAider(projectPath, skillName, rawContent) {
302
+ upsertNamedBlock(join(projectPath, "CONVENTIONS.md"), skillName, `## ${skillName}\n\n${stripFrontmatter(rawContent)}`);
303
+ }
304
+ const TOOL_WRITERS = {
305
+ cursor: syncToCursor,
306
+ windsurf: syncToWindsurf,
307
+ cline: syncToCline,
308
+ copilot: syncToCopilot,
309
+ codex: syncToCodex,
310
+ aider: syncToAider
311
+ };
312
+ /**
313
+ * Resolve the merged list of tools to sync.
314
+ * Global config is the base; per-project .pan.yaml adds more (never removes).
315
+ */
316
+ function resolveAlsoSyncTools(projectPath) {
317
+ const tools = /* @__PURE__ */ new Set();
318
+ const globalConfig = join(PANOPTICON_HOME, "config.yaml");
319
+ if (existsSync(globalConfig)) try {
320
+ const globalTools = yaml.load(readFileSync(globalConfig, "utf-8"))?.tools?.also_sync || [];
321
+ for (const t of globalTools) if (t in TOOL_WRITERS) tools.add(t);
322
+ } catch {}
323
+ if (projectPath) {
324
+ const panYaml = join(projectPath, ".pan.yaml");
325
+ const legacyYaml = join(projectPath, ".panopticon.yaml");
326
+ const configPath = existsSync(panYaml) ? panYaml : existsSync(legacyYaml) ? legacyYaml : null;
327
+ if (configPath) try {
328
+ const projectTools = yaml.load(readFileSync(configPath, "utf-8"))?.tools?.also_sync || [];
329
+ for (const t of projectTools) if (t in TOOL_WRITERS) tools.add(t);
330
+ } catch {}
331
+ }
332
+ return Array.from(tools);
333
+ }
334
+ /**
335
+ * Sync skills from a skills directory to all configured tools.
336
+ *
337
+ * @param skillsDir Directory containing skill subdirectories
338
+ * @param projectPath Project root where tool targets live
339
+ * @param tools Tools to sync to (from resolveAlsoSyncTools)
340
+ */
341
+ function syncSkillsToTools(skillsDir, projectPath, tools) {
342
+ if (tools.length === 0 || !existsSync(skillsDir)) return [];
343
+ const skills = collectSkillDirs(skillsDir);
344
+ const results = [];
345
+ for (const tool of tools) {
346
+ const writer = TOOL_WRITERS[tool];
347
+ const result = {
348
+ tool,
349
+ written: [],
350
+ skipped: [],
351
+ errors: []
352
+ };
353
+ for (const { name, dir } of skills) try {
354
+ const rawContent = readSkillContent(dir);
355
+ if (!rawContent) {
356
+ result.skipped.push(name);
357
+ continue;
358
+ }
359
+ writer(projectPath, extractSkillName(rawContent, name), rawContent);
360
+ result.written.push(name);
361
+ } catch (err) {
362
+ result.errors.push(`${name}: ${err.message}`);
363
+ }
364
+ results.push(result);
365
+ }
366
+ return results;
367
+ }
368
+ /**
369
+ * Run the full multi-tool sync for a project.
370
+ * Sources: .pan/skills/ (project-local) and/or ~/.panopticon/skills/ (global).
371
+ */
372
+ function runMultiToolSync(projectPath) {
373
+ const tools = resolveAlsoSyncTools(projectPath);
374
+ if (tools.length === 0) return [];
375
+ const allResults = [];
376
+ const globalResults = syncSkillsToTools(join(PANOPTICON_HOME, "skills"), projectPath, tools);
377
+ allResults.push(...globalResults);
378
+ const projectSkillsDir = join(projectPath, ".pan", "skills");
379
+ if (existsSync(projectSkillsDir)) {
380
+ const projectResults = syncSkillsToTools(projectSkillsDir, projectPath, tools);
381
+ for (const pr of projectResults) {
382
+ const existing = allResults.find((r) => r.tool === pr.tool);
383
+ if (existing) {
384
+ existing.written.push(...pr.written);
385
+ existing.errors.push(...pr.errors);
386
+ } else allResults.push(pr);
387
+ }
388
+ }
389
+ return allResults;
390
+ }
391
+ //#endregion
392
+ //#region src/cli/commands/sync.ts
393
+ init_config();
394
+ init_paths();
395
+ init_projects();
396
+ init_workspace_manager();
397
+ const BUNDLED_GIT_HOOKS_DIR = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "scripts", "git-hooks");
398
+ function checkCommand(cmd) {
399
+ try {
400
+ execSync(`which ${cmd}`, { stdio: "pipe" });
401
+ return true;
402
+ } catch {
403
+ return false;
404
+ }
405
+ }
406
+ async function syncCommand(options) {
407
+ if (options.dryRun) {
408
+ console.log(chalk.bold("Sync Plan (dry run):\n"));
409
+ if (isDevMode()) console.log(chalk.magenta("Developer mode detected - dev-skills will be synced\n"));
410
+ const hooksPlan = planHooksSync();
411
+ if (hooksPlan.length > 0) {
412
+ console.log(chalk.cyan("hooks (bin scripts):"));
413
+ for (const hook of hooksPlan) {
414
+ const icon = hook.status === "new" ? chalk.green("+") : chalk.blue("↻");
415
+ const status = hook.status === "new" ? "" : chalk.dim("[update]");
416
+ console.log(` ${icon} ${hook.name} ${status}`);
417
+ }
418
+ console.log("");
419
+ }
420
+ const devrootPath = getDevrootPath();
421
+ console.log(chalk.cyan(`devroot (${devrootPath || "disabled"}):`));
422
+ if (!devrootPath) console.log(chalk.dim(" (devroot disabled — set sync.devroot in config)"));
423
+ else {
424
+ const plan = planSync();
425
+ const allItems = [
426
+ ...plan.skills,
427
+ ...plan.agents,
428
+ ...plan.rules,
429
+ ...plan.commands
430
+ ];
431
+ if (allItems.length === 0) console.log(chalk.dim(" (nothing to sync)"));
432
+ else for (const item of allItems) {
433
+ const icon = item.status === "conflict" ? chalk.yellow("!") : item.status === "symlink" ? chalk.blue("↻") : chalk.green("+");
434
+ const label = item.status === "conflict" ? chalk.yellow("[modified]") : item.status === "symlink" ? chalk.dim("[update]") : chalk.green("[new]");
435
+ console.log(` ${icon} ${item.name} ${label}`);
436
+ }
437
+ }
438
+ const dryRunProjects = listProjects();
439
+ for (const { config } of dryRunProjects) {
440
+ if (!existsSync(config.path)) continue;
441
+ const panSkillsDir = join(config.path, ".pan", "skills");
442
+ if (existsSync(panSkillsDir)) {
443
+ const skills = readdirSync(panSkillsDir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
444
+ if (skills.length > 0) {
445
+ console.log(chalk.cyan(`\n.pan/skills/ (${config.name}):`));
446
+ for (const skillName of skills) console.log(` ${chalk.green("+")} ${skillName} ${chalk.green("[project-local]")}`);
447
+ }
448
+ }
449
+ const tools = resolveAlsoSyncTools(config.path);
450
+ if (tools.length > 0) {
451
+ console.log(chalk.cyan(`\nmulti-tool sync (${config.name}): ${tools.join(", ")}`));
452
+ if (existsSync(join(config.path, ".pan", "skills"))) {
453
+ const skills = readdirSync(join(config.path, ".pan", "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
454
+ for (const tool of tools) for (const skillName of skills) console.log(` ${chalk.green("+")} ${skillName} → ${tool}`);
455
+ }
456
+ }
457
+ }
458
+ console.log("");
459
+ console.log(chalk.dim("Run without --dry-run to apply changes."));
460
+ return;
461
+ }
462
+ const syncMigration = migrateSyncTargets();
463
+ if (syncMigration.migrated) {
464
+ if (syncMigration.hadNonClaudeTargets) console.log(chalk.yellow("Config updated: removed non-Claude sync targets (Panopticon now syncs to Claude Code only)."));
465
+ }
466
+ const cleanupResult = cleanupLegacyRuntimeSymlinks();
467
+ if (cleanupResult.cleaned.length > 0) console.log(chalk.dim(`Removed ${cleanupResult.total} legacy runtime symlink(s): ${cleanupResult.cleaned.join(", ")}`));
468
+ const migration = migrateStalePersonalContent();
469
+ if (migration.removedSymlinks.length > 0) {
470
+ console.log(chalk.cyan(`Migrated: removed ${migration.removedSymlinks.length} Panopticon symlink(s) from ~/.claude/`));
471
+ if (migration.preservedUserContent.length > 0) console.log(chalk.dim(` Preserved ${migration.preservedUserContent.length} user-created item(s)`));
472
+ }
473
+ if (loadConfig().sync.backup_before_sync) {
474
+ const spinner = ora("Creating backup...").start();
475
+ const backup = createBackup([
476
+ SYNC_TARGET.skills,
477
+ SYNC_TARGET.commands,
478
+ SYNC_TARGET.agents
479
+ ]);
480
+ if (backup.targets.length > 0) spinner.succeed(`Backup created: ${backup.timestamp}`);
481
+ else spinner.info("No existing content to backup");
482
+ if (options.backupOnly) return;
483
+ }
484
+ const cacheSpinner = ora("Refreshing cache from repo...").start();
485
+ const cacheResult = refreshCache();
486
+ const cacheParts = [];
487
+ if (cacheResult.skills.copied > 0) cacheParts.push(`${cacheResult.skills.copied} skills`);
488
+ if (cacheResult.agents.copied > 0) cacheParts.push(`${cacheResult.agents.copied} agents`);
489
+ if (cacheResult.rules.copied > 0) cacheParts.push(`${cacheResult.rules.copied} rules`);
490
+ cacheSpinner.succeed(`Cache refreshed: ${cacheParts.length > 0 ? cacheParts.join(", ") : "up to date"}`);
491
+ const devrootPath = getDevrootPath();
492
+ const spinner = ora(`Syncing to devroot (${devrootPath || "disabled"})...`).start();
493
+ if (!devrootPath) spinner.info("Devroot disabled (set sync.devroot in config to enable)");
494
+ else {
495
+ const result = executeSync({
496
+ force: options.force,
497
+ diff: options.diff
498
+ });
499
+ const totalSynced = result.created.length + result.updated.length;
500
+ if (result.diffs.length > 0) {
501
+ spinner.info(`Showing diffs for ${result.diffs.length} modified file(s):\n`);
502
+ for (const d of result.diffs) {
503
+ console.log(chalk.cyan(`--- ${d.path} (installed)`));
504
+ console.log(chalk.cyan(`+++ ${d.path} (current on disk)`));
505
+ const sourceLines = d.sourceContent.split("\n");
506
+ const targetLines = d.targetContent.split("\n");
507
+ const maxLines = Math.max(sourceLines.length, targetLines.length);
508
+ for (let i = 0; i < maxLines; i++) if (sourceLines[i] !== targetLines[i]) {
509
+ if (targetLines[i] !== void 0) console.log(chalk.red(`- ${targetLines[i]}`));
510
+ if (sourceLines[i] !== void 0) console.log(chalk.green(`+ ${sourceLines[i]}`));
511
+ }
512
+ console.log("");
513
+ }
514
+ }
515
+ if (result.conflicts.length > 0 && !options.force) {
516
+ spinner.warn(`Synced ${totalSynced} items, ${result.conflicts.length} conflicts`);
517
+ console.log("");
518
+ console.log(chalk.yellow("Modified since Panopticon installed:"));
519
+ for (const name of result.conflicts) console.log(chalk.dim(` - ${name}`));
520
+ console.log("");
521
+ console.log(chalk.dim("Use --force to overwrite, --diff to see changes."));
522
+ } else if (result.skipped.length > 0) spinner.succeed(`Synced ${totalSynced} items to devroot (${result.skipped.length} user-owned skipped)`);
523
+ else spinner.succeed(`Synced ${totalSynced} items to devroot`);
524
+ }
525
+ const hooksSpinner = ora("Syncing hooks...").start();
526
+ const hooksResult = syncHooks();
527
+ if (hooksResult.errors.length > 0) {
528
+ hooksSpinner.warn(`Synced ${hooksResult.synced.length} hooks, ${hooksResult.errors.length} errors`);
529
+ for (const error of hooksResult.errors) console.log(chalk.red(` ✗ ${error}`));
530
+ } else if (hooksResult.synced.length > 0) hooksSpinner.succeed(`Synced ${hooksResult.synced.length} hooks to ~/.panopticon/bin/`);
531
+ else hooksSpinner.info("No hooks to sync");
532
+ const projects = listProjects();
533
+ if (projects.length > 0 && checkCommand("bd")) for (const { key, config } of projects) {
534
+ if (!existsSync(config.path)) continue;
535
+ if (!existsSync(join(config.path, ".beads"))) continue;
536
+ try {
537
+ execSync("bd list --json --limit 0 2>&1", {
538
+ cwd: config.path,
539
+ stdio: "pipe",
540
+ timeout: 8e3
541
+ });
542
+ } catch (e) {
543
+ const msg = String(e?.stdout ?? e?.stderr ?? e?.message ?? "");
544
+ if (msg.includes("database") && (msg.includes("not found") || msg.includes("not exist") || msg.includes("defaulting"))) {
545
+ const beadsSpinner = ora(`Initializing beads database for ${config.name}...`).start();
546
+ try {
547
+ const prefix = (key || config.name).toLowerCase().replace(/[^a-z0-9-]/g, "-");
548
+ execSync(`bd init --prefix ${prefix}`, {
549
+ cwd: config.path,
550
+ stdio: "pipe",
551
+ timeout: 2e4
552
+ });
553
+ try {
554
+ execSync("git config beads.role contributor", {
555
+ cwd: config.path,
556
+ stdio: "pipe"
557
+ });
558
+ } catch {}
559
+ beadsSpinner.succeed(`Beads database initialized for ${config.name} (prefix: ${prefix})`);
560
+ } catch {
561
+ beadsSpinner.warn(`Could not auto-initialize beads for ${config.name} — run: cd ${config.path} && bd init`);
562
+ }
563
+ }
564
+ }
565
+ }
566
+ if (!checkCommand("jq")) {
567
+ console.log(chalk.yellow("\n ⚠ jq not found — statusline and other features need it"));
568
+ console.log(chalk.dim(" Install: apt install jq / brew install jq\n"));
569
+ }
570
+ const statuslineSpinner = ora("Syncing statusline...").start();
571
+ const statuslineResult = syncStatusline();
572
+ if (statuslineResult.errors.length > 0) {
573
+ statuslineSpinner.warn(`Synced statusline to ${statuslineResult.synced.length} runtime(s), ${statuslineResult.errors.length} error(s)`);
574
+ for (const error of statuslineResult.errors) console.log(chalk.red(` ✗ ${error}`));
575
+ } else if (statuslineResult.synced.length > 0) statuslineSpinner.succeed(`Synced statusline to ${statuslineResult.synced.join(", ")}`);
576
+ else statuslineSpinner.info("No statusline script found (scripts/statusline.sh)");
577
+ if (!checkCommand("claude-code-router")) {
578
+ const routerSpinner = ora("Installing claude-code-router...").start();
579
+ try {
580
+ execSync("npm install -g @musistudio/claude-code-router", {
581
+ stdio: "pipe",
582
+ timeout: 12e4
583
+ });
584
+ routerSpinner.succeed("claude-code-router installed");
585
+ } catch (error) {
586
+ routerSpinner.warn("Failed to install claude-code-router - run: npm install -g @musistudio/claude-code-router");
587
+ }
588
+ }
589
+ if (!checkCommand("mkcert")) {
590
+ const mkcertSpinner = ora("Installing mkcert...").start();
591
+ try {
592
+ const binDir = join(homedir(), ".local", "bin");
593
+ mkdirSync(binDir, { recursive: true });
594
+ const mkcertPath = join(binDir, "mkcert");
595
+ execSync(`curl -sL "https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-v1.4.4-linux-${process.arch === "x64" ? "amd64" : process.arch}" -o "${mkcertPath}" && chmod +x "${mkcertPath}"`, {
596
+ stdio: "pipe",
597
+ timeout: 6e4
598
+ });
599
+ mkcertSpinner.succeed("mkcert installed");
600
+ } catch {
601
+ mkcertSpinner.warn("Failed to install mkcert - run: https://github.com/FiloSottile/mkcert/releases");
602
+ }
603
+ }
604
+ if (!checkCommand("ox")) {
605
+ const oxSpinner = ora("Installing SageOx CLI (ox)...").start();
606
+ try {
607
+ const binDir = join(homedir(), ".local", "bin");
608
+ mkdirSync(binDir, { recursive: true });
609
+ const oxPath = join(binDir, "ox");
610
+ const arch = process.arch === "x64" ? "amd64" : process.arch;
611
+ execSync(`curl -sL "https://github.com/eltmon/ox/releases/download/latest/ox-${process.platform === "darwin" ? "darwin" : "linux"}-${arch}" -o "${oxPath}" && chmod +x "${oxPath}"`, {
612
+ stdio: "pipe",
613
+ timeout: 6e4
614
+ });
615
+ oxSpinner.succeed("SageOx CLI installed");
616
+ } catch {
617
+ oxSpinner.warn("Failed to install SageOx CLI - see: https://github.com/eltmon/ox/releases");
618
+ }
619
+ }
620
+ const mcpPath = join(homedir(), ".claude", "mcp.json");
621
+ try {
622
+ if (existsSync(mcpPath)) {
623
+ const mcpConfig = JSON.parse(readFileSync(mcpPath, "utf-8"));
624
+ const pw = mcpConfig?.mcpServers?.playwright;
625
+ if (pw && Array.isArray(pw.args) && !pw.args.includes("--isolated")) {
626
+ pw.args.push("--isolated");
627
+ writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + "\n");
628
+ console.log(chalk.green("✓ Added --isolated to Playwright MCP (prevents stale zoom/profile state)"));
629
+ }
630
+ }
631
+ } catch {}
632
+ for (const { config } of projects) {
633
+ if (!existsSync(config.path)) continue;
634
+ const migResult = migratePanopticonToPan(config.path);
635
+ if (migResult.migrated.length > 0) console.log(chalk.cyan(`Migrated .panopticon/ → .pan/ in ${config.name}: ${migResult.migrated.join(", ")}`));
636
+ if (migResult.skipped.length > 0) console.log(chalk.yellow(`Migration skipped (both exist) in ${config.name}: ${migResult.skipped.join(", ")}`));
637
+ for (const err of migResult.errors) console.log(chalk.red(`Migration error in ${config.name}: ${err}`));
638
+ const toolSyncResults = runMultiToolSync(config.path);
639
+ for (const r of toolSyncResults) {
640
+ if (r.written.length > 0) console.log(chalk.cyan(`Synced ${r.written.length} skill(s) to ${r.tool} in ${config.name}`));
641
+ for (const err of r.errors) console.log(chalk.red(`Multi-tool sync error (${r.tool}) in ${config.name}: ${err}`));
642
+ }
643
+ }
644
+ if (projects.length > 0 && existsSync(BUNDLED_GIT_HOOKS_DIR)) {
645
+ const gitHooksSpinner = ora("Installing git hooks in registered projects...").start();
646
+ let totalInstalled = 0;
647
+ let projectsUpdated = 0;
648
+ for (const { config } of projects) {
649
+ if (!existsSync(config.path)) continue;
650
+ const gitDirs = [];
651
+ if (existsSync(join(config.path, ".git")) && statSync(join(config.path, ".git")).isDirectory()) gitDirs.push(join(config.path, ".git"));
652
+ else try {
653
+ const entries = readdirSync(config.path);
654
+ for (const entry of entries) {
655
+ const gitPath = join(join(config.path, entry), ".git");
656
+ if (existsSync(gitPath) && statSync(gitPath).isDirectory()) gitDirs.push(gitPath);
657
+ }
658
+ } catch {}
659
+ for (const gitDir of gitDirs) {
660
+ const hooksTarget = join(gitDir, "hooks");
661
+ if (!existsSync(hooksTarget)) mkdirSync(hooksTarget, { recursive: true });
662
+ try {
663
+ const hooks = readdirSync(BUNDLED_GIT_HOOKS_DIR).filter((f) => statSync(join(BUNDLED_GIT_HOOKS_DIR, f)).isFile());
664
+ for (const hook of hooks) {
665
+ const source = join(BUNDLED_GIT_HOOKS_DIR, hook);
666
+ const target = join(hooksTarget, hook);
667
+ if (existsSync(target)) {
668
+ try {
669
+ const { readlinkSync } = await import("fs");
670
+ if (readlinkSync(target) === source) continue;
671
+ } catch {}
672
+ const { renameSync } = await import("fs");
673
+ try {
674
+ renameSync(target, `${target}.backup`);
675
+ } catch {}
676
+ }
677
+ try {
678
+ symlinkSync(source, target);
679
+ totalInstalled++;
680
+ } catch {}
681
+ }
682
+ projectsUpdated++;
683
+ } catch {}
684
+ }
685
+ }
686
+ if (totalInstalled > 0) gitHooksSpinner.succeed(`Installed git hooks in ${projectsUpdated} project(s)`);
687
+ else gitHooksSpinner.info("Git hooks already up to date");
688
+ }
689
+ }
690
+ //#endregion
691
+ export { needsMigration as i, hasLegacySettings as n, migrateConfig as r, syncCommand as t };
692
+
693
+ //# sourceMappingURL=sync-DMfgd389.js.map