@iloom/cli 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +153 -13
  3. package/dist/BitBucketApiClient-J2ZSCS5N.js +10 -0
  4. package/dist/BitBucketVCSProvider-5X64IXXW.js +12 -0
  5. package/dist/{BranchNamingService-XBCO747L.js → BranchNamingService-MEK2WZUD.js} +4 -4
  6. package/dist/ClaudeContextManager-IENAE2CP.js +14 -0
  7. package/dist/ClaudeService-YIJCZUUB.js +13 -0
  8. package/dist/GitHubService-UTAYZXL3.js +12 -0
  9. package/dist/IssueTrackerFactory-2OI7YIN6.js +15 -0
  10. package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-3TSFW7QP.js} +10 -10
  11. package/dist/MetadataManager-V4LSJ2PB.js +10 -0
  12. package/dist/ProjectCapabilityDetector-I4J66WKF.js +11 -0
  13. package/dist/{PromptTemplateManager-T5VTLJP3.js → PromptTemplateManager-I75WKXM4.js} +3 -3
  14. package/dist/README.md +153 -13
  15. package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-BMQCAXPP.js} +13 -5
  16. package/dist/SettingsMigrationManager-ZPARZ5KH.js +10 -0
  17. package/dist/agents/iloom-code-reviewer.md +2 -1
  18. package/dist/agents/iloom-framework-detector.md +0 -1
  19. package/dist/agents/iloom-issue-analyze-and-plan.md +4 -1
  20. package/dist/agents/iloom-issue-analyzer.md +4 -1
  21. package/dist/agents/iloom-issue-complexity-evaluator.md +4 -1
  22. package/dist/agents/iloom-issue-enhancer.md +4 -1
  23. package/dist/agents/iloom-issue-implementer.md +5 -2
  24. package/dist/agents/iloom-issue-planner.md +4 -1
  25. package/dist/agents/iloom-wave-verifier.md +186 -0
  26. package/dist/browser-VZY7F2DF.js +10 -0
  27. package/dist/build-DMWSIME6.js +27 -0
  28. package/dist/{chunk-UHIBKD73.js → chunk-35CBWAJL.js} +13 -32
  29. package/dist/{chunk-UHIBKD73.js.map → chunk-35CBWAJL.js.map} +1 -1
  30. package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
  31. package/dist/chunk-4JZEQBWV.js.map +1 -0
  32. package/dist/{chunk-ET6A2JR4.js → chunk-653XBU3L.js} +111 -18
  33. package/dist/chunk-653XBU3L.js.map +1 -0
  34. package/dist/{chunk-G2MNSPA4.js → chunk-772N5WCA.js} +2 -2
  35. package/dist/{chunk-WG4MLJ6J.js → chunk-7RCUWU3I.js} +2 -2
  36. package/dist/chunk-7RCUWU3I.js.map +1 -0
  37. package/dist/{chunk-NOMQ5RFG.js → chunk-7UBEHQTP.js} +2 -2
  38. package/dist/{chunk-7NFCGKZT.js → chunk-AQUSMNBF.js} +3 -3
  39. package/dist/{chunk-IDCE26KD.js → chunk-AUYSAMXV.js} +3 -3
  40. package/dist/chunk-AYLC633W.js +406 -0
  41. package/dist/chunk-AYLC633W.js.map +1 -0
  42. package/dist/{chunk-HLDY5S4C.js → chunk-BFF27W3S.js} +3 -3
  43. package/dist/{chunk-QVAA5KHK.js → chunk-BZ7KTXPB.js} +16 -8
  44. package/dist/chunk-BZ7KTXPB.js.map +1 -0
  45. package/dist/{chunk-K7R5QY6C.js → chunk-CE676WCN.js} +2 -2
  46. package/dist/{chunk-5UFGO4ZT.js → chunk-CQHHEW2M.js} +6 -3
  47. package/dist/chunk-CQHHEW2M.js.map +1 -0
  48. package/dist/{chunk-LHDD4JHC.js → chunk-D4Q7T5KD.js} +4 -4
  49. package/dist/{chunk-RBYTXYGD.js → chunk-D75KSI3V.js} +2 -2
  50. package/dist/{chunk-Y3RX7LZT.js → chunk-DDHWZNGL.js} +18 -12
  51. package/dist/chunk-DDHWZNGL.js.map +1 -0
  52. package/dist/{chunk-5LTID2AF.js → chunk-DMSL5BAP.js} +35 -6
  53. package/dist/{chunk-5LTID2AF.js.map → chunk-DMSL5BAP.js.map} +1 -1
  54. package/dist/{chunk-SQYHPBFP.js → chunk-EGNUOALL.js} +2 -2
  55. package/dist/{chunk-LL6TOX3G.js → chunk-EQIII6GI.js} +10 -10
  56. package/dist/chunk-EQIII6GI.js.map +1 -0
  57. package/dist/{chunk-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
  58. package/dist/{chunk-LE2NOUTN.js → chunk-FV4KXBGO.js} +3 -3
  59. package/dist/{chunk-XFQGI2E3.js → chunk-GWJWECZB.js} +51 -45
  60. package/dist/chunk-GWJWECZB.js.map +1 -0
  61. package/dist/{chunk-QNHZM5ZV.js → chunk-HIGWKLQR.js} +3 -3
  62. package/dist/{chunk-VMZG66UV.js → chunk-HKEXRZMU.js} +3 -3
  63. package/dist/{chunk-V4STTBQD.js → chunk-IHSA7VGI.js} +9 -9
  64. package/dist/{chunk-TEJAGQX2.js → chunk-IS46GQRA.js} +33 -33
  65. package/dist/{chunk-VNYWBHKR.js → chunk-JD3K2344.js} +3 -3
  66. package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
  67. package/dist/{chunk-QR4FU53I.js → chunk-KCZSUJUR.js} +22 -12
  68. package/dist/chunk-KCZSUJUR.js.map +1 -0
  69. package/dist/{chunk-NH3QZYE5.js → chunk-KV4NU3RP.js} +2 -2
  70. package/dist/{chunk-NDSGJZI2.js → chunk-LOAYWTJJ.js} +2 -2
  71. package/dist/{chunk-ABVMUNCD.js → chunk-M3FBM4T3.js} +64 -10
  72. package/dist/chunk-M3FBM4T3.js.map +1 -0
  73. package/dist/{chunk-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
  74. package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
  75. package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
  76. package/dist/{chunk-7FIXNAUO.js → chunk-OKB2NEDQ.js} +66 -43
  77. package/dist/chunk-OKB2NEDQ.js.map +1 -0
  78. package/dist/{chunk-3RXYOBME.js → chunk-OPQC4OWM.js} +5 -5
  79. package/dist/{chunk-3RXYOBME.js.map → chunk-OPQC4OWM.js.map} +1 -1
  80. package/dist/chunk-P5MXXHXQ.js +284 -0
  81. package/dist/chunk-P5MXXHXQ.js.map +1 -0
  82. package/dist/{chunk-IR74O2F6.js → chunk-PDG74IJT.js} +239 -162
  83. package/dist/chunk-PDG74IJT.js.map +1 -0
  84. package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
  85. package/dist/{chunk-TZNNJLGT.js → chunk-PMB6TYV4.js} +6 -6
  86. package/dist/chunk-QC65IOV3.js +304 -0
  87. package/dist/chunk-QC65IOV3.js.map +1 -0
  88. package/dist/{chunk-6YVJVUR4.js → chunk-QF2DROQR.js} +3 -3
  89. package/dist/{chunk-XXFSOVL3.js → chunk-QFDM23CO.js} +4 -4
  90. package/dist/{chunk-RMLADZRY.js → chunk-R7DGN73N.js} +5 -5
  91. package/dist/{chunk-5PNZBH6V.js → chunk-V5IYLWRA.js} +2 -2
  92. package/dist/{chunk-KQFIGI37.js → chunk-VA6CWUAE.js} +7 -7
  93. package/dist/{chunk-3GTUXW26.js → chunk-VIQOQ463.js} +19 -3
  94. package/dist/chunk-VIQOQ463.js.map +1 -0
  95. package/dist/{chunk-H2SSF24U.js → chunk-VRPPI6GU.js} +17 -6
  96. package/dist/{chunk-H2SSF24U.js.map → chunk-VRPPI6GU.js.map} +1 -1
  97. package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
  98. package/dist/{chunk-VUUN3KE4.js → chunk-XVCGPTEQ.js} +8 -8
  99. package/dist/chunk-XVCGPTEQ.js.map +1 -0
  100. package/dist/chunk-YWNF5755.js +696 -0
  101. package/dist/chunk-YWNF5755.js.map +1 -0
  102. package/dist/{chunk-UDCI3QTS.js → chunk-ZM2AYHMO.js} +2 -2
  103. package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
  104. package/dist/{cleanup-YOM6PQCN.js → cleanup-RLBLNQZN.js} +37 -34
  105. package/dist/{cleanup-YOM6PQCN.js.map → cleanup-RLBLNQZN.js.map} +1 -1
  106. package/dist/cli.js +290 -141
  107. package/dist/cli.js.map +1 -1
  108. package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
  109. package/dist/{commit-DC2Q5CDY.js → commit-RILBXFWO.js} +15 -15
  110. package/dist/{compile-4NCQECKE.js → compile-QEL5724K.js} +11 -11
  111. package/dist/{contribute-M5UWXCAV.js → contribute-EHWLYOMZ.js} +11 -11
  112. package/dist/{contribute-M5UWXCAV.js.map → contribute-EHWLYOMZ.js.map} +1 -1
  113. package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
  114. package/dist/{dev-server-CYRP6M73.js → dev-server-2WSWZXJG.js} +35 -21
  115. package/dist/dev-server-2WSWZXJG.js.map +1 -0
  116. package/dist/{feedback-BMAZGKRW.js → feedback-I6ZEHEUB.js} +17 -17
  117. package/dist/{git-BXUD6CL5.js → git-I3PO6FY7.js} +6 -6
  118. package/dist/ignite-XZFYRVRJ.js +35 -0
  119. package/dist/index.d.ts +200 -16
  120. package/dist/index.js +164 -55
  121. package/dist/index.js.map +1 -1
  122. package/dist/{init-CI43GJHV.js → init-A6WRP77L.js} +18 -18
  123. package/dist/{install-deps-SRTM5U7D.js → install-deps-HXP2TM7G.js} +11 -11
  124. package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
  125. package/dist/{issues-DMRQJH7E.js → issues-SUFQJY6O.js} +69 -56
  126. package/dist/issues-SUFQJY6O.js.map +1 -0
  127. package/dist/lint-FDZC77GL.js +27 -0
  128. package/dist/{linux-RYLOP2LY.js → linux-WUGRYCJY.js} +2 -2
  129. package/dist/mcp/{chunk-PIIRD4LO.js → chunk-4HZMW2V3.js} +1 -1
  130. package/dist/mcp/{chunk-PIIRD4LO.js.map → chunk-4HZMW2V3.js.map} +1 -1
  131. package/dist/{darwin-5BHWRJ7D.js → mcp/darwin-U25WIGH6.js} +2 -2
  132. package/dist/mcp/issue-management-server.js +900 -20
  133. package/dist/mcp/issue-management-server.js.map +1 -1
  134. package/dist/mcp/{linux-JBVS4R3A.js → linux-5BXVBGSY.js} +2 -2
  135. package/dist/mcp/recap-server.js +24 -22
  136. package/dist/mcp/recap-server.js.map +1 -1
  137. package/dist/mcp/{tmux-RYBLEHUZ.js → tmux-CU26ZTNM.js} +2 -2
  138. package/dist/mcp/{wsl-4QZIQLLE.js → wsl-KI25UDOF.js} +2 -2
  139. package/dist/neon-helpers-LCZAN4U4.js +11 -0
  140. package/dist/{open-2Y7GSUTJ.js → open-US4XACLW.js} +36 -21
  141. package/dist/open-US4XACLW.js.map +1 -0
  142. package/dist/{plan-SWFPLNJE.js → plan-PL3ZB32J.js} +47 -43
  143. package/dist/{plan-SWFPLNJE.js.map → plan-PL3ZB32J.js.map} +1 -1
  144. package/dist/{projects-IUSUXD5D.js → projects-L5AHUBGA.js} +6 -6
  145. package/dist/{prompt-7LZB4PAT.js → prompt-FUU5NMJQ.js} +3 -3
  146. package/dist/prompt-FUU5NMJQ.js.map +1 -0
  147. package/dist/prompts/init-prompt.txt +160 -23
  148. package/dist/prompts/issue-prompt.txt +93 -157
  149. package/dist/prompts/plan-prompt.txt +55 -0
  150. package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
  151. package/dist/{rebase-S6OHAOOF.js → rebase-JA3RW2XO.js} +12 -12
  152. package/dist/{recap-GGVCG5VH.js → recap-5TO42HN2.js} +9 -9
  153. package/dist/{remote-MZTFHHTU.js → remote-RO4LZKT2.js} +3 -3
  154. package/dist/remote-RO4LZKT2.js.map +1 -0
  155. package/dist/{run-ST3FR75O.js → run-KKCRBRLW.js} +36 -21
  156. package/dist/run-KKCRBRLW.js.map +1 -0
  157. package/dist/schema/settings.schema.json +147 -11
  158. package/dist/{shell-W4SBQPTE.js → shell-GAB2FCXH.js} +8 -8
  159. package/dist/{summary-P2JCIIJO.js → summary-P7QE3TNW.js} +21 -19
  160. package/dist/summary-P7QE3TNW.js.map +1 -0
  161. package/dist/test-6LFB5WOO.js +27 -0
  162. package/dist/{test-git-2KFFAQ6B.js → test-git-PYJOYSED.js} +6 -6
  163. package/dist/{test-jira-FKDKG6CD.js → test-jira-SM7IU5HW.js} +8 -8
  164. package/dist/{test-prefix-GP2DAX37.js → test-prefix-HIRZBXTM.js} +6 -6
  165. package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
  166. package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-43PVP2JL.js} +8 -8
  167. package/dist/{tmux-7ZTA3BDI.js → tmux-6LRFH3DM.js} +2 -2
  168. package/dist/{update-XLW7R7FL.js → update-AD3GE5C4.js} +4 -4
  169. package/dist/{update-notifier-EYLAXZAA.js → update-notifier-VYDTDMSJ.js} +3 -3
  170. package/dist/update-notifier-VYDTDMSJ.js.map +1 -0
  171. package/dist/{vscode-TOGE5N67.js → vscode-HXIXRZ3A.js} +12 -12
  172. package/dist/{vscode-announcement-NIX7O2MG.js → vscode-announcement-AL3EHORH.js} +3 -3
  173. package/dist/{wsl-Y4GUTOQ7.js → wsl-4VMVT2PO.js} +2 -2
  174. package/package.json +1 -1
  175. package/dist/ClaudeContextManager-SXDCWDJA.js +0 -14
  176. package/dist/ClaudeService-6E6MCGJE.js +0 -13
  177. package/dist/GitHubService-2R5GQG4K.js +0 -12
  178. package/dist/IssueTrackerFactory-XN6MQ4UN.js +0 -14
  179. package/dist/MetadataManager-CMQQTFLQ.js +0 -10
  180. package/dist/ProjectCapabilityDetector-IC6NAFGY.js +0 -11
  181. package/dist/SettingsMigrationManager-S6J7OHUH.js +0 -10
  182. package/dist/build-OLS6J5KZ.js +0 -27
  183. package/dist/chunk-3GTUXW26.js.map +0 -1
  184. package/dist/chunk-5UFGO4ZT.js.map +0 -1
  185. package/dist/chunk-7FIXNAUO.js.map +0 -1
  186. package/dist/chunk-ABVMUNCD.js.map +0 -1
  187. package/dist/chunk-ET6A2JR4.js.map +0 -1
  188. package/dist/chunk-IR74O2F6.js.map +0 -1
  189. package/dist/chunk-LL6TOX3G.js.map +0 -1
  190. package/dist/chunk-QR4FU53I.js.map +0 -1
  191. package/dist/chunk-QVAA5KHK.js.map +0 -1
  192. package/dist/chunk-RVI6C2H5.js +0 -220
  193. package/dist/chunk-RVI6C2H5.js.map +0 -1
  194. package/dist/chunk-VUUN3KE4.js.map +0 -1
  195. package/dist/chunk-WG4MLJ6J.js.map +0 -1
  196. package/dist/chunk-XFQGI2E3.js.map +0 -1
  197. package/dist/chunk-Y3RX7LZT.js.map +0 -1
  198. package/dist/chunk-YRCEOQPX.js.map +0 -1
  199. package/dist/dev-server-CYRP6M73.js.map +0 -1
  200. package/dist/ignite-IO4LXVXJ.js +0 -35
  201. package/dist/issues-DMRQJH7E.js.map +0 -1
  202. package/dist/lint-BSWRMGPZ.js +0 -27
  203. package/dist/neon-helpers-HWIYRKOW.js +0 -11
  204. package/dist/open-2Y7GSUTJ.js.map +0 -1
  205. package/dist/run-ST3FR75O.js.map +0 -1
  206. package/dist/summary-P2JCIIJO.js.map +0 -1
  207. package/dist/test-6JH4FE2X.js +0 -27
  208. /package/dist/{BranchNamingService-XBCO747L.js.map → BitBucketApiClient-J2ZSCS5N.js.map} +0 -0
  209. /package/dist/{ClaudeContextManager-SXDCWDJA.js.map → BitBucketVCSProvider-5X64IXXW.js.map} +0 -0
  210. /package/dist/{ClaudeService-6E6MCGJE.js.map → BranchNamingService-MEK2WZUD.js.map} +0 -0
  211. /package/dist/{GitHubService-2R5GQG4K.js.map → ClaudeContextManager-IENAE2CP.js.map} +0 -0
  212. /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-YIJCZUUB.js.map} +0 -0
  213. /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
  214. /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-2OI7YIN6.js.map} +0 -0
  215. /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-3TSFW7QP.js.map} +0 -0
  216. /package/dist/{PromptTemplateManager-T5VTLJP3.js.map → MetadataManager-V4LSJ2PB.js.map} +0 -0
  217. /package/dist/{SettingsManager-WQ5NSGAH.js.map → ProjectCapabilityDetector-I4J66WKF.js.map} +0 -0
  218. /package/dist/{SettingsMigrationManager-S6J7OHUH.js.map → PromptTemplateManager-I75WKXM4.js.map} +0 -0
  219. /package/dist/{claude-ONQTDWV3.js.map → SettingsManager-BMQCAXPP.js.map} +0 -0
  220. /package/dist/{color-VQD52LOI.js.map → SettingsMigrationManager-ZPARZ5KH.js.map} +0 -0
  221. /package/dist/{darwin-5BHWRJ7D.js.map → browser-VZY7F2DF.js.map} +0 -0
  222. /package/dist/{build-OLS6J5KZ.js.map → build-DMWSIME6.js.map} +0 -0
  223. /package/dist/{chunk-G2MNSPA4.js.map → chunk-772N5WCA.js.map} +0 -0
  224. /package/dist/{chunk-NOMQ5RFG.js.map → chunk-7UBEHQTP.js.map} +0 -0
  225. /package/dist/{chunk-7NFCGKZT.js.map → chunk-AQUSMNBF.js.map} +0 -0
  226. /package/dist/{chunk-IDCE26KD.js.map → chunk-AUYSAMXV.js.map} +0 -0
  227. /package/dist/{chunk-HLDY5S4C.js.map → chunk-BFF27W3S.js.map} +0 -0
  228. /package/dist/{chunk-K7R5QY6C.js.map → chunk-CE676WCN.js.map} +0 -0
  229. /package/dist/{chunk-LHDD4JHC.js.map → chunk-D4Q7T5KD.js.map} +0 -0
  230. /package/dist/{chunk-RBYTXYGD.js.map → chunk-D75KSI3V.js.map} +0 -0
  231. /package/dist/{chunk-SQYHPBFP.js.map → chunk-EGNUOALL.js.map} +0 -0
  232. /package/dist/{chunk-ZAXRQLK3.js.map → chunk-FTYWGQFM.js.map} +0 -0
  233. /package/dist/{chunk-LE2NOUTN.js.map → chunk-FV4KXBGO.js.map} +0 -0
  234. /package/dist/{chunk-QNHZM5ZV.js.map → chunk-HIGWKLQR.js.map} +0 -0
  235. /package/dist/{chunk-VMZG66UV.js.map → chunk-HKEXRZMU.js.map} +0 -0
  236. /package/dist/{chunk-V4STTBQD.js.map → chunk-IHSA7VGI.js.map} +0 -0
  237. /package/dist/{chunk-TEJAGQX2.js.map → chunk-IS46GQRA.js.map} +0 -0
  238. /package/dist/{chunk-VNYWBHKR.js.map → chunk-JD3K2344.js.map} +0 -0
  239. /package/dist/{chunk-NCPZYQ4B.js.map → chunk-K3QGG4O2.js.map} +0 -0
  240. /package/dist/{chunk-NH3QZYE5.js.map → chunk-KV4NU3RP.js.map} +0 -0
  241. /package/dist/{chunk-NDSGJZI2.js.map → chunk-LOAYWTJJ.js.map} +0 -0
  242. /package/dist/{chunk-GMDSYLI6.js.map → chunk-MY2Q3FJ3.js.map} +0 -0
  243. /package/dist/{chunk-CV47VCMQ.js.map → chunk-NPVA65KS.js.map} +0 -0
  244. /package/dist/{chunk-7OCGBJLR.js.map → chunk-OIVFHJOA.js.map} +0 -0
  245. /package/dist/{chunk-NN5RYWXA.js.map → chunk-PH65MFQM.js.map} +0 -0
  246. /package/dist/{chunk-TZNNJLGT.js.map → chunk-PMB6TYV4.js.map} +0 -0
  247. /package/dist/{chunk-6YVJVUR4.js.map → chunk-QF2DROQR.js.map} +0 -0
  248. /package/dist/{chunk-XXFSOVL3.js.map → chunk-QFDM23CO.js.map} +0 -0
  249. /package/dist/{chunk-RMLADZRY.js.map → chunk-R7DGN73N.js.map} +0 -0
  250. /package/dist/{chunk-5PNZBH6V.js.map → chunk-V5IYLWRA.js.map} +0 -0
  251. /package/dist/{chunk-KQFIGI37.js.map → chunk-VA6CWUAE.js.map} +0 -0
  252. /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
  253. /package/dist/{chunk-UDCI3QTS.js.map → chunk-ZM2AYHMO.js.map} +0 -0
  254. /package/dist/{git-BXUD6CL5.js.map → claude-ACL7G4CF.js.map} +0 -0
  255. /package/dist/{ignite-IO4LXVXJ.js.map → color-AC6F2QE7.js.map} +0 -0
  256. /package/dist/{commit-DC2Q5CDY.js.map → commit-RILBXFWO.js.map} +0 -0
  257. /package/dist/{compile-4NCQECKE.js.map → compile-QEL5724K.js.map} +0 -0
  258. /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
  259. /package/dist/{feedback-BMAZGKRW.js.map → feedback-I6ZEHEUB.js.map} +0 -0
  260. /package/dist/{mcp/darwin-3JFFE3W2.js.map → git-I3PO6FY7.js.map} +0 -0
  261. /package/dist/{neon-helpers-HWIYRKOW.js.map → ignite-XZFYRVRJ.js.map} +0 -0
  262. /package/dist/{init-CI43GJHV.js.map → init-A6WRP77L.js.map} +0 -0
  263. /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-HXP2TM7G.js.map} +0 -0
  264. /package/dist/{prompt-7LZB4PAT.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
  265. /package/dist/{lint-BSWRMGPZ.js.map → lint-FDZC77GL.js.map} +0 -0
  266. /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
  267. /package/dist/{remote-MZTFHHTU.js.map → mcp/darwin-U25WIGH6.js.map} +0 -0
  268. /package/dist/mcp/{linux-JBVS4R3A.js.map → linux-5BXVBGSY.js.map} +0 -0
  269. /package/dist/mcp/{tmux-RYBLEHUZ.js.map → tmux-CU26ZTNM.js.map} +0 -0
  270. /package/dist/mcp/{wsl-4QZIQLLE.js.map → wsl-KI25UDOF.js.map} +0 -0
  271. /package/dist/{update-notifier-EYLAXZAA.js.map → neon-helpers-LCZAN4U4.js.map} +0 -0
  272. /package/dist/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
  273. /package/dist/{rebase-S6OHAOOF.js.map → rebase-JA3RW2XO.js.map} +0 -0
  274. /package/dist/{recap-GGVCG5VH.js.map → recap-5TO42HN2.js.map} +0 -0
  275. /package/dist/{shell-W4SBQPTE.js.map → shell-GAB2FCXH.js.map} +0 -0
  276. /package/dist/{test-6JH4FE2X.js.map → test-6LFB5WOO.js.map} +0 -0
  277. /package/dist/{test-git-2KFFAQ6B.js.map → test-git-PYJOYSED.js.map} +0 -0
  278. /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-SM7IU5HW.js.map} +0 -0
  279. /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-HIRZBXTM.js.map} +0 -0
  280. /package/dist/{test-tabs-YDWMWTVA.js.map → test-tabs-NGPTFD5T.js.map} +0 -0
  281. /package/dist/{test-webserver-QI3QQFZ3.js.map → test-webserver-43PVP2JL.js.map} +0 -0
  282. /package/dist/{tmux-7ZTA3BDI.js.map → tmux-6LRFH3DM.js.map} +0 -0
  283. /package/dist/{update-XLW7R7FL.js.map → update-AD3GE5C4.js.map} +0 -0
  284. /package/dist/{vscode-TOGE5N67.js.map → vscode-HXIXRZ3A.js.map} +0 -0
  285. /package/dist/{vscode-announcement-NIX7O2MG.js.map → vscode-announcement-AL3EHORH.js.map} +0 -0
  286. /package/dist/{wsl-Y4GUTOQ7.js.map → wsl-4VMVT2PO.js.map} +0 -0
@@ -0,0 +1,304 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ BitBucketApiClient
4
+ } from "./chunk-P5MXXHXQ.js";
5
+ import {
6
+ parseGitRemotes
7
+ } from "./chunk-BZ7KTXPB.js";
8
+ import {
9
+ getLogger
10
+ } from "./chunk-FTYWGQFM.js";
11
+
12
+ // src/lib/providers/bitbucket/BitBucketVCSProvider.ts
13
+ var BitBucketVCSProvider = class _BitBucketVCSProvider {
14
+ constructor(config) {
15
+ this.providerName = "bitbucket";
16
+ this.supportsForks = true;
17
+ this.supportsDraftPRs = false;
18
+ this.client = new BitBucketApiClient(config);
19
+ if (config.reviewers) {
20
+ this.reviewerUsernames = config.reviewers;
21
+ }
22
+ }
23
+ /**
24
+ * Create a BitBucketVCSProvider from IloomSettings
25
+ * Extracts and validates BitBucket config from settings
26
+ */
27
+ static fromSettings(settings) {
28
+ var _a;
29
+ const bbSettings = (_a = settings.versionControl) == null ? void 0 : _a.bitbucket;
30
+ if (!(bbSettings == null ? void 0 : bbSettings.username)) {
31
+ throw new Error("BitBucket username is required. Configure versionControl.bitbucket.username in .iloom/settings.json");
32
+ }
33
+ if (!(bbSettings == null ? void 0 : bbSettings.apiToken)) {
34
+ throw new Error("BitBucket API token is required. Configure versionControl.bitbucket.apiToken in .iloom/settings.local.json");
35
+ }
36
+ const config = {
37
+ username: bbSettings.username,
38
+ apiToken: bbSettings.apiToken
39
+ };
40
+ if (bbSettings.workspace) {
41
+ config.workspace = bbSettings.workspace;
42
+ }
43
+ if (bbSettings.repoSlug) {
44
+ config.repoSlug = bbSettings.repoSlug;
45
+ }
46
+ if (bbSettings.reviewers) {
47
+ config.reviewers = bbSettings.reviewers;
48
+ }
49
+ return new _BitBucketVCSProvider(config);
50
+ }
51
+ /**
52
+ * Check if a PR already exists for the given branch
53
+ */
54
+ async checkForExistingPR(branchName, cwd) {
55
+ try {
56
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
57
+ const prs = await this.client.listPullRequests(workspace, repoSlug, branchName);
58
+ if (prs.length > 0 && prs[0]) {
59
+ const pr = prs[0];
60
+ return {
61
+ number: pr.id,
62
+ url: pr.links.html.href
63
+ };
64
+ }
65
+ return null;
66
+ } catch (error) {
67
+ if (error instanceof Error) {
68
+ const statusMatch = error.message.match(/BitBucket API error \((\d+)\)/);
69
+ if (statusMatch == null ? void 0 : statusMatch[1]) {
70
+ const statusCode = parseInt(statusMatch[1], 10);
71
+ if (statusCode === 401 || statusCode === 403) {
72
+ throw error;
73
+ }
74
+ }
75
+ }
76
+ getLogger().debug("Error checking for existing PR", { error });
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * Create a pull request
82
+ */
83
+ async createPR(branchName, title, body, baseBranch, cwd) {
84
+ var _a, _b;
85
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
86
+ getLogger().info(`Creating BitBucket PR in ${workspace}/${repoSlug}`);
87
+ getLogger().debug("PR details", { branchName, title, baseBranch });
88
+ let reviewerIds;
89
+ if (this.reviewerUsernames && this.reviewerUsernames.length > 0) {
90
+ reviewerIds = await this.resolveReviewerUsernames(workspace, this.reviewerUsernames);
91
+ if (reviewerIds.length > 0) {
92
+ const currentUser = await this.client.getCurrentUser();
93
+ const originalCount = reviewerIds.length;
94
+ reviewerIds = reviewerIds.filter((id) => id !== currentUser.account_id);
95
+ if (reviewerIds.length < originalCount) {
96
+ getLogger().debug(
97
+ `Removed current user (${currentUser.display_name}) from reviewers list - PR author cannot be a reviewer`
98
+ );
99
+ }
100
+ }
101
+ }
102
+ const pr = await this.client.createPullRequest(
103
+ workspace,
104
+ repoSlug,
105
+ title,
106
+ body,
107
+ branchName,
108
+ baseBranch,
109
+ reviewerIds
110
+ );
111
+ if (!(pr == null ? void 0 : pr.id) || !((_b = (_a = pr == null ? void 0 : pr.links) == null ? void 0 : _a.html) == null ? void 0 : _b.href)) {
112
+ getLogger().error("Invalid BitBucket API response", { pr });
113
+ throw new Error(
114
+ `BitBucket API returned invalid PR response. Expected PR with id and links.html.href, got: ${JSON.stringify(pr)}`
115
+ );
116
+ }
117
+ getLogger().info(`BitBucket PR #${pr.id} created successfully`);
118
+ return { url: pr.links.html.href, number: pr.id, wasExisting: false };
119
+ }
120
+ /**
121
+ * Fetch PR details
122
+ */
123
+ async fetchPR(prNumber, cwd) {
124
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
125
+ const bbPR = await this.client.getPullRequest(workspace, repoSlug, prNumber);
126
+ return this.mapBitBucketPRToPullRequest(bbPR);
127
+ }
128
+ /**
129
+ * Get PR URL
130
+ */
131
+ async getPRUrl(prNumber, cwd) {
132
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
133
+ const bbPR = await this.client.getPullRequest(workspace, repoSlug, prNumber);
134
+ return bbPR.links.html.href;
135
+ }
136
+ /**
137
+ * Create a comment on a PR
138
+ */
139
+ async createPRComment(prNumber, body, cwd) {
140
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
141
+ getLogger().debug("Creating BitBucket PR comment", { workspace, repoSlug, prNumber });
142
+ const comment = await this.client.addPRComment(workspace, repoSlug, prNumber, body);
143
+ return { id: String(comment.id), url: comment.links.html.href };
144
+ }
145
+ /**
146
+ * Update an existing comment on a PR
147
+ */
148
+ async updatePRComment(prNumber, commentId, body, cwd) {
149
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
150
+ getLogger().debug("Updating BitBucket PR comment", { workspace, repoSlug, prNumber, commentId });
151
+ const numericCommentId = parseInt(commentId, 10);
152
+ if (isNaN(numericCommentId)) {
153
+ throw new Error(`Invalid comment ID "${commentId}": expected a numeric value`);
154
+ }
155
+ const comment = await this.client.updatePRComment(workspace, repoSlug, prNumber, numericCommentId, body);
156
+ return { id: String(comment.id), url: comment.links.html.href };
157
+ }
158
+ /**
159
+ * Get inline review comments on a PR
160
+ * Fetches all comments and filters for those with inline metadata
161
+ */
162
+ async getReviewComments(prNumber, cwd) {
163
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
164
+ getLogger().debug("Fetching BitBucket PR review comments", { workspace, repoSlug, prNumber });
165
+ const allComments = await this.client.listPRComments(workspace, repoSlug, prNumber);
166
+ const inlineComments = [];
167
+ for (const c of allComments) {
168
+ if (c.inline == null) continue;
169
+ inlineComments.push({
170
+ id: String(c.id),
171
+ body: c.content.raw,
172
+ path: c.inline.path,
173
+ line: c.inline.to ?? c.inline.from ?? null,
174
+ side: null,
175
+ // BitBucket doesn't have a "side" concept like GitHub
176
+ author: c.user ? { id: c.user.uuid, displayName: c.user.display_name } : null,
177
+ createdAt: c.created_on ?? "",
178
+ updatedAt: c.updated_on ?? null,
179
+ inReplyToId: null
180
+ // BitBucket uses nested comments, not reply chains
181
+ });
182
+ }
183
+ return inlineComments;
184
+ }
185
+ /**
186
+ * Create an inline review comment on a specific file and line in a PR
187
+ */
188
+ async createReviewComment(prNumber, path, line, body, cwd) {
189
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
190
+ getLogger().debug("Creating BitBucket inline PR comment", { workspace, repoSlug, prNumber, path, line });
191
+ const comment = await this.client.addInlinePRComment(workspace, repoSlug, prNumber, body, path, line);
192
+ return { id: String(comment.id), url: comment.links.html.href };
193
+ }
194
+ /**
195
+ * List open pull requests for the repository
196
+ * Uses getWorkspaceAndRepo for auto-detection from git remotes
197
+ */
198
+ async listPullRequests(cwd) {
199
+ const { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd);
200
+ return this.client.listPullRequests(workspace, repoSlug);
201
+ }
202
+ /**
203
+ * Detect repository from git remote
204
+ */
205
+ async detectRepository(cwd) {
206
+ try {
207
+ const remotes = await parseGitRemotes(cwd);
208
+ const bbRemote = remotes.find(
209
+ (r) => r.url.includes("bitbucket.org")
210
+ );
211
+ if (!bbRemote) {
212
+ return null;
213
+ }
214
+ return {
215
+ owner: bbRemote.owner,
216
+ // workspace
217
+ repo: bbRemote.repo
218
+ };
219
+ } catch (error) {
220
+ getLogger().error("Failed to detect BitBucket repository", { error });
221
+ return null;
222
+ }
223
+ }
224
+ /**
225
+ * Get target remote for PR operations
226
+ */
227
+ async getTargetRemote(_cwd) {
228
+ return "origin";
229
+ }
230
+ /**
231
+ * Get workspace and repository slug from config or git remote
232
+ */
233
+ async getWorkspaceAndRepo(cwd) {
234
+ let workspace = this.client.getWorkspace();
235
+ let repoSlug = this.client.getRepoSlug();
236
+ if (!workspace || !repoSlug) {
237
+ const detected = await this.detectRepository(cwd);
238
+ if (!detected) {
239
+ throw new Error(
240
+ "Could not determine BitBucket workspace/repository. Either configure them in settings or ensure git remote points to bitbucket.org"
241
+ );
242
+ }
243
+ workspace = workspace ?? detected.owner;
244
+ repoSlug = repoSlug ?? detected.repo;
245
+ }
246
+ return { workspace, repoSlug };
247
+ }
248
+ /**
249
+ * Resolve reviewer usernames to BitBucket account IDs
250
+ * Warns for any usernames that cannot be resolved but continues with partial list
251
+ */
252
+ async resolveReviewerUsernames(workspace, usernames) {
253
+ getLogger().debug(`Resolving ${usernames.length} reviewer username(s) to BitBucket account IDs`);
254
+ const usernameToAccountId = await this.client.findUsersByUsername(workspace, usernames);
255
+ const resolvedIds = [];
256
+ const unresolvedUsernames = [];
257
+ for (const username of usernames) {
258
+ const accountId = usernameToAccountId.get(username);
259
+ if (accountId) {
260
+ resolvedIds.push(accountId);
261
+ } else {
262
+ unresolvedUsernames.push(username);
263
+ }
264
+ }
265
+ if (unresolvedUsernames.length > 0) {
266
+ getLogger().warn(
267
+ `Could not resolve ${unresolvedUsernames.length} reviewer username(s) to BitBucket account IDs: ${unresolvedUsernames.join(", ")}. These reviewers will not be added to the PR.`
268
+ );
269
+ }
270
+ if (resolvedIds.length > 0) {
271
+ getLogger().info(`Resolved ${resolvedIds.length} reviewer(s) for PR`);
272
+ }
273
+ return resolvedIds;
274
+ }
275
+ /**
276
+ * Map BitBucket PR to generic PullRequest type
277
+ */
278
+ mapBitBucketPRToPullRequest(bbPR) {
279
+ let state;
280
+ if (bbPR.state === "OPEN") {
281
+ state = "open";
282
+ } else if (bbPR.state === "MERGED") {
283
+ state = "merged";
284
+ } else {
285
+ state = "closed";
286
+ }
287
+ return {
288
+ number: bbPR.id,
289
+ title: bbPR.title,
290
+ body: bbPR.description,
291
+ state,
292
+ branch: bbPR.source.branch.name,
293
+ baseBranch: bbPR.destination.branch.name,
294
+ url: bbPR.links.html.href,
295
+ isDraft: false
296
+ // BitBucket doesn't have draft PRs
297
+ };
298
+ }
299
+ };
300
+
301
+ export {
302
+ BitBucketVCSProvider
303
+ };
304
+ //# sourceMappingURL=chunk-QC65IOV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/providers/bitbucket/BitBucketVCSProvider.ts"],"sourcesContent":["// BitBucketVCSProvider - Implements VersionControlProvider for BitBucket\n// Provides PR/VCS operations via BitBucket REST API\n\nimport type { VersionControlProvider, ExistingPR, PRCreationResult, ReviewComment } from '../../VersionControlProvider.js'\nimport type { PullRequest } from '../../../types/index.js'\nimport { BitBucketApiClient, type BitBucketConfig, type BitBucketPullRequest } from './BitBucketApiClient.js'\nimport type { IloomSettings } from '../../SettingsManager.js'\nimport { getLogger } from '../../../utils/logger-context.js'\nimport { parseGitRemotes } from '../../../utils/remote.js'\n\n/**\n * BitBucket-specific configuration\n * Extends BitBucketConfig with username, appPassword, workspace, and repoSlug\n */\nexport interface BitBucketVCSConfig extends BitBucketConfig {\n\treviewers?: string[] // Usernames of reviewers to add to PRs\n}\n\n/**\n * BitBucketVCSProvider implements VersionControlProvider for BitBucket\n * \n * Key differences from GitHub:\n * - Uses workspace/repository slug instead of owner/repo\n * - PR states are different (OPEN, MERGED, DECLINED, SUPERSEDED)\n * - No native draft PR support\n */\nexport class BitBucketVCSProvider implements VersionControlProvider {\n\treadonly providerName = 'bitbucket'\n\treadonly supportsForks = true\n\treadonly supportsDraftPRs = false // BitBucket doesn't have draft PRs\n\n\tprivate readonly client: BitBucketApiClient\n\tprivate readonly reviewerUsernames?: string[]\n\n\t/**\n\t * Create a BitBucketVCSProvider from IloomSettings\n\t * Extracts and validates BitBucket config from settings\n\t */\n\tstatic fromSettings(settings: IloomSettings): BitBucketVCSProvider {\n\t\tconst bbSettings = settings.versionControl?.bitbucket\n\n\t\tif (!bbSettings?.username) {\n\t\t\tthrow new Error('BitBucket username is required. Configure versionControl.bitbucket.username in .iloom/settings.json')\n\t\t}\n\t\tif (!bbSettings?.apiToken) {\n\t\t\tthrow new Error('BitBucket API token is required. Configure versionControl.bitbucket.apiToken in .iloom/settings.local.json')\n\t\t}\n\n\t\tconst config: BitBucketVCSConfig = {\n\t\t\tusername: bbSettings.username,\n\t\t\tapiToken: bbSettings.apiToken,\n\t\t}\n\n\t\tif (bbSettings.workspace) {\n\t\t\tconfig.workspace = bbSettings.workspace\n\t\t}\n\t\tif (bbSettings.repoSlug) {\n\t\t\tconfig.repoSlug = bbSettings.repoSlug\n\t\t}\n\t\tif (bbSettings.reviewers) {\n\t\t\tconfig.reviewers = bbSettings.reviewers\n\t\t}\n\n\t\treturn new BitBucketVCSProvider(config)\n\t}\n\n\tconstructor(config: BitBucketVCSConfig) {\n\t\tthis.client = new BitBucketApiClient(config)\n\t\tif (config.reviewers) {\n\t\t\tthis.reviewerUsernames = config.reviewers\n\t\t}\n\t}\n\n\t/**\n\t * Check if a PR already exists for the given branch\n\t */\n\tasync checkForExistingPR(branchName: string, cwd?: string): Promise<ExistingPR | null> {\n\t\ttry {\n\t\t\t// Get workspace and repo slug from config or detect from git remote\n\t\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\t\tconst prs = await this.client.listPullRequests(workspace, repoSlug, branchName)\n\t\t\t\n\t\t\tif (prs.length > 0 && prs[0]) {\n\t\t\t\tconst pr = prs[0]\n\t\t\t\treturn {\n\t\t\t\t\tnumber: pr.id,\n\t\t\t\t\turl: pr.links.html.href,\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error) {\n\t\t\t\tconst statusMatch = error.message.match(/BitBucket API error \\((\\d+)\\)/)\n\t\t\t\tif (statusMatch?.[1]) {\n\t\t\t\t\tconst statusCode = parseInt(statusMatch[1], 10)\n\t\t\t\t\tif (statusCode === 401 || statusCode === 403) {\n\t\t\t\t\t\tthrow error\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tgetLogger().debug('Error checking for existing PR', { error })\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Create a pull request\n\t */\n\tasync createPR(\n\t\tbranchName: string,\n\t\ttitle: string,\n\t\tbody: string,\n\t\tbaseBranch: string,\n\t\tcwd?: string\n\t): Promise<PRCreationResult> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\t// Log the target repository so users can verify it's correct\n\t\tgetLogger().info(`Creating BitBucket PR in ${workspace}/${repoSlug}`)\n\t\tgetLogger().debug('PR details', { branchName, title, baseBranch })\n\n\t\t// Resolve reviewer usernames to account IDs if configured\n\t\tlet reviewerIds: string[] | undefined\n\t\tif (this.reviewerUsernames && this.reviewerUsernames.length > 0) {\n\t\t\treviewerIds = await this.resolveReviewerUsernames(workspace, this.reviewerUsernames)\n\n\t\t\t// Filter out the current user from reviewers (BitBucket doesn't allow PR author as reviewer)\n\t\t\tif (reviewerIds.length > 0) {\n\t\t\t\tconst currentUser = await this.client.getCurrentUser()\n\t\t\t\tconst originalCount = reviewerIds.length\n\t\t\t\treviewerIds = reviewerIds.filter(id => id !== currentUser.account_id)\n\n\t\t\t\tif (reviewerIds.length < originalCount) {\n\t\t\t\t\tgetLogger().debug(\n\t\t\t\t\t\t`Removed current user (${currentUser.display_name}) from reviewers list - PR author cannot be a reviewer`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst pr = await this.client.createPullRequest(\n\t\t\tworkspace,\n\t\t\trepoSlug,\n\t\t\ttitle,\n\t\t\tbody,\n\t\t\tbranchName,\n\t\t\tbaseBranch,\n\t\t\treviewerIds\n\t\t)\n\n\t\t// Validate the response structure\n\t\tif (!pr?.id || !pr?.links?.html?.href) {\n\t\t\tgetLogger().error('Invalid BitBucket API response', { pr })\n\t\t\tthrow new Error(\n\t\t\t\t`BitBucket API returned invalid PR response. ` +\n\t\t\t\t`Expected PR with id and links.html.href, got: ${JSON.stringify(pr)}`\n\t\t\t)\n\t\t}\n\n\t\tgetLogger().info(`BitBucket PR #${pr.id} created successfully`)\n\t\treturn { url: pr.links.html.href, number: pr.id, wasExisting: false }\n\t}\n\n\t/**\n\t * Fetch PR details\n\t */\n\tasync fetchPR(prNumber: number, cwd?: string): Promise<PullRequest> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tconst bbPR = await this.client.getPullRequest(workspace, repoSlug, prNumber)\n\t\treturn this.mapBitBucketPRToPullRequest(bbPR)\n\t}\n\n\t/**\n\t * Get PR URL\n\t */\n\tasync getPRUrl(prNumber: number, cwd?: string): Promise<string> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tconst bbPR = await this.client.getPullRequest(workspace, repoSlug, prNumber)\n\t\treturn bbPR.links.html.href\n\t}\n\n\t/**\n\t * Create a comment on a PR\n\t */\n\tasync createPRComment(prNumber: number, body: string, cwd?: string): Promise<{ id: string; url: string }> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tgetLogger().debug('Creating BitBucket PR comment', { workspace, repoSlug, prNumber })\n\n\t\tconst comment = await this.client.addPRComment(workspace, repoSlug, prNumber, body)\n\t\treturn { id: String(comment.id), url: comment.links.html.href }\n\t}\n\n\t/**\n\t * Update an existing comment on a PR\n\t */\n\tasync updatePRComment(prNumber: number, commentId: string, body: string, cwd?: string): Promise<{ id: string; url: string }> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tgetLogger().debug('Updating BitBucket PR comment', { workspace, repoSlug, prNumber, commentId })\n\n\t\tconst numericCommentId = parseInt(commentId, 10)\n\t\tif (isNaN(numericCommentId)) {\n\t\t\tthrow new Error(`Invalid comment ID \"${commentId}\": expected a numeric value`)\n\t\t}\n\n\t\tconst comment = await this.client.updatePRComment(workspace, repoSlug, prNumber, numericCommentId, body)\n\t\treturn { id: String(comment.id), url: comment.links.html.href }\n\t}\n\n\t/**\n\t * Get inline review comments on a PR\n\t * Fetches all comments and filters for those with inline metadata\n\t */\n\tasync getReviewComments(prNumber: number, cwd?: string): Promise<ReviewComment[]> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tgetLogger().debug('Fetching BitBucket PR review comments', { workspace, repoSlug, prNumber })\n\n\t\tconst allComments = await this.client.listPRComments(workspace, repoSlug, prNumber)\n\n\t\t// Filter for inline comments only (those with inline metadata) and map to ReviewComment\n\t\tconst inlineComments: ReviewComment[] = []\n\t\tfor (const c of allComments) {\n\t\t\tif (c.inline == null) continue\n\t\t\tinlineComments.push({\n\t\t\t\tid: String(c.id),\n\t\t\t\tbody: c.content.raw,\n\t\t\t\tpath: c.inline.path,\n\t\t\t\tline: c.inline.to ?? c.inline.from ?? null,\n\t\t\t\tside: null, // BitBucket doesn't have a \"side\" concept like GitHub\n\t\t\t\tauthor: c.user\n\t\t\t\t\t? { id: c.user.uuid, displayName: c.user.display_name }\n\t\t\t\t\t: null,\n\t\t\t\tcreatedAt: c.created_on ?? '',\n\t\t\t\tupdatedAt: c.updated_on ?? null,\n\t\t\t\tinReplyToId: null, // BitBucket uses nested comments, not reply chains\n\t\t\t})\n\t\t}\n\t\treturn inlineComments\n\t}\n\n\t/**\n\t * Create an inline review comment on a specific file and line in a PR\n\t */\n\tasync createReviewComment(prNumber: number, path: string, line: number, body: string, cwd?: string): Promise<{ id: string; url: string }> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\n\t\tgetLogger().debug('Creating BitBucket inline PR comment', { workspace, repoSlug, prNumber, path, line })\n\n\t\tconst comment = await this.client.addInlinePRComment(workspace, repoSlug, prNumber, body, path, line)\n\t\treturn { id: String(comment.id), url: comment.links.html.href }\n\t}\n\n\t/**\n\t * List open pull requests for the repository\n\t * Uses getWorkspaceAndRepo for auto-detection from git remotes\n\t */\n\tasync listPullRequests(cwd?: string): Promise<BitBucketPullRequest[]> {\n\t\tconst { workspace, repoSlug } = await this.getWorkspaceAndRepo(cwd)\n\t\treturn this.client.listPullRequests(workspace, repoSlug)\n\t}\n\n\t/**\n\t * Detect repository from git remote\n\t */\n\tasync detectRepository(cwd?: string): Promise<{ owner: string; repo: string } | null> {\n\t\ttry {\n\t\t\tconst remotes = await parseGitRemotes(cwd)\n\t\t\t\n\t\t\t// Look for bitbucket.org remote\n\t\t\tconst bbRemote = remotes.find(r => \n\t\t\t\tr.url.includes('bitbucket.org')\n\t\t\t)\n\n\t\t\tif (!bbRemote) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// BitBucket URLs: https://bitbucket.org/workspace/repo.git\n\t\t\t// or git@bitbucket.org:workspace/repo.git\n\t\t\treturn {\n\t\t\t\towner: bbRemote.owner, // workspace\n\t\t\t\trepo: bbRemote.repo,\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tgetLogger().error('Failed to detect BitBucket repository', { error })\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Get target remote for PR operations\n\t */\n\tasync getTargetRemote(_cwd?: string): Promise<string> {\n\t\t// For BitBucket, we typically use 'origin'\n\t\t// Fork workflows are less common in BitBucket\n\t\treturn 'origin'\n\t}\n\n\t/**\n\t * Get workspace and repository slug from config or git remote\n\t */\n\tprivate async getWorkspaceAndRepo(cwd?: string): Promise<{ workspace: string; repoSlug: string }> {\n\t\tlet workspace = this.client.getWorkspace()\n\t\tlet repoSlug = this.client.getRepoSlug()\n\n\t\t// If not configured, try to detect from git remote\n\t\tif (!workspace || !repoSlug) {\n\t\t\tconst detected = await this.detectRepository(cwd)\n\t\t\tif (!detected) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Could not determine BitBucket workspace/repository. ' +\n\t\t\t\t\t'Either configure them in settings or ensure git remote points to bitbucket.org'\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tworkspace = workspace ?? detected.owner\n\t\t\trepoSlug = repoSlug ?? detected.repo\n\t\t}\n\n\t\treturn { workspace, repoSlug }\n\t}\n\n\t/**\n\t * Resolve reviewer usernames to BitBucket account IDs\n\t * Warns for any usernames that cannot be resolved but continues with partial list\n\t */\n\tprivate async resolveReviewerUsernames(workspace: string, usernames: string[]): Promise<string[]> {\n\t\tgetLogger().debug(`Resolving ${usernames.length} reviewer username(s) to BitBucket account IDs`)\n\n\t\tconst usernameToAccountId = await this.client.findUsersByUsername(workspace, usernames)\n\n\t\tconst resolvedIds: string[] = []\n\t\tconst unresolvedUsernames: string[] = []\n\n\t\tfor (const username of usernames) {\n\t\t\tconst accountId = usernameToAccountId.get(username)\n\t\t\tif (accountId) {\n\t\t\t\tresolvedIds.push(accountId)\n\t\t\t} else {\n\t\t\t\tunresolvedUsernames.push(username)\n\t\t\t}\n\t\t}\n\n\t\tif (unresolvedUsernames.length > 0) {\n\t\t\tgetLogger().warn(\n\t\t\t\t`Could not resolve ${unresolvedUsernames.length} reviewer username(s) to BitBucket account IDs: ${unresolvedUsernames.join(', ')}. ` +\n\t\t\t\t`These reviewers will not be added to the PR.`\n\t\t\t)\n\t\t}\n\n\t\tif (resolvedIds.length > 0) {\n\t\t\tgetLogger().info(`Resolved ${resolvedIds.length} reviewer(s) for PR`)\n\t\t}\n\n\t\treturn resolvedIds\n\t}\n\n\t/**\n\t * Map BitBucket PR to generic PullRequest type\n\t */\n\tprivate mapBitBucketPRToPullRequest(bbPR: BitBucketPullRequest): PullRequest {\n\t\t// Map BitBucket states to generic states\n\t\tlet state: 'open' | 'closed' | 'merged'\n\t\tif (bbPR.state === 'OPEN') {\n\t\t\tstate = 'open'\n\t\t} else if (bbPR.state === 'MERGED') {\n\t\t\tstate = 'merged'\n\t\t} else {\n\t\t\tstate = 'closed' // DECLINED or SUPERSEDED\n\t\t}\n\n\t\treturn {\n\t\t\tnumber: bbPR.id,\n\t\t\ttitle: bbPR.title,\n\t\t\tbody: bbPR.description,\n\t\t\tstate,\n\t\t\tbranch: bbPR.source.branch.name,\n\t\t\tbaseBranch: bbPR.destination.branch.name,\n\t\t\turl: bbPR.links.html.href,\n\t\t\tisDraft: false, // BitBucket doesn't have draft PRs\n\t\t}\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ClaudeService
4
- } from "./chunk-KQFIGI37.js";
4
+ } from "./chunk-VA6CWUAE.js";
5
5
  import {
6
6
  logger
7
- } from "./chunk-H2SSF24U.js";
7
+ } from "./chunk-VRPPI6GU.js";
8
8
 
9
9
  // src/lib/ClaudeContextManager.ts
10
10
  var ClaudeContextManager = class {
@@ -63,4 +63,4 @@ var ClaudeContextManager = class {
63
63
  export {
64
64
  ClaudeContextManager
65
65
  };
66
- //# sourceMappingURL=chunk-6YVJVUR4.js.map
66
+ //# sourceMappingURL=chunk-QF2DROQR.js.map
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  findMainWorktreePathWithSettings
4
- } from "./chunk-3RXYOBME.js";
4
+ } from "./chunk-OPQC4OWM.js";
5
5
  import {
6
6
  MetadataManager
7
- } from "./chunk-YRCEOQPX.js";
7
+ } from "./chunk-4JZEQBWV.js";
8
8
  import {
9
9
  getLogger
10
- } from "./chunk-ZAXRQLK3.js";
10
+ } from "./chunk-FTYWGQFM.js";
11
11
 
12
12
  // src/utils/recap-archiver.ts
13
13
  import path from "path";
@@ -70,4 +70,4 @@ export {
70
70
  archiveRecap,
71
71
  findArchivedRecap
72
72
  };
73
- //# sourceMappingURL=chunk-XXFSOVL3.js.map
73
+ //# sourceMappingURL=chunk-QFDM23CO.js.map
@@ -18,7 +18,7 @@ import {
18
18
  getLinearIssueDependencies,
19
19
  updateLinearComment,
20
20
  updateLinearIssueState
21
- } from "./chunk-5LTID2AF.js";
21
+ } from "./chunk-DMSL5BAP.js";
22
22
  import {
23
23
  addSubIssue,
24
24
  closeGhIssue,
@@ -35,13 +35,13 @@ import {
35
35
  removeIssueDependency,
36
36
  reopenGhIssue,
37
37
  updateIssueComment
38
- } from "./chunk-NH3QZYE5.js";
38
+ } from "./chunk-KV4NU3RP.js";
39
39
  import {
40
40
  SettingsManager
41
- } from "./chunk-ET6A2JR4.js";
41
+ } from "./chunk-653XBU3L.js";
42
42
  import {
43
43
  logger
44
- } from "./chunk-H2SSF24U.js";
44
+ } from "./chunk-VRPPI6GU.js";
45
45
 
46
46
  // src/utils/image-processor.ts
47
47
  import { tmpdir } from "os";
@@ -1436,4 +1436,4 @@ var IssueManagementProviderFactory = class {
1436
1436
  export {
1437
1437
  IssueManagementProviderFactory
1438
1438
  };
1439
- //# sourceMappingURL=chunk-RMLADZRY.js.map
1439
+ //# sourceMappingURL=chunk-R7DGN73N.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  calculatePortFromIdentifier
4
- } from "./chunk-HLDY5S4C.js";
4
+ } from "./chunk-BFF27W3S.js";
5
5
 
6
6
  // src/lib/process/ProcessManager.ts
7
7
  import { execa } from "execa";
@@ -179,4 +179,4 @@ var ProcessManager = class {
179
179
  export {
180
180
  ProcessManager
181
181
  };
182
- //# sourceMappingURL=chunk-5PNZBH6V.js.map
182
+ //# sourceMappingURL=chunk-V5IYLWRA.js.map
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ PromptTemplateManager
4
+ } from "./chunk-7RCUWU3I.js";
2
5
  import {
3
6
  detectClaudeCli,
4
7
  launchClaude,
5
8
  launchClaudeInNewTerminalWindow
6
- } from "./chunk-Y3RX7LZT.js";
7
- import {
8
- PromptTemplateManager
9
- } from "./chunk-WG4MLJ6J.js";
9
+ } from "./chunk-DDHWZNGL.js";
10
10
  import {
11
11
  SettingsManager
12
- } from "./chunk-ET6A2JR4.js";
12
+ } from "./chunk-653XBU3L.js";
13
13
  import {
14
14
  logger
15
- } from "./chunk-H2SSF24U.js";
15
+ } from "./chunk-VRPPI6GU.js";
16
16
 
17
17
  // src/lib/ClaudeService.ts
18
18
  var ClaudeService = class {
@@ -121,4 +121,4 @@ var ClaudeService = class {
121
121
  export {
122
122
  ClaudeService
123
123
  };
124
- //# sourceMappingURL=chunk-KQFIGI37.js.map
124
+ //# sourceMappingURL=chunk-VA6CWUAE.js.map
@@ -1,10 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getPackageScripts
4
- } from "./chunk-NCPZYQ4B.js";
4
+ } from "./chunk-K3QGG4O2.js";
5
5
  import {
6
6
  getLogger
7
- } from "./chunk-ZAXRQLK3.js";
7
+ } from "./chunk-FTYWGQFM.js";
8
+ import {
9
+ restoreTerminalState
10
+ } from "./chunk-VRPPI6GU.js";
8
11
 
9
12
  // src/utils/package-manager.ts
10
13
  import { execa } from "execa";
@@ -116,6 +119,11 @@ async function runScript(scriptName, cwd, args = [], options = {}) {
116
119
  env.CI = "true";
117
120
  }
118
121
  const stdio = options.foreground ? "inherit" : options.quiet ? "pipe" : "inherit";
122
+ const onSigint = () => {
123
+ };
124
+ if (options.foreground) {
125
+ process.on("SIGINT", onSigint);
126
+ }
119
127
  try {
120
128
  let execaProcess;
121
129
  if (scriptConfig.source === "iloom-config") {
@@ -151,8 +159,16 @@ async function runScript(scriptName, cwd, args = [], options = {}) {
151
159
  return result;
152
160
  } catch (error) {
153
161
  const execaError = error;
162
+ if (options.foreground && execaError.signal === "SIGINT") {
163
+ return {};
164
+ }
154
165
  const stderr = execaError.stderr ?? execaError.message ?? "Unknown error";
155
166
  throw new Error(`Failed to run script '${scriptName}': ${stderr}`);
167
+ } finally {
168
+ if (options.foreground) {
169
+ process.removeListener("SIGINT", onSigint);
170
+ restoreTerminalState();
171
+ }
156
172
  }
157
173
  }
158
174
 
@@ -161,4 +177,4 @@ export {
161
177
  installDependencies,
162
178
  runScript
163
179
  };
164
- //# sourceMappingURL=chunk-3GTUXW26.js.map
180
+ //# sourceMappingURL=chunk-VIQOQ463.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/package-manager.ts"],"sourcesContent":["import { execa, type ExecaError } from 'execa'\nimport { getLogger } from './logger-context.js'\nimport { getPackageScripts } from './package-json.js'\nimport { restoreTerminalState } from './terminal.js'\nimport fs from 'fs-extra'\nimport path from 'path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn'\n\n/**\n * Validate if a string is a supported package manager\n */\nfunction isValidPackageManager(manager: string): manager is PackageManager {\n return manager === 'pnpm' || manager === 'npm' || manager === 'yarn'\n}\n\n/**\n * Detect which package manager to use for a project\n * Checks in order:\n * 1. packageManager field in package.json (Node.js standard)\n * 2. Lock files (pnpm-lock.yaml, package-lock.json, yarn.lock)\n * 3. Installed package managers (system-wide check)\n * 4. Defaults to npm if all detection fails\n *\n * @param cwd Working directory to detect package manager in (defaults to process.cwd())\n * @returns The detected package manager, or 'npm' as default\n */\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManager> {\n // 1. Check packageManager field in package.json\n try {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (await fs.pathExists(packageJsonPath)) {\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonContent)\n\n if (packageJson.packageManager) {\n // Parse \"pnpm@8.15.0\" or \"pnpm@10.16.1+sha512...\" -> \"pnpm\"\n const manager = packageJson.packageManager.split('@')[0]\n if (isValidPackageManager(manager)) {\n getLogger().debug(`Detected package manager from package.json: ${manager}`)\n return manager\n }\n }\n }\n } catch (error) {\n // If package.json doesn't exist, is malformed, or unreadable, continue to next detection method\n getLogger().debug(`Could not read packageManager from package.json: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n // 2. Check lock files (priority: pnpm > npm > yarn)\n const lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'yarn.lock', manager: 'yarn' },\n ]\n\n for (const { file, manager } of lockFiles) {\n if (await fs.pathExists(path.join(cwd, file))) {\n getLogger().debug(`Detected package manager from lock file ${file}: ${manager}`)\n return manager\n }\n }\n\n // 3. Check installed package managers (original behavior)\n const managers: PackageManager[] = ['pnpm', 'npm', 'yarn']\n for (const manager of managers) {\n try {\n await execa(manager, ['--version'])\n getLogger().debug(`Detected installed package manager: ${manager}`)\n return manager\n } catch {\n // Continue to next manager\n }\n }\n\n // 4. Default to npm (always available in Node.js environments)\n getLogger().debug('No package manager detected, defaulting to npm')\n return 'npm'\n}\n\n/**\n * Install dependencies using the detected package manager\n * @param cwd Working directory to run install in\n * @param frozen Whether to use frozen lockfile (for production installs)\n * @param quiet Whether to suppress command output (default: false)\n * @returns true if installation succeeded, throws Error on failure\n */\nexport async function installDependencies(\n cwd: string,\n frozen: boolean = true,\n quiet: boolean = false\n): Promise<void> {\n // Check if working directory is provided\n if (!cwd) {\n getLogger().debug('Skipping dependency installation - no working directory provided')\n return\n }\n\n // Check for install script in package.iloom.json or package.json\n const scripts = await getPackageScripts(cwd)\n if (scripts.install) {\n getLogger().info('Installing dependencies with install script...')\n // runScript handles both iloom-config (shell execution) and package-manager (npm/pnpm/yarn) sources\n await runScript('install', cwd, [], { quiet })\n getLogger().success('Dependencies installed successfully')\n return\n }\n\n // Fall back to Node.js package manager detection for projects without install script\n const pkgPath = path.join(cwd, 'package.json')\n if (!(await fs.pathExists(pkgPath))) {\n getLogger().debug('Skipping dependency installation - no package.json found and no install script')\n return\n }\n\n const packageManager = await detectPackageManager(cwd)\n\n getLogger().info(`Installing dependencies with ${packageManager}...`)\n\n const args: string[] = ['install']\n\n // Add frozen lockfile flag based on package manager\n if (frozen) {\n switch (packageManager) {\n case 'pnpm':\n args.push('--frozen-lockfile')\n break\n case 'yarn':\n args.push('--frozen-lockfile')\n break\n case 'npm':\n args.shift() // Remove 'install'\n args.push('ci') // npm ci is equivalent to frozen lockfile\n break\n }\n }\n\n try {\n await execa(packageManager, args, {\n cwd,\n stdio: quiet ? 'pipe' : 'inherit',\n timeout: 300000, // 5 minute timeout for install\n })\n\n getLogger().success('Dependencies installed successfully')\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr ?? execaError.message ?? 'Unknown error'\n throw new Error(`Failed to install dependencies: ${stderr}`)\n }\n}\n\n/**\n * Options for running a script\n */\nexport interface RunScriptOptions {\n /** Suppress command output (default: false) */\n quiet?: boolean\n /** Custom environment variables merged with process.env */\n env?: Record<string, string>\n /** Use inherited stdio, return process info (default: false) */\n foreground?: boolean\n /** Callback when process starts, receives PID */\n onStart?: (pid?: number) => void\n /** Don't set CI=true (for dev servers, default: false) */\n noCi?: boolean\n}\n\n/**\n * Run a package.json or iloom config script\n * Automatically detects whether to use package manager or direct shell execution\n * based on the script source.\n *\n * @param scriptName The script name from package.json or package.iloom.json\n * @param cwd Working directory\n * @param args Additional arguments to pass to the script\n * @param options Execution options\n * @returns Object with pid when foreground mode is enabled\n */\nexport async function runScript(\n scriptName: string,\n cwd: string,\n args: string[] = [],\n options: RunScriptOptions = {}\n): Promise<{ pid?: number }> {\n // Get scripts with source metadata\n const scripts = await getPackageScripts(cwd)\n const scriptConfig = scripts[scriptName]\n\n const isDebugMode = getLogger().isDebugEnabled()\n\n if (!scriptConfig) {\n throw new Error(`Script '${scriptName}' not found`)\n }\n\n // Build environment variables\n const env: Record<string, string> = {\n ...process.env as Record<string, string>,\n ...options.env,\n }\n\n // Add CI=true unless noCi is set\n if (!options.noCi) {\n env.CI = 'true'\n }\n\n // Determine stdio mode\n const stdio = options.foreground ? 'inherit' : (options.quiet ? 'pipe' : 'inherit')\n\n // For foreground mode, register a no-op SIGINT handler to prevent signal-exit\n // (used internally by execa) from re-raising SIGINT and killing the process\n // before finally blocks can run. This ensures terminal state is restored on Ctrl+C.\n const onSigint = (): void => {}\n if (options.foreground) {\n process.on('SIGINT', onSigint)\n }\n\n try {\n let execaProcess\n\n if (scriptConfig.source === 'iloom-config') {\n // Execute directly as shell command (for non-Node.js projects)\n // Use \"$@\" pattern to properly handle argument escaping via the shell\n getLogger().debug(`Executing shell command: ${scriptConfig.command} with args: ${args.join(' ')}`)\n\n execaProcess = execa('sh', ['-c', `${scriptConfig.command} \"$@\"`, '--', ...args], {\n cwd,\n stdio,\n ...(!options.foreground && { timeout: 600000 }), // No timeout for foreground mode\n env,\n verbose: isDebugMode,\n })\n } else {\n // Execute via package manager (for Node.js projects)\n const packageManager = await detectPackageManager(cwd)\n const command = packageManager === 'npm' ? ['run', scriptName] : [scriptName]\n\n execaProcess = execa(packageManager, [...command, ...args], {\n cwd,\n stdio,\n ...(!options.foreground && { timeout: 600000 }), // No timeout for foreground mode\n env,\n verbose: isDebugMode,\n })\n }\n\n // For foreground mode, get PID and call onStart callback immediately\n const result: { pid?: number } = {}\n if (options.foreground && execaProcess.pid !== undefined) {\n result.pid = execaProcess.pid\n }\n\n // Call onStart callback if provided\n if (options.onStart) {\n options.onStart(result.pid)\n }\n\n // Wait for process to complete\n await execaProcess\n\n return result\n } catch (error) {\n const execaError = error as ExecaError\n // If the process was killed by SIGINT, the user intentionally cancelled — return silently\n if (options.foreground && execaError.signal === 'SIGINT') {\n return {}\n }\n const stderr = execaError.stderr ?? execaError.message ?? 'Unknown error'\n throw new Error(`Failed to run script '${scriptName}': ${stderr}`)\n } finally {\n if (options.foreground) {\n process.removeListener('SIGINT', onSigint)\n restoreTerminalState()\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -15,6 +15,7 @@ import dotenvFlow from "dotenv-flow";
15
15
  import chalk, { Chalk } from "chalk";
16
16
 
17
17
  // src/utils/terminal.ts
18
+ import { execSync } from "child_process";
18
19
  import { execa } from "execa";
19
20
 
20
21
  // src/utils/platform-detect.ts
@@ -65,23 +66,23 @@ async function getTerminalBackend() {
65
66
  const env = detectTerminalEnvironment();
66
67
  switch (env) {
67
68
  case "darwin": {
68
- const { DarwinBackend: DarwinBackend2 } = await import("./darwin-5BHWRJ7D.js");
69
+ const { DarwinBackend: DarwinBackend2 } = await import("./darwin-5K3I4FTH.js");
69
70
  return new DarwinBackend2();
70
71
  }
71
72
  case "wsl": {
72
- const { WSLBackend } = await import("./wsl-Y4GUTOQ7.js");
73
+ const { WSLBackend } = await import("./wsl-4VMVT2PO.js");
73
74
  return new WSLBackend();
74
75
  }
75
76
  case "linux": {
76
77
  const hasDisplay = !!(process.env.DISPLAY ?? process.env.WAYLAND_DISPLAY);
77
78
  if (hasDisplay) {
78
- const { detectLinuxTerminal } = await import("./linux-RYLOP2LY.js");
79
+ const { detectLinuxTerminal } = await import("./linux-WUGRYCJY.js");
79
80
  if (await detectLinuxTerminal()) {
80
- const { LinuxBackend } = await import("./linux-RYLOP2LY.js");
81
+ const { LinuxBackend } = await import("./linux-WUGRYCJY.js");
81
82
  return new LinuxBackend();
82
83
  }
83
84
  }
84
- const { isTmuxAvailable, TmuxBackend } = await import("./tmux-7ZTA3BDI.js");
85
+ const { isTmuxAvailable, TmuxBackend } = await import("./tmux-6LRFH3DM.js");
85
86
  if (await isTmuxAvailable()) {
86
87
  return new TmuxBackend();
87
88
  }
@@ -129,6 +130,15 @@ async function openMultipleTerminalWindows(optionsArray) {
129
130
  const backend = await getTerminalBackend();
130
131
  await backend.openMultiple(optionsArray);
131
132
  }
133
+ function restoreTerminalState() {
134
+ if (!process.stdin.isTTY) {
135
+ return;
136
+ }
137
+ try {
138
+ execSync("stty sane", { stdio: "ignore" });
139
+ } catch {
140
+ }
141
+ }
132
142
 
133
143
  // src/utils/logger.ts
134
144
  var stdoutChalk = new Chalk({ level: chalk.level });
@@ -646,8 +656,9 @@ export {
646
656
  detectITerm22,
647
657
  openTerminalWindow,
648
658
  openMultipleTerminalWindows,
659
+ restoreTerminalState,
649
660
  logger,
650
661
  createStderrLogger,
651
662
  logger_default
652
663
  };
653
- //# sourceMappingURL=chunk-H2SSF24U.js.map
664
+ //# sourceMappingURL=chunk-VRPPI6GU.js.map