@iloom/cli 0.11.1 → 0.13.0-beta.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 (290) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +170 -15
  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-RRGREEZQ.js +14 -0
  7. package/dist/ClaudeService-LEPW6QAC.js +13 -0
  8. package/dist/GitHubService-UTAYZXL3.js +12 -0
  9. package/dist/IssueTrackerFactory-KE2BDCLC.js +15 -0
  10. package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-GKQMR5E6.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 +170 -15
  15. package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-KQU7OX7G.js} +15 -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-V3KADFMO.js +27 -0
  28. package/dist/{chunk-XXFSOVL3.js → chunk-3XEXT35Z.js} +4 -4
  29. package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
  30. package/dist/chunk-4JZEQBWV.js.map +1 -0
  31. package/dist/{chunk-LE2NOUTN.js → chunk-4VQXMEEP.js} +3 -3
  32. package/dist/{chunk-G2MNSPA4.js → chunk-772N5WCA.js} +2 -2
  33. package/dist/{chunk-WG4MLJ6J.js → chunk-7RCUWU3I.js} +2 -2
  34. package/dist/chunk-7RCUWU3I.js.map +1 -0
  35. package/dist/{chunk-NOMQ5RFG.js → chunk-7UBEHQTP.js} +2 -2
  36. package/dist/{chunk-7NFCGKZT.js → chunk-AQUSMNBF.js} +3 -3
  37. package/dist/{chunk-IDCE26KD.js → chunk-AUYSAMXV.js} +3 -3
  38. package/dist/chunk-AYLC633W.js +406 -0
  39. package/dist/chunk-AYLC633W.js.map +1 -0
  40. package/dist/{chunk-QVAA5KHK.js → chunk-BZ7KTXPB.js} +16 -8
  41. package/dist/chunk-BZ7KTXPB.js.map +1 -0
  42. package/dist/{chunk-K7R5QY6C.js → chunk-CE676WCN.js} +2 -2
  43. package/dist/{chunk-5UFGO4ZT.js → chunk-CQHHEW2M.js} +6 -3
  44. package/dist/chunk-CQHHEW2M.js.map +1 -0
  45. package/dist/{chunk-LHDD4JHC.js → chunk-D4Q7T5KD.js} +4 -4
  46. package/dist/{chunk-RBYTXYGD.js → chunk-D75KSI3V.js} +2 -2
  47. package/dist/{chunk-Y3RX7LZT.js → chunk-DDHWZNGL.js} +18 -12
  48. package/dist/chunk-DDHWZNGL.js.map +1 -0
  49. package/dist/{chunk-5LTID2AF.js → chunk-DMSL5BAP.js} +35 -6
  50. package/dist/{chunk-5LTID2AF.js.map → chunk-DMSL5BAP.js.map} +1 -1
  51. package/dist/{chunk-SQYHPBFP.js → chunk-EGNUOALL.js} +2 -2
  52. package/dist/{chunk-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
  53. package/dist/{chunk-5PNZBH6V.js → chunk-H3T3EPF3.js} +2 -2
  54. package/dist/{chunk-VNYWBHKR.js → chunk-JD3K2344.js} +3 -3
  55. package/dist/{chunk-6YVJVUR4.js → chunk-JDN4SPV3.js} +3 -3
  56. package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
  57. package/dist/{chunk-ABVMUNCD.js → chunk-KQSV7FOG.js} +64 -10
  58. package/dist/chunk-KQSV7FOG.js.map +1 -0
  59. package/dist/{chunk-NH3QZYE5.js → chunk-KV4NU3RP.js} +2 -2
  60. package/dist/{chunk-NDSGJZI2.js → chunk-LOAYWTJJ.js} +2 -2
  61. package/dist/{chunk-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
  62. package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
  63. package/dist/{chunk-RMLADZRY.js → chunk-NTDY5AMO.js} +5 -5
  64. package/dist/{chunk-UHIBKD73.js → chunk-NUUFP53X.js} +13 -32
  65. package/dist/{chunk-UHIBKD73.js.map → chunk-NUUFP53X.js.map} +1 -1
  66. package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
  67. package/dist/chunk-P5MXXHXQ.js +284 -0
  68. package/dist/chunk-P5MXXHXQ.js.map +1 -0
  69. package/dist/{chunk-TEJAGQX2.js → chunk-PD75ZCFT.js} +35 -35
  70. package/dist/chunk-PD75ZCFT.js.map +1 -0
  71. package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
  72. package/dist/{chunk-LL6TOX3G.js → chunk-Q7VXHJP6.js} +10 -10
  73. package/dist/chunk-Q7VXHJP6.js.map +1 -0
  74. package/dist/chunk-QC65IOV3.js +304 -0
  75. package/dist/chunk-QC65IOV3.js.map +1 -0
  76. package/dist/{chunk-V4STTBQD.js → chunk-QED2WB2D.js} +9 -9
  77. package/dist/{chunk-3RXYOBME.js → chunk-QNPJXO53.js} +5 -5
  78. package/dist/{chunk-3RXYOBME.js.map → chunk-QNPJXO53.js.map} +1 -1
  79. package/dist/chunk-QQULYI2S.js +696 -0
  80. package/dist/chunk-QQULYI2S.js.map +1 -0
  81. package/dist/{chunk-QNHZM5ZV.js → chunk-QXGM32TO.js} +3 -3
  82. package/dist/{chunk-TZNNJLGT.js → chunk-RFCAPHL5.js} +6 -6
  83. package/dist/{chunk-7FIXNAUO.js → chunk-SA446KA2.js} +66 -43
  84. package/dist/chunk-SA446KA2.js.map +1 -0
  85. package/dist/{chunk-UDCI3QTS.js → chunk-SN4S5CWL.js} +2 -2
  86. package/dist/{chunk-VUUN3KE4.js → chunk-TAEVA4QR.js} +8 -8
  87. package/dist/chunk-TAEVA4QR.js.map +1 -0
  88. package/dist/{chunk-IR74O2F6.js → chunk-TN2D2RX7.js} +253 -174
  89. package/dist/chunk-TN2D2RX7.js.map +1 -0
  90. package/dist/{chunk-3GTUXW26.js → chunk-VIQOQ463.js} +19 -3
  91. package/dist/chunk-VIQOQ463.js.map +1 -0
  92. package/dist/{chunk-H2SSF24U.js → chunk-VRPPI6GU.js} +17 -6
  93. package/dist/{chunk-H2SSF24U.js.map → chunk-VRPPI6GU.js.map} +1 -1
  94. package/dist/{chunk-XFQGI2E3.js → chunk-VVQQIG64.js} +58 -53
  95. package/dist/chunk-VVQQIG64.js.map +1 -0
  96. package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
  97. package/dist/{chunk-ET6A2JR4.js → chunk-WGUGB54H.js} +120 -18
  98. package/dist/chunk-WGUGB54H.js.map +1 -0
  99. package/dist/{chunk-QR4FU53I.js → chunk-X5DRLONY.js} +22 -12
  100. package/dist/chunk-X5DRLONY.js.map +1 -0
  101. package/dist/{chunk-KQFIGI37.js → chunk-XCP2WDYA.js} +7 -7
  102. package/dist/{chunk-VMZG66UV.js → chunk-YUOVWWJX.js} +312 -7
  103. package/dist/chunk-YUOVWWJX.js.map +1 -0
  104. package/dist/{chunk-HLDY5S4C.js → chunk-ZUIFO7B4.js} +3 -3
  105. package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
  106. package/dist/{cleanup-YOM6PQCN.js → cleanup-RJKLI47I.js} +40 -37
  107. package/dist/cleanup-RJKLI47I.js.map +1 -0
  108. package/dist/cli.js +322 -169
  109. package/dist/cli.js.map +1 -1
  110. package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
  111. package/dist/{commit-DC2Q5CDY.js → commit-SUHRUMDE.js} +15 -15
  112. package/dist/{compile-4NCQECKE.js → compile-2MD346PO.js} +11 -11
  113. package/dist/{contribute-M5UWXCAV.js → contribute-P4BMRY7C.js} +11 -11
  114. package/dist/{contribute-M5UWXCAV.js.map → contribute-P4BMRY7C.js.map} +1 -1
  115. package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
  116. package/dist/database-helpers-PRDFNDRO.js +11 -0
  117. package/dist/{dev-server-CYRP6M73.js → dev-server-ZNTLWOL5.js} +35 -21
  118. package/dist/dev-server-ZNTLWOL5.js.map +1 -0
  119. package/dist/{feedback-BMAZGKRW.js → feedback-Q6WG2WX4.js} +17 -17
  120. package/dist/{git-BXUD6CL5.js → git-TX2IEMB3.js} +6 -6
  121. package/dist/ignite-P644W2PK.js +35 -0
  122. package/dist/index.d.ts +236 -18
  123. package/dist/index.js +180 -63
  124. package/dist/index.js.map +1 -1
  125. package/dist/{init-CI43GJHV.js → init-5HFY7JG6.js} +18 -18
  126. package/dist/{install-deps-SRTM5U7D.js → install-deps-J4ALTM27.js} +11 -11
  127. package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
  128. package/dist/{issues-DMRQJH7E.js → issues-LZMIF22U.js} +69 -56
  129. package/dist/issues-LZMIF22U.js.map +1 -0
  130. package/dist/lint-XIXKU22H.js +27 -0
  131. package/dist/{linux-RYLOP2LY.js → linux-WUGRYCJY.js} +2 -2
  132. package/dist/mcp/{chunk-PIIRD4LO.js → chunk-4HZMW2V3.js} +1 -1
  133. package/dist/mcp/{chunk-PIIRD4LO.js.map → chunk-4HZMW2V3.js.map} +1 -1
  134. package/dist/{darwin-5BHWRJ7D.js → mcp/darwin-U25WIGH6.js} +2 -2
  135. package/dist/mcp/issue-management-server.js +908 -20
  136. package/dist/mcp/issue-management-server.js.map +1 -1
  137. package/dist/mcp/{linux-JBVS4R3A.js → linux-5BXVBGSY.js} +2 -2
  138. package/dist/mcp/recap-server.js +24 -22
  139. package/dist/mcp/recap-server.js.map +1 -1
  140. package/dist/mcp/{tmux-RYBLEHUZ.js → tmux-CU26ZTNM.js} +2 -2
  141. package/dist/mcp/{wsl-4QZIQLLE.js → wsl-KI25UDOF.js} +2 -2
  142. package/dist/{open-2Y7GSUTJ.js → open-KUO35JIJ.js} +36 -21
  143. package/dist/open-KUO35JIJ.js.map +1 -0
  144. package/dist/{plan-SWFPLNJE.js → plan-7CF56OIR.js} +47 -43
  145. package/dist/{plan-SWFPLNJE.js.map → plan-7CF56OIR.js.map} +1 -1
  146. package/dist/{projects-IUSUXD5D.js → projects-L5AHUBGA.js} +6 -6
  147. package/dist/{prompt-7LZB4PAT.js → prompt-FUU5NMJQ.js} +3 -3
  148. package/dist/prompt-FUU5NMJQ.js.map +1 -0
  149. package/dist/prompts/init-prompt.txt +184 -23
  150. package/dist/prompts/issue-prompt.txt +94 -158
  151. package/dist/prompts/plan-prompt.txt +55 -0
  152. package/dist/prompts/regular-prompt.txt +1 -1
  153. package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
  154. package/dist/{rebase-S6OHAOOF.js → rebase-MAMWPA2L.js} +12 -12
  155. package/dist/{recap-GGVCG5VH.js → recap-IDBO3KM5.js} +9 -9
  156. package/dist/{remote-MZTFHHTU.js → remote-RO4LZKT2.js} +3 -3
  157. package/dist/remote-RO4LZKT2.js.map +1 -0
  158. package/dist/{run-ST3FR75O.js → run-RGZHCQ6M.js} +36 -21
  159. package/dist/run-RGZHCQ6M.js.map +1 -0
  160. package/dist/schema/settings.schema.json +171 -11
  161. package/dist/{shell-W4SBQPTE.js → shell-7ADCDFIV.js} +8 -8
  162. package/dist/{summary-P2JCIIJO.js → summary-7J2HORFD.js} +21 -19
  163. package/dist/summary-7J2HORFD.js.map +1 -0
  164. package/dist/test-SRB7EWU6.js +27 -0
  165. package/dist/{test-git-2KFFAQ6B.js → test-git-G7ATVIXG.js} +6 -6
  166. package/dist/{test-jira-FKDKG6CD.js → test-jira-Q2HPA522.js} +8 -8
  167. package/dist/{test-prefix-GP2DAX37.js → test-prefix-JMDGXR5A.js} +6 -6
  168. package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
  169. package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-GZFVXBGD.js} +8 -8
  170. package/dist/{tmux-7ZTA3BDI.js → tmux-6LRFH3DM.js} +2 -2
  171. package/dist/{update-XLW7R7FL.js → update-AD3GE5C4.js} +4 -4
  172. package/dist/{update-notifier-EYLAXZAA.js → update-notifier-VYDTDMSJ.js} +3 -3
  173. package/dist/update-notifier-VYDTDMSJ.js.map +1 -0
  174. package/dist/{vscode-TOGE5N67.js → vscode-3I7ISHUU.js} +12 -12
  175. package/dist/{vscode-announcement-NIX7O2MG.js → vscode-announcement-AL3EHORH.js} +3 -3
  176. package/dist/{wsl-Y4GUTOQ7.js → wsl-4VMVT2PO.js} +2 -2
  177. package/package.json +1 -1
  178. package/dist/ClaudeContextManager-SXDCWDJA.js +0 -14
  179. package/dist/ClaudeService-6E6MCGJE.js +0 -13
  180. package/dist/GitHubService-2R5GQG4K.js +0 -12
  181. package/dist/IssueTrackerFactory-XN6MQ4UN.js +0 -14
  182. package/dist/MetadataManager-CMQQTFLQ.js +0 -10
  183. package/dist/ProjectCapabilityDetector-IC6NAFGY.js +0 -11
  184. package/dist/SettingsMigrationManager-S6J7OHUH.js +0 -10
  185. package/dist/build-OLS6J5KZ.js +0 -27
  186. package/dist/chunk-3GTUXW26.js.map +0 -1
  187. package/dist/chunk-5UFGO4ZT.js.map +0 -1
  188. package/dist/chunk-7FIXNAUO.js.map +0 -1
  189. package/dist/chunk-ABVMUNCD.js.map +0 -1
  190. package/dist/chunk-ET6A2JR4.js.map +0 -1
  191. package/dist/chunk-IR74O2F6.js.map +0 -1
  192. package/dist/chunk-LL6TOX3G.js.map +0 -1
  193. package/dist/chunk-QR4FU53I.js.map +0 -1
  194. package/dist/chunk-QVAA5KHK.js.map +0 -1
  195. package/dist/chunk-RVI6C2H5.js +0 -220
  196. package/dist/chunk-RVI6C2H5.js.map +0 -1
  197. package/dist/chunk-TEJAGQX2.js.map +0 -1
  198. package/dist/chunk-VMZG66UV.js.map +0 -1
  199. package/dist/chunk-VUUN3KE4.js.map +0 -1
  200. package/dist/chunk-WG4MLJ6J.js.map +0 -1
  201. package/dist/chunk-XFQGI2E3.js.map +0 -1
  202. package/dist/chunk-Y3RX7LZT.js.map +0 -1
  203. package/dist/chunk-YRCEOQPX.js.map +0 -1
  204. package/dist/cleanup-YOM6PQCN.js.map +0 -1
  205. package/dist/dev-server-CYRP6M73.js.map +0 -1
  206. package/dist/ignite-IO4LXVXJ.js +0 -35
  207. package/dist/issues-DMRQJH7E.js.map +0 -1
  208. package/dist/lint-BSWRMGPZ.js +0 -27
  209. package/dist/neon-helpers-HWIYRKOW.js +0 -11
  210. package/dist/open-2Y7GSUTJ.js.map +0 -1
  211. package/dist/run-ST3FR75O.js.map +0 -1
  212. package/dist/summary-P2JCIIJO.js.map +0 -1
  213. package/dist/test-6JH4FE2X.js +0 -27
  214. /package/dist/{BranchNamingService-XBCO747L.js.map → BitBucketApiClient-J2ZSCS5N.js.map} +0 -0
  215. /package/dist/{ClaudeContextManager-SXDCWDJA.js.map → BitBucketVCSProvider-5X64IXXW.js.map} +0 -0
  216. /package/dist/{ClaudeService-6E6MCGJE.js.map → BranchNamingService-MEK2WZUD.js.map} +0 -0
  217. /package/dist/{GitHubService-2R5GQG4K.js.map → ClaudeContextManager-RRGREEZQ.js.map} +0 -0
  218. /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-LEPW6QAC.js.map} +0 -0
  219. /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
  220. /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-KE2BDCLC.js.map} +0 -0
  221. /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-GKQMR5E6.js.map} +0 -0
  222. /package/dist/{PromptTemplateManager-T5VTLJP3.js.map → MetadataManager-V4LSJ2PB.js.map} +0 -0
  223. /package/dist/{SettingsManager-WQ5NSGAH.js.map → ProjectCapabilityDetector-I4J66WKF.js.map} +0 -0
  224. /package/dist/{SettingsMigrationManager-S6J7OHUH.js.map → PromptTemplateManager-I75WKXM4.js.map} +0 -0
  225. /package/dist/{claude-ONQTDWV3.js.map → SettingsManager-KQU7OX7G.js.map} +0 -0
  226. /package/dist/{color-VQD52LOI.js.map → SettingsMigrationManager-ZPARZ5KH.js.map} +0 -0
  227. /package/dist/{darwin-5BHWRJ7D.js.map → browser-VZY7F2DF.js.map} +0 -0
  228. /package/dist/{build-OLS6J5KZ.js.map → build-V3KADFMO.js.map} +0 -0
  229. /package/dist/{chunk-XXFSOVL3.js.map → chunk-3XEXT35Z.js.map} +0 -0
  230. /package/dist/{chunk-LE2NOUTN.js.map → chunk-4VQXMEEP.js.map} +0 -0
  231. /package/dist/{chunk-G2MNSPA4.js.map → chunk-772N5WCA.js.map} +0 -0
  232. /package/dist/{chunk-NOMQ5RFG.js.map → chunk-7UBEHQTP.js.map} +0 -0
  233. /package/dist/{chunk-7NFCGKZT.js.map → chunk-AQUSMNBF.js.map} +0 -0
  234. /package/dist/{chunk-IDCE26KD.js.map → chunk-AUYSAMXV.js.map} +0 -0
  235. /package/dist/{chunk-K7R5QY6C.js.map → chunk-CE676WCN.js.map} +0 -0
  236. /package/dist/{chunk-LHDD4JHC.js.map → chunk-D4Q7T5KD.js.map} +0 -0
  237. /package/dist/{chunk-RBYTXYGD.js.map → chunk-D75KSI3V.js.map} +0 -0
  238. /package/dist/{chunk-SQYHPBFP.js.map → chunk-EGNUOALL.js.map} +0 -0
  239. /package/dist/{chunk-ZAXRQLK3.js.map → chunk-FTYWGQFM.js.map} +0 -0
  240. /package/dist/{chunk-5PNZBH6V.js.map → chunk-H3T3EPF3.js.map} +0 -0
  241. /package/dist/{chunk-VNYWBHKR.js.map → chunk-JD3K2344.js.map} +0 -0
  242. /package/dist/{chunk-6YVJVUR4.js.map → chunk-JDN4SPV3.js.map} +0 -0
  243. /package/dist/{chunk-NCPZYQ4B.js.map → chunk-K3QGG4O2.js.map} +0 -0
  244. /package/dist/{chunk-NH3QZYE5.js.map → chunk-KV4NU3RP.js.map} +0 -0
  245. /package/dist/{chunk-NDSGJZI2.js.map → chunk-LOAYWTJJ.js.map} +0 -0
  246. /package/dist/{chunk-GMDSYLI6.js.map → chunk-MY2Q3FJ3.js.map} +0 -0
  247. /package/dist/{chunk-CV47VCMQ.js.map → chunk-NPVA65KS.js.map} +0 -0
  248. /package/dist/{chunk-RMLADZRY.js.map → chunk-NTDY5AMO.js.map} +0 -0
  249. /package/dist/{chunk-7OCGBJLR.js.map → chunk-OIVFHJOA.js.map} +0 -0
  250. /package/dist/{chunk-NN5RYWXA.js.map → chunk-PH65MFQM.js.map} +0 -0
  251. /package/dist/{chunk-V4STTBQD.js.map → chunk-QED2WB2D.js.map} +0 -0
  252. /package/dist/{chunk-QNHZM5ZV.js.map → chunk-QXGM32TO.js.map} +0 -0
  253. /package/dist/{chunk-TZNNJLGT.js.map → chunk-RFCAPHL5.js.map} +0 -0
  254. /package/dist/{chunk-UDCI3QTS.js.map → chunk-SN4S5CWL.js.map} +0 -0
  255. /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
  256. /package/dist/{chunk-KQFIGI37.js.map → chunk-XCP2WDYA.js.map} +0 -0
  257. /package/dist/{chunk-HLDY5S4C.js.map → chunk-ZUIFO7B4.js.map} +0 -0
  258. /package/dist/{git-BXUD6CL5.js.map → claude-ACL7G4CF.js.map} +0 -0
  259. /package/dist/{ignite-IO4LXVXJ.js.map → color-AC6F2QE7.js.map} +0 -0
  260. /package/dist/{commit-DC2Q5CDY.js.map → commit-SUHRUMDE.js.map} +0 -0
  261. /package/dist/{compile-4NCQECKE.js.map → compile-2MD346PO.js.map} +0 -0
  262. /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
  263. /package/dist/{mcp/darwin-3JFFE3W2.js.map → database-helpers-PRDFNDRO.js.map} +0 -0
  264. /package/dist/{feedback-BMAZGKRW.js.map → feedback-Q6WG2WX4.js.map} +0 -0
  265. /package/dist/{neon-helpers-HWIYRKOW.js.map → git-TX2IEMB3.js.map} +0 -0
  266. /package/dist/{prompt-7LZB4PAT.js.map → ignite-P644W2PK.js.map} +0 -0
  267. /package/dist/{init-CI43GJHV.js.map → init-5HFY7JG6.js.map} +0 -0
  268. /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-J4ALTM27.js.map} +0 -0
  269. /package/dist/{remote-MZTFHHTU.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
  270. /package/dist/{lint-BSWRMGPZ.js.map → lint-XIXKU22H.js.map} +0 -0
  271. /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
  272. /package/dist/{update-notifier-EYLAXZAA.js.map → mcp/darwin-U25WIGH6.js.map} +0 -0
  273. /package/dist/mcp/{linux-JBVS4R3A.js.map → linux-5BXVBGSY.js.map} +0 -0
  274. /package/dist/mcp/{tmux-RYBLEHUZ.js.map → tmux-CU26ZTNM.js.map} +0 -0
  275. /package/dist/mcp/{wsl-4QZIQLLE.js.map → wsl-KI25UDOF.js.map} +0 -0
  276. /package/dist/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
  277. /package/dist/{rebase-S6OHAOOF.js.map → rebase-MAMWPA2L.js.map} +0 -0
  278. /package/dist/{recap-GGVCG5VH.js.map → recap-IDBO3KM5.js.map} +0 -0
  279. /package/dist/{shell-W4SBQPTE.js.map → shell-7ADCDFIV.js.map} +0 -0
  280. /package/dist/{test-6JH4FE2X.js.map → test-SRB7EWU6.js.map} +0 -0
  281. /package/dist/{test-git-2KFFAQ6B.js.map → test-git-G7ATVIXG.js.map} +0 -0
  282. /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-Q2HPA522.js.map} +0 -0
  283. /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-JMDGXR5A.js.map} +0 -0
  284. /package/dist/{test-tabs-YDWMWTVA.js.map → test-tabs-NGPTFD5T.js.map} +0 -0
  285. /package/dist/{test-webserver-QI3QQFZ3.js.map → test-webserver-GZFVXBGD.js.map} +0 -0
  286. /package/dist/{tmux-7ZTA3BDI.js.map → tmux-6LRFH3DM.js.map} +0 -0
  287. /package/dist/{update-XLW7R7FL.js.map → update-AD3GE5C4.js.map} +0 -0
  288. /package/dist/{vscode-TOGE5N67.js.map → vscode-3I7ISHUU.js.map} +0 -0
  289. /package/dist/{vscode-announcement-NIX7O2MG.js.map → vscode-announcement-AL3EHORH.js.map} +0 -0
  290. /package/dist/{wsl-Y4GUTOQ7.js.map → wsl-4VMVT2PO.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -1,114 +1,118 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SessionSummaryService
4
- } from "./chunk-QR4FU53I.js";
4
+ } from "./chunk-X5DRLONY.js";
5
5
  import "./chunk-NXMDEL3F.js";
6
6
  import {
7
7
  ResourceCleanup
8
- } from "./chunk-7FIXNAUO.js";
9
- import "./chunk-XXFSOVL3.js";
8
+ } from "./chunk-SA446KA2.js";
9
+ import "./chunk-3XEXT35Z.js";
10
10
  import {
11
11
  StartCommand,
12
12
  launchFirstRunSetup,
13
13
  needsFirstRunSetup
14
- } from "./chunk-TEJAGQX2.js";
14
+ } from "./chunk-PD75ZCFT.js";
15
15
  import {
16
16
  CLIIsolationManager,
17
17
  DatabaseManager,
18
18
  EnvironmentManager,
19
19
  LoomManager
20
- } from "./chunk-XFQGI2E3.js";
20
+ } from "./chunk-VVQQIG64.js";
21
21
  import {
22
- PRManager
23
- } from "./chunk-ABVMUNCD.js";
22
+ PRManager,
23
+ VCSProviderFactory
24
+ } from "./chunk-KQSV7FOG.js";
25
+ import {
26
+ BuildRunner,
27
+ MergeManager
28
+ } from "./chunk-Q7VXHJP6.js";
29
+ import {
30
+ assembleChildrenData
31
+ } from "./chunk-RFCAPHL5.js";
32
+ import "./chunk-7UBEHQTP.js";
33
+ import "./chunk-AYLC633W.js";
34
+ import {
35
+ ProcessManager
36
+ } from "./chunk-H3T3EPF3.js";
37
+ import "./chunk-ZUIFO7B4.js";
38
+ import {
39
+ IdentifierParser
40
+ } from "./chunk-SN4S5CWL.js";
41
+ import {
42
+ createDatabaseProviderFromSettings
43
+ } from "./chunk-YUOVWWJX.js";
44
+ import {
45
+ ShellCompletion
46
+ } from "./chunk-QXGM32TO.js";
47
+ import {
48
+ TelemetryManager,
49
+ TelemetryService
50
+ } from "./chunk-MY2Q3FJ3.js";
51
+ import "./chunk-EGNUOALL.js";
24
52
  import {
25
53
  IssueEnhancementService
26
- } from "./chunk-NN5RYWXA.js";
54
+ } from "./chunk-PH65MFQM.js";
27
55
  import {
28
56
  capitalizeFirstLetter
29
57
  } from "./chunk-4E7LCFUG.js";
58
+ import "./chunk-CQHHEW2M.js";
59
+ import {
60
+ AgentManager
61
+ } from "./chunk-JD3K2344.js";
30
62
  import {
31
63
  CommitManager,
32
64
  UserAbortedCommitError,
33
65
  ValidationRunner
34
- } from "./chunk-VUUN3KE4.js";
35
- import {
36
- BuildRunner,
37
- MergeManager
38
- } from "./chunk-LL6TOX3G.js";
39
- import {
40
- assembleChildrenData
41
- } from "./chunk-TZNNJLGT.js";
42
- import "./chunk-NOMQ5RFG.js";
43
- import "./chunk-5UFGO4ZT.js";
66
+ } from "./chunk-TAEVA4QR.js";
44
67
  import {
45
68
  IssueManagementProviderFactory
46
- } from "./chunk-RMLADZRY.js";
69
+ } from "./chunk-NTDY5AMO.js";
47
70
  import "./chunk-4232AHNQ.js";
48
71
  import {
49
- ProcessManager
50
- } from "./chunk-5PNZBH6V.js";
72
+ installDependencies
73
+ } from "./chunk-VIQOQ463.js";
51
74
  import {
52
- IdentifierParser
53
- } from "./chunk-UDCI3QTS.js";
75
+ GitWorktreeManager
76
+ } from "./chunk-4VQXMEEP.js";
54
77
  import {
55
78
  openBrowser
56
- } from "./chunk-YETJNRQM.js";
57
- import "./chunk-HLDY5S4C.js";
58
- import {
59
- installDependencies
60
- } from "./chunk-3GTUXW26.js";
79
+ } from "./chunk-WEBMMJKL.js";
61
80
  import {
62
81
  getIdeConfig,
63
82
  getInstallHint,
64
83
  isIdeAvailable
65
- } from "./chunk-K7R5QY6C.js";
84
+ } from "./chunk-CE676WCN.js";
66
85
  import {
67
86
  ClaudeContextManager
68
- } from "./chunk-6YVJVUR4.js";
87
+ } from "./chunk-JDN4SPV3.js";
88
+ import "./chunk-XCP2WDYA.js";
89
+ import "./chunk-7RCUWU3I.js";
69
90
  import "./chunk-GYCR2LOU.js";
70
- import "./chunk-7NFCGKZT.js";
91
+ import "./chunk-AQUSMNBF.js";
71
92
  import {
72
93
  ProjectCapabilityDetector
73
- } from "./chunk-G2MNSPA4.js";
74
- import "./chunk-NCPZYQ4B.js";
75
- import {
76
- createNeonProviderFromSettings
77
- } from "./chunk-VMZG66UV.js";
78
- import {
79
- ShellCompletion
80
- } from "./chunk-QNHZM5ZV.js";
81
- import {
82
- TelemetryManager,
83
- TelemetryService
84
- } from "./chunk-GMDSYLI6.js";
85
- import "./chunk-SQYHPBFP.js";
86
- import {
87
- AgentManager
88
- } from "./chunk-VNYWBHKR.js";
89
- import {
90
- GitWorktreeManager
91
- } from "./chunk-LE2NOUTN.js";
94
+ } from "./chunk-772N5WCA.js";
95
+ import "./chunk-K3QGG4O2.js";
92
96
  import {
93
97
  IssueTrackerFactory
94
- } from "./chunk-UHIBKD73.js";
95
- import "./chunk-5LTID2AF.js";
98
+ } from "./chunk-NUUFP53X.js";
99
+ import "./chunk-DMSL5BAP.js";
96
100
  import {
97
101
  GitHubService
98
- } from "./chunk-LHDD4JHC.js";
99
- import "./chunk-NH3QZYE5.js";
102
+ } from "./chunk-D4Q7T5KD.js";
103
+ import "./chunk-KV4NU3RP.js";
100
104
  import {
101
105
  promptConfirmation,
102
106
  waitForKeypress
103
- } from "./chunk-CV47VCMQ.js";
104
- import "./chunk-7OCGBJLR.js";
107
+ } from "./chunk-NPVA65KS.js";
108
+ import "./chunk-QC65IOV3.js";
109
+ import "./chunk-P5MXXHXQ.js";
105
110
  import {
106
111
  getConfiguredRepoFromSettings,
107
112
  hasMultipleRemotes
108
- } from "./chunk-QVAA5KHK.js";
109
- import "./chunk-KQFIGI37.js";
110
- import "./chunk-Y3RX7LZT.js";
111
- import "./chunk-WG4MLJ6J.js";
113
+ } from "./chunk-BZ7KTXPB.js";
114
+ import "./chunk-OIVFHJOA.js";
115
+ import "./chunk-DDHWZNGL.js";
112
116
  import {
113
117
  GitCommandError,
114
118
  executeGitCommand,
@@ -121,22 +125,22 @@ import {
121
125
  pushBranchToRemote,
122
126
  removePlaceholderCommitFromHead,
123
127
  removePlaceholderCommitFromHistory
124
- } from "./chunk-3RXYOBME.js";
128
+ } from "./chunk-QNPJXO53.js";
125
129
  import {
126
130
  SettingsManager
127
- } from "./chunk-ET6A2JR4.js";
131
+ } from "./chunk-WGUGB54H.js";
128
132
  import {
129
133
  MetadataManager
130
- } from "./chunk-YRCEOQPX.js";
134
+ } from "./chunk-4JZEQBWV.js";
131
135
  import {
132
136
  getLogger,
133
137
  withLogger
134
- } from "./chunk-ZAXRQLK3.js";
138
+ } from "./chunk-FTYWGQFM.js";
135
139
  import {
136
140
  createStderrLogger,
137
141
  loadEnvIntoProcess,
138
142
  logger
139
- } from "./chunk-H2SSF24U.js";
143
+ } from "./chunk-VRPPI6GU.js";
140
144
 
141
145
  // src/cli.ts
142
146
  import { program, Option } from "commander";
@@ -346,10 +350,10 @@ var FinishCommand = class {
346
350
  const settings = await this.settingsManager.loadSettings();
347
351
  const databaseUrlEnvVarName = ((_b = (_a2 = settings.capabilities) == null ? void 0 : _a2.database) == null ? void 0 : _b.databaseUrlEnvVarName) ?? "DATABASE_URL";
348
352
  const environmentManager = new EnvironmentManager();
349
- const neonProvider = createNeonProviderFromSettings(settings);
350
- const databaseManager = new DatabaseManager(neonProvider, environmentManager, databaseUrlEnvVarName);
353
+ const databaseProvider = createDatabaseProviderFromSettings(settings);
354
+ const databaseManager = new DatabaseManager(databaseProvider, environmentManager, databaseUrlEnvVarName);
351
355
  const cliIsolationManager = new CLIIsolationManager();
352
- const { DefaultBranchNamingService } = await import("./BranchNamingService-XBCO747L.js");
356
+ const { DefaultBranchNamingService } = await import("./BranchNamingService-MEK2WZUD.js");
353
357
  this.loomManager ??= new LoomManager(
354
358
  this.gitWorktreeManager,
355
359
  this.issueTracker,
@@ -407,7 +411,7 @@ var FinishCommand = class {
407
411
  * Main entry point for finish command
408
412
  */
409
413
  async execute(input) {
410
- var _a2, _b, _c, _d, _e;
414
+ var _a2, _b, _c;
411
415
  process.env.ILOOM = "1";
412
416
  const isJsonMode = input.options.json === true || input.options.jsonStream === true;
413
417
  const result = {
@@ -419,13 +423,16 @@ var FinishCommand = class {
419
423
  };
420
424
  if (isJsonMode) {
421
425
  const settings2 = await this.settingsManager.loadSettings();
422
- if ((((_a2 = settings2.mergeBehavior) == null ? void 0 : _a2.mode) === "github-pr" || ((_b = settings2.mergeBehavior) == null ? void 0 : _b.mode) === "github-draft-pr") && input.options.cleanup === void 0) {
423
- throw new Error('JSON mode with "github-pr"/"github-draft-pr" workflow requires --cleanup or --no-cleanup flag. Use: il finish --json --cleanup <identifier>');
426
+ const jsonModeCheckMode = (_a2 = settings2.mergeBehavior) == null ? void 0 : _a2.mode;
427
+ if ((jsonModeCheckMode === "pr" || jsonModeCheckMode === "draft-pr") && input.options.cleanup === void 0) {
428
+ throw new Error('JSON mode with "pr"/"draft-pr" workflow requires --cleanup or --no-cleanup flag. Use: il finish --json --cleanup <identifier>');
424
429
  }
425
430
  }
426
431
  const settings = await this.settingsManager.loadSettings();
427
432
  let repo;
428
- const needsRepo = ((_c = settings.mergeBehavior) == null ? void 0 : _c.mode) === "github-pr" || ((_d = settings.mergeBehavior) == null ? void 0 : _d.mode) === "github-draft-pr" || this.issueTracker.providerName === "github";
433
+ const rawRepoMode = (_b = settings.mergeBehavior) == null ? void 0 : _b.mode;
434
+ const isPRMode = rawRepoMode === "pr" || rawRepoMode === "draft-pr" || rawRepoMode === "github-pr" || rawRepoMode === "github-draft-pr" || rawRepoMode === "bitbucket-pr";
435
+ const needsRepo = isPRMode && VCSProviderFactory.create(settings) === null || this.issueTracker.providerName === "github";
429
436
  if (needsRepo && await hasMultipleRemotes()) {
430
437
  repo = await getConfiguredRepoFromSettings(settings);
431
438
  getLogger().info(`Using GitHub repository: ${repo}`);
@@ -463,8 +470,16 @@ var FinishCommand = class {
463
470
  result.success = true;
464
471
  try {
465
472
  const durationMinutes = preFinishCreatedAt ? Math.round((Date.now() - new Date(preFinishCreatedAt).getTime()) / 6e4) : 0;
473
+ const telemetryModeMap = {
474
+ "local": "local",
475
+ "pr": "pr",
476
+ "draft-pr": "draft-pr",
477
+ "github-pr": "pr",
478
+ "github-draft-pr": "draft-pr",
479
+ "bitbucket-pr": "pr"
480
+ };
466
481
  TelemetryService.getInstance().track("loom.finished", {
467
- merge_behavior: ((_e = settings.mergeBehavior) == null ? void 0 : _e.mode) ?? "local",
482
+ merge_behavior: telemetryModeMap[((_c = settings.mergeBehavior) == null ? void 0 : _c.mode) ?? "local"] ?? "local",
468
483
  duration_minutes: isNaN(durationMinutes) ? 0 : durationMinutes
469
484
  });
470
485
  } catch (error) {
@@ -526,7 +541,7 @@ var FinishCommand = class {
526
541
  if (result.type === "issue" && result.number !== void 0) {
527
542
  const worktree = await this.gitWorktreeManager.findWorktreeForIssue(result.number);
528
543
  if (worktree) {
529
- const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-CMQQTFLQ.js");
544
+ const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-V4LSJ2PB.js");
530
545
  const metadataManager = new MetadataManager2();
531
546
  const metadata = await metadataManager.readMetadata(worktree.path);
532
547
  const canonicalKey = (metadata == null ? void 0 : metadata.issueKey) ?? ((_a2 = metadata == null ? void 0 : metadata.issue_numbers) == null ? void 0 : _a2[0]);
@@ -556,7 +571,7 @@ var FinishCommand = class {
556
571
  autoDetected: true
557
572
  };
558
573
  }
559
- const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-CMQQTFLQ.js");
574
+ const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-V4LSJ2PB.js");
560
575
  const metadataManager = new MetadataManager2();
561
576
  const metadata = await metadataManager.readMetadata(process.cwd());
562
577
  const issueNumber = extractIssueNumber(currentDir);
@@ -827,18 +842,25 @@ var FinishCommand = class {
827
842
  }
828
843
  const settings = await this.settingsManager.loadSettings(worktree.path);
829
844
  const mergeBehavior = settings.mergeBehavior ?? { mode: "local" };
830
- if (mergeBehavior.mode === "github-pr") {
831
- await this.executeGitHubPRWorkflow(parsed, options, worktree, settings, result);
845
+ const rawMode = mergeBehavior.mode;
846
+ const mergeMode = rawMode === "github-pr" || rawMode === "bitbucket-pr" ? "pr" : rawMode === "github-draft-pr" ? "draft-pr" : rawMode;
847
+ const vcsProvider = VCSProviderFactory.create(settings);
848
+ if (mergeMode === "pr") {
849
+ await this.executeVCSPRWorkflow(parsed, options, worktree, settings, vcsProvider, result);
832
850
  return;
833
851
  }
834
- if (mergeBehavior.mode === "github-draft-pr") {
835
- const { MetadataManager: MetadataManager3 } = await import("./MetadataManager-CMQQTFLQ.js");
836
- const metadataManager2 = new MetadataManager3();
852
+ if (mergeMode === "draft-pr") {
853
+ if (vcsProvider !== null && !vcsProvider.supportsDraftPRs) {
854
+ getLogger().warn(`${vcsProvider.providerName} does not support draft PRs. Creating a regular PR instead.`);
855
+ await this.executeVCSPRWorkflow(parsed, options, worktree, settings, vcsProvider, result);
856
+ return;
857
+ }
858
+ const metadataManager2 = new MetadataManager();
837
859
  const metadata = await metadataManager2.readMetadata(worktree.path);
838
860
  getLogger().debug(`Draft PR mode: worktree=${worktree.path}, draftPrNumber=${(metadata == null ? void 0 : metadata.draftPrNumber) ?? "none"}`);
839
861
  if (!(metadata == null ? void 0 : metadata.draftPrNumber)) {
840
862
  getLogger().warn("No draft PR found in metadata, creating new PR...");
841
- await this.executeGitHubPRWorkflow(parsed, options, worktree, settings, result);
863
+ await this.executeVCSPRWorkflow(parsed, options, worktree, settings, vcsProvider, result);
842
864
  return;
843
865
  }
844
866
  const isHeadPlaceholder = await isPlaceholderCommit(worktree.path);
@@ -928,8 +950,7 @@ var FinishCommand = class {
928
950
  getLogger().debug("Skipping build verification (--skip-build flag provided)");
929
951
  }
930
952
  await this.generateSessionSummaryIfConfigured(parsed, worktree, options);
931
- const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-CMQQTFLQ.js");
932
- const metadataManager = new MetadataManager2();
953
+ const metadataManager = new MetadataManager();
933
954
  if (!options.dryRun) {
934
955
  await metadataManager.archiveMetadata(worktree.path);
935
956
  }
@@ -957,7 +978,7 @@ var FinishCommand = class {
957
978
  "Cannot cleanup PR with uncommitted changes. Commit or stash changes, then run again with --force to cleanup anyway."
958
979
  );
959
980
  }
960
- const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-CMQQTFLQ.js");
981
+ const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-V4LSJ2PB.js");
961
982
  const metadataManager = new MetadataManager2();
962
983
  if (!options.dryRun) {
963
984
  await metadataManager.archiveMetadata(worktree.path);
@@ -1033,11 +1054,16 @@ var FinishCommand = class {
1033
1054
  }
1034
1055
  }
1035
1056
  /**
1036
- * Execute workflow for GitHub PR creation (github-pr merge mode)
1057
+ * Execute unified VCS PR workflow (pr/draft-pr merge mode)
1058
+ * Routes to the appropriate VCS provider or falls back to the legacy GitHub PRManager path.
1059
+ *
1060
+ * If vcsProvider is null (GitHub/legacy), uses PRManager.createOrOpenPR.
1061
+ * If vcsProvider is non-null, delegates to VersionControlProvider.createPR.
1062
+ *
1037
1063
  * Validates → Commits → Pushes → Creates PR → Prompts for cleanup
1038
1064
  */
1039
- async executeGitHubPRWorkflow(parsed, options, worktree, settings, finishResult) {
1040
- var _a2;
1065
+ async executeVCSPRWorkflow(parsed, options, worktree, settings, vcsProvider, finishResult) {
1066
+ var _a2, _b;
1041
1067
  if (options.dryRun) {
1042
1068
  getLogger().info("[DRY RUN] Would push branch to origin");
1043
1069
  } else {
@@ -1056,6 +1082,63 @@ var FinishCommand = class {
1056
1082
  }
1057
1083
  }
1058
1084
  const baseBranch = await getMergeTargetBranch(worktree.path);
1085
+ if (vcsProvider !== null) {
1086
+ if (options.dryRun) {
1087
+ getLogger().info(`[DRY RUN] Would create ${vcsProvider.providerName} PR`);
1088
+ getLogger().info(` Title: ${prTitle}`);
1089
+ getLogger().info(` Base: ${baseBranch}`);
1090
+ finishResult.operations.push({
1091
+ type: "pr-creation",
1092
+ message: `Would create ${vcsProvider.providerName} PR (dry-run)`,
1093
+ success: true
1094
+ });
1095
+ return;
1096
+ }
1097
+ const existingPR = await vcsProvider.checkForExistingPR(worktree.branch, worktree.path);
1098
+ if (existingPR) {
1099
+ getLogger().success(`Existing pull request: ${existingPR.url}`);
1100
+ finishResult.prUrl = existingPR.url;
1101
+ finishResult.operations.push({
1102
+ type: "pr-creation",
1103
+ message: "Found existing pull request",
1104
+ success: true
1105
+ });
1106
+ await this.generateSessionSummaryIfConfigured(parsed, worktree, options, existingPR.number);
1107
+ } else {
1108
+ const prBody = await prManager.generatePRBody(
1109
+ parsed.type === "issue" ? parsed.number : void 0,
1110
+ worktree.path
1111
+ );
1112
+ const prResult = await vcsProvider.createPR(
1113
+ worktree.branch,
1114
+ prTitle,
1115
+ prBody,
1116
+ baseBranch,
1117
+ worktree.path
1118
+ );
1119
+ getLogger().success(`Pull request created: ${prResult.url}`);
1120
+ finishResult.prUrl = prResult.url;
1121
+ finishResult.operations.push({
1122
+ type: "pr-creation",
1123
+ message: "Pull request created",
1124
+ success: true
1125
+ });
1126
+ await this.generateSessionSummaryIfConfigured(parsed, worktree, options, prResult.number);
1127
+ }
1128
+ const shouldOpenBrowser = !options.noBrowser && !options.json && ((_a2 = settings.mergeBehavior) == null ? void 0 : _a2.openBrowserOnFinish) !== false;
1129
+ if (shouldOpenBrowser && finishResult.prUrl) {
1130
+ try {
1131
+ const { openBrowser: openBrowser2 } = await import("./browser-VZY7F2DF.js");
1132
+ await openBrowser2(finishResult.prUrl);
1133
+ } catch {
1134
+ getLogger().debug("Could not open browser");
1135
+ }
1136
+ }
1137
+ const metadataManager = new MetadataManager();
1138
+ await metadataManager.archiveMetadata(worktree.path);
1139
+ await this.handlePRCleanupPrompt(parsed, options, worktree, finishResult);
1140
+ return;
1141
+ }
1059
1142
  if (options.dryRun) {
1060
1143
  getLogger().info("[DRY RUN] Would create GitHub PR");
1061
1144
  getLogger().info(` Title: ${prTitle}`);
@@ -1066,7 +1149,7 @@ var FinishCommand = class {
1066
1149
  success: true
1067
1150
  });
1068
1151
  } else {
1069
- const openInBrowser = !options.noBrowser && !options.json && ((_a2 = settings.mergeBehavior) == null ? void 0 : _a2.openBrowserOnFinish) !== false;
1152
+ const openInBrowser = !options.noBrowser && !options.json && ((_b = settings.mergeBehavior) == null ? void 0 : _b.openBrowserOnFinish) !== false;
1070
1153
  const prResult = await prManager.createOrOpenPR(
1071
1154
  worktree.branch,
1072
1155
  prTitle,
@@ -1105,7 +1188,7 @@ var FinishCommand = class {
1105
1188
  }
1106
1189
  finishResult.prUrl = prResult.url;
1107
1190
  await this.generateSessionSummaryIfConfigured(parsed, worktree, options, prResult.number);
1108
- const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-CMQQTFLQ.js");
1191
+ const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-V4LSJ2PB.js");
1109
1192
  const metadataManager = new MetadataManager2();
1110
1193
  if (!options.dryRun) {
1111
1194
  await metadataManager.archiveMetadata(worktree.path);
@@ -1956,15 +2039,15 @@ program.name("iloom").description(packageJson.description).version(packageJson.v
1956
2039
  process.exit(0);
1957
2040
  }
1958
2041
  try {
1959
- const { checkAndNotifyUpdate } = await import("./update-notifier-EYLAXZAA.js");
1960
- const { detectInstallationMethod } = await import("./installation-detector-HF6QN7KP.js");
2042
+ const { checkAndNotifyUpdate } = await import("./update-notifier-VYDTDMSJ.js");
2043
+ const { detectInstallationMethod } = await import("./installation-detector-PYAZ2O6U.js");
1961
2044
  const installMethod = detectInstallationMethod(__filename);
1962
2045
  const jsonMode = actionCommand.opts().json === true;
1963
2046
  await checkAndNotifyUpdate(packageJson.version, packageJson.name, installMethod, { suppressOutput: jsonMode });
1964
2047
  } catch {
1965
2048
  }
1966
2049
  try {
1967
- const { SettingsMigrationManager } = await import("./SettingsMigrationManager-S6J7OHUH.js");
2050
+ const { SettingsMigrationManager } = await import("./SettingsMigrationManager-ZPARZ5KH.js");
1968
2051
  const migrationManager = new SettingsMigrationManager();
1969
2052
  await migrationManager.migrateSettingsIfNeeded();
1970
2053
  } catch (error) {
@@ -1987,7 +2070,7 @@ program.name("iloom").description(packageJson.description).version(packageJson.v
1987
2070
  await validateIdeForStartCommand(actionCommand);
1988
2071
  }).hook("postAction", async (_thisCommand, actionCommand) => {
1989
2072
  try {
1990
- const { showVSCodeAnnouncementIfNeeded } = await import("./vscode-announcement-NIX7O2MG.js");
2073
+ const { showVSCodeAnnouncementIfNeeded } = await import("./vscode-announcement-AL3EHORH.js");
1991
2074
  const jsonMode = actionCommand.opts().json === true;
1992
2075
  if (!jsonMode) {
1993
2076
  await showVSCodeAnnouncementIfNeeded(actionCommand.name());
@@ -2038,14 +2121,16 @@ async function validateGhCliForCommand(command) {
2038
2121
  const settings = await settingsManager.loadSettings();
2039
2122
  const provider = IssueTrackerFactory.getProviderName(settings);
2040
2123
  const mergeBehaviorMode = (_a2 = settings.mergeBehavior) == null ? void 0 : _a2.mode;
2041
- needsGhCli = provider === "github" || mergeBehaviorMode === "github-pr" || mergeBehaviorMode === "github-draft-pr";
2124
+ const isPrMode = mergeBehaviorMode === "pr" || mergeBehaviorMode === "draft-pr";
2125
+ const vcsProvider = VCSProviderFactory.create(settings);
2126
+ needsGhCli = provider === "github" || isPrMode && vcsProvider === null;
2042
2127
  } catch {
2043
2128
  needsGhCli = true;
2044
2129
  }
2045
2130
  }
2046
2131
  if (!ghAvailable) {
2047
2132
  if (needsGhCli) {
2048
- const errorMessage = alwaysRequireGh.includes(commandName) ? `The "${commandName}" command requires GitHub CLI (gh) to be installed.` : `GitHub CLI (gh) is required when using GitHub as the issue tracker or "github-pr"/"github-draft-pr" merge mode.`;
2133
+ const errorMessage = alwaysRequireGh.includes(commandName) ? `The "${commandName}" command requires GitHub CLI (gh) to be installed.` : `GitHub CLI (gh) is required when using GitHub as the issue tracker or "pr"/"draft-pr" merge mode with GitHub.`;
2049
2134
  logger.error(errorMessage);
2050
2135
  logger.info("");
2051
2136
  logger.info("To install GitHub CLI:");
@@ -2061,10 +2146,11 @@ async function validateGhCliForCommand(command) {
2061
2146
  const settings = await settingsManager.loadSettings();
2062
2147
  const provider = IssueTrackerFactory.getProviderName(settings);
2063
2148
  const mergeBehaviorMode = (_b = settings.mergeBehavior) == null ? void 0 : _b.mode;
2064
- if (provider === "github" || mergeBehaviorMode === "github-pr" || mergeBehaviorMode === "github-draft-pr") {
2149
+ const isPrMode = mergeBehaviorMode === "pr" || mergeBehaviorMode === "draft-pr";
2150
+ if (provider === "github" || isPrMode) {
2065
2151
  logger.warn("GitHub CLI (gh) is not installed.");
2066
2152
  logger.warn(
2067
- 'Some features may not work correctly with your current configuration (GitHub provider or "github-pr"/"github-draft-pr" merge mode).'
2153
+ "Some features may not work correctly with your current configuration (GitHub provider or PR merge mode)."
2068
2154
  );
2069
2155
  logger.info("To install: brew install gh (macOS) or see https://github.com/cli/cli#installation");
2070
2156
  logger.info("");
@@ -2116,21 +2202,21 @@ async function autoLaunchInitForMultipleRemotes() {
2116
2202
  logger.info("iloom will now launch an interactive configuration session with Claude");
2117
2203
  logger.info("to help you select which remote to use for GitHub operations.");
2118
2204
  logger.info("");
2119
- const { waitForKeypress: waitForKeypress2 } = await import("./prompt-7LZB4PAT.js");
2205
+ const { waitForKeypress: waitForKeypress2 } = await import("./prompt-FUU5NMJQ.js");
2120
2206
  await waitForKeypress2("Press any key to start configuration...");
2121
2207
  logger.info("");
2122
2208
  try {
2123
- const { InitCommand } = await import("./init-CI43GJHV.js");
2209
+ const { InitCommand } = await import("./init-5HFY7JG6.js");
2124
2210
  const initCommand = new InitCommand();
2125
2211
  const customInitialMessage = "Help me configure which git remote iloom should use for GitHub operations. I have multiple remotes and need to select the correct one.";
2126
2212
  await initCommand.execute(customInitialMessage);
2127
2213
  logger.info("");
2128
2214
  logger.info("Configuration complete! Continuing with your original command...");
2129
2215
  logger.info("");
2130
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-WQ5NSGAH.js");
2216
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-KQU7OX7G.js");
2131
2217
  const settingsManager = new SettingsManager2();
2132
2218
  const settings = await settingsManager.loadSettings();
2133
- const { hasMultipleRemotes: hasMultipleRemotes2 } = await import("./remote-MZTFHHTU.js");
2219
+ const { hasMultipleRemotes: hasMultipleRemotes2 } = await import("./remote-RO4LZKT2.js");
2134
2220
  const multipleRemotes = await hasMultipleRemotes2();
2135
2221
  if (multipleRemotes && !((_b = (_a2 = settings.issueManagement) == null ? void 0 : _a2.github) == null ? void 0 : _b.remote)) {
2136
2222
  logger.error("Configuration incomplete: GitHub remote is still not configured.");
@@ -2162,7 +2248,7 @@ program.command("start").alias("new").alias("create").alias("up").description("C
2162
2248
  logger.error("JSON mode requires identifier argument");
2163
2249
  process.exit(1);
2164
2250
  }
2165
- const { promptInput } = await import("./prompt-7LZB4PAT.js");
2251
+ const { promptInput } = await import("./prompt-FUU5NMJQ.js");
2166
2252
  finalIdentifier = await promptInput("Enter issue number, PR number (pr/123), or branch name");
2167
2253
  if (!(finalIdentifier == null ? void 0 : finalIdentifier.trim())) {
2168
2254
  logger.error("Identifier is required");
@@ -2228,7 +2314,7 @@ program.command("add-issue").alias("a").description("Create and enhance GitHub i
2228
2314
  });
2229
2315
  program.command("feedback").alias("f").description("Submit feedback/bug report to iloom-cli repository").argument("<description>", "Feedback title (>30 chars, >2 spaces; or any non-empty text when --body provided)").option("--body <text>", "Body text for feedback (added after diagnostics)").action(async (description, options) => {
2230
2316
  try {
2231
- const { FeedbackCommand } = await import("./feedback-BMAZGKRW.js");
2317
+ const { FeedbackCommand } = await import("./feedback-Q6WG2WX4.js");
2232
2318
  const command = new FeedbackCommand();
2233
2319
  const feedbackOptions = {};
2234
2320
  if (options.body !== void 0) {
@@ -2281,7 +2367,7 @@ program.command("enhance").description("Apply enhancement agent to existing GitH
2281
2367
  await executeAction();
2282
2368
  }
2283
2369
  });
2284
- program.command("finish").alias("dn").description("Merge work and cleanup workspace").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").option("--pr <number>", "Treat input as PR number", parseFloat).option("--skip-build", "Skip post-merge build verification").option("--no-browser", "Skip opening PR in browser (github-pr and github-draft-pr modes)").option("--cleanup", "Clean up worktree after finishing (default in local mode)").option("--no-cleanup", "Keep worktree after finishing").option("--review", "Review commit message before committing (default: auto-commit without review)").option("--json", "Output result as JSON").option("--json-stream", "Stream JSONL output; runs Claude headless for conflict resolution").action(async (identifier, options) => {
2370
+ program.command("finish").alias("dn").description("Merge work and cleanup workspace").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").option("--pr <number>", "Treat input as PR number", parseFloat).option("--skip-build", "Skip post-merge build verification").option("--skip-to-pr", "Skip rebase/validation/commit, go directly to PR creation (debug)").option("--no-browser", "Skip opening PR in browser (pr and draft-pr modes)").option("--cleanup", "Clean up worktree after finishing (default in local mode)").option("--no-cleanup", "Keep worktree after finishing").option("--review", "Review commit message before committing (default: auto-commit without review)").option("--json", "Output result as JSON").option("--json-stream", "Stream JSONL output; runs Claude headless for conflict resolution").action(async (identifier, options) => {
2285
2371
  if (options.browser === false) {
2286
2372
  options.noBrowser = true;
2287
2373
  }
@@ -2330,7 +2416,7 @@ program.command("commit").alias("c").description("Commit all uncommitted files w
2330
2416
  const isAnyJsonMode = options.json ?? options.jsonStream;
2331
2417
  const executeAction = async () => {
2332
2418
  try {
2333
- const { CommitCommand } = await import("./commit-DC2Q5CDY.js");
2419
+ const { CommitCommand } = await import("./commit-SUHRUMDE.js");
2334
2420
  const command = new CommitCommand();
2335
2421
  const noReview = options.review === false || options.json === true || options.jsonStream === true;
2336
2422
  const result = await command.execute({
@@ -2369,7 +2455,7 @@ program.command("commit").alias("c").description("Commit all uncommitted files w
2369
2455
  program.command("rebase").description("Rebase current branch on main with Claude-assisted conflict resolution").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").option("--json-stream", "Stream JSONL output; runs Claude headless for conflict resolution").action(async (options) => {
2370
2456
  const executeAction = async () => {
2371
2457
  try {
2372
- const { RebaseCommand } = await import("./rebase-S6OHAOOF.js");
2458
+ const { RebaseCommand } = await import("./rebase-MAMWPA2L.js");
2373
2459
  const command = new RebaseCommand();
2374
2460
  const result = await command.execute(options);
2375
2461
  if (options.jsonStream && result) {
@@ -2409,7 +2495,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
2409
2495
  options.oneShot = "bypassPermissions";
2410
2496
  }
2411
2497
  try {
2412
- const { IgniteCommand } = await import("./ignite-IO4LXVXJ.js");
2498
+ const { IgniteCommand } = await import("./ignite-P644W2PK.js");
2413
2499
  const command = new IgniteCommand();
2414
2500
  if (options.json && options.jsonStream) {
2415
2501
  logger.error("--json and --json-stream are mutually exclusive");
@@ -2437,7 +2523,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
2437
2523
  program.command("open").description("Open workspace in browser or run CLI tool").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
2438
2524
  try {
2439
2525
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
2440
- const { OpenCommand } = await import("./open-2Y7GSUTJ.js");
2526
+ const { OpenCommand } = await import("./open-KUO35JIJ.js");
2441
2527
  const cmd = new OpenCommand();
2442
2528
  const input = identifier ? { identifier, args } : { args };
2443
2529
  await cmd.execute(input);
@@ -2449,7 +2535,7 @@ program.command("open").description("Open workspace in browser or run CLI tool")
2449
2535
  program.command("run").description("Run CLI tool or open workspace in browser").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
2450
2536
  try {
2451
2537
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
2452
- const { RunCommand } = await import("./run-ST3FR75O.js");
2538
+ const { RunCommand } = await import("./run-RGZHCQ6M.js");
2453
2539
  const cmd = new RunCommand();
2454
2540
  const input = identifier ? { identifier, args } : { args };
2455
2541
  await cmd.execute(input);
@@ -2460,7 +2546,7 @@ program.command("run").description("Run CLI tool or open workspace in browser").
2460
2546
  });
2461
2547
  program.command("vscode").description("Install iloom VS Code extension and open workspace in VS Code").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--no-wait", "Skip keypress prompt and open immediately").action(async (identifier, options) => {
2462
2548
  try {
2463
- const { VSCodeCommand } = await import("./vscode-TOGE5N67.js");
2549
+ const { VSCodeCommand } = await import("./vscode-3I7ISHUU.js");
2464
2550
  const cmd = new VSCodeCommand();
2465
2551
  await cmd.execute({ identifier, wait: options == null ? void 0 : options.wait });
2466
2552
  } catch (error) {
@@ -2469,7 +2555,7 @@ program.command("vscode").description("Install iloom VS Code extension and open
2469
2555
  });
2470
2556
  program.command("dev-server").alias("dev").description("Start dev server for workspace (foreground)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--json", "Output as JSON").action(async (identifier, options) => {
2471
2557
  try {
2472
- const { DevServerCommand } = await import("./dev-server-CYRP6M73.js");
2558
+ const { DevServerCommand } = await import("./dev-server-ZNTLWOL5.js");
2473
2559
  const cmd = new DevServerCommand();
2474
2560
  await cmd.execute({ identifier, json: options == null ? void 0 : options.json });
2475
2561
  } catch (error) {
@@ -2479,7 +2565,7 @@ program.command("dev-server").alias("dev").description("Start dev server for wor
2479
2565
  });
2480
2566
  program.command("shell").alias("terminal").description("Open interactive shell with workspace environment").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2481
2567
  try {
2482
- const { ShellCommand } = await import("./shell-W4SBQPTE.js");
2568
+ const { ShellCommand } = await import("./shell-7ADCDFIV.js");
2483
2569
  const cmd = new ShellCommand();
2484
2570
  await cmd.execute({ identifier });
2485
2571
  } catch (error) {
@@ -2489,7 +2575,7 @@ program.command("shell").alias("terminal").description("Open interactive shell w
2489
2575
  });
2490
2576
  program.command("build").description("Run the build script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2491
2577
  try {
2492
- const { BuildCommand } = await import("./build-OLS6J5KZ.js");
2578
+ const { BuildCommand } = await import("./build-V3KADFMO.js");
2493
2579
  const cmd = new BuildCommand();
2494
2580
  await cmd.execute(identifier ? { identifier } : {});
2495
2581
  } catch (error) {
@@ -2499,7 +2585,7 @@ program.command("build").description("Run the build script").argument("[identifi
2499
2585
  });
2500
2586
  program.command("lint").description("Run the lint script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2501
2587
  try {
2502
- const { LintCommand } = await import("./lint-BSWRMGPZ.js");
2588
+ const { LintCommand } = await import("./lint-XIXKU22H.js");
2503
2589
  const cmd = new LintCommand();
2504
2590
  await cmd.execute(identifier ? { identifier } : {});
2505
2591
  } catch (error) {
@@ -2509,7 +2595,7 @@ program.command("lint").description("Run the lint script").argument("[identifier
2509
2595
  });
2510
2596
  program.command("test").description("Run the test script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2511
2597
  try {
2512
- const { TestCommand } = await import("./test-6JH4FE2X.js");
2598
+ const { TestCommand } = await import("./test-SRB7EWU6.js");
2513
2599
  const cmd = new TestCommand();
2514
2600
  await cmd.execute(identifier ? { identifier } : {});
2515
2601
  } catch (error) {
@@ -2519,7 +2605,7 @@ program.command("test").description("Run the test script").argument("[identifier
2519
2605
  });
2520
2606
  program.command("compile").alias("typecheck").description("Run the compile or typecheck script (prefers compile if both exist)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2521
2607
  try {
2522
- const { CompileCommand } = await import("./compile-4NCQECKE.js");
2608
+ const { CompileCommand } = await import("./compile-2MD346PO.js");
2523
2609
  const cmd = new CompileCommand();
2524
2610
  await cmd.execute(identifier ? { identifier } : {});
2525
2611
  } catch (error) {
@@ -2529,7 +2615,7 @@ program.command("compile").alias("typecheck").description("Run the compile or ty
2529
2615
  });
2530
2616
  program.command("install-deps").description("Install dependencies for a workspace").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--no-frozen", "Allow lockfile updates (default: frozen/locked)").action(async (identifier, options) => {
2531
2617
  try {
2532
- const { InstallDepsCommand } = await import("./install-deps-SRTM5U7D.js");
2618
+ const { InstallDepsCommand } = await import("./install-deps-J4ALTM27.js");
2533
2619
  const cmd = new InstallDepsCommand();
2534
2620
  const input = {};
2535
2621
  if (identifier) input.identifier = identifier;
@@ -2543,7 +2629,7 @@ program.command("install-deps").description("Install dependencies for a workspac
2543
2629
  program.command("cleanup").alias("remove").alias("clean").description("Remove workspaces").argument("[identifier]", "Branch name or issue number to cleanup (auto-detected)").option("-l, --list", "List all worktrees").option("-a, --all", "Remove all worktrees (interactive confirmation)").option("-i, --issue <number>", "Cleanup by issue number", parseInt).option("-f, --force", "Skip confirmations and force removal").option("--dry-run", "Show what would be done without doing it").option("--json", "Output result as JSON").option("--archive", "Archive metadata instead of deleting (preserves loom in il list --finished)").option("--defer <ms>", "Wait specified milliseconds before cleanup", parseInt).action(async (identifier, options) => {
2544
2630
  const executeAction = async () => {
2545
2631
  try {
2546
- const { CleanupCommand } = await import("./cleanup-YOM6PQCN.js");
2632
+ const { CleanupCommand } = await import("./cleanup-RJKLI47I.js");
2547
2633
  const command = new CleanupCommand();
2548
2634
  const input = {
2549
2635
  options: options ?? {}
@@ -2893,7 +2979,7 @@ program.command("list").description("Show active workspaces").option("--json", "
2893
2979
  });
2894
2980
  program.command("projects").description("List configured iloom projects").option("--json", "Output as JSON (default behavior)").action(async (options) => {
2895
2981
  try {
2896
- const { ProjectsCommand } = await import("./projects-IUSUXD5D.js");
2982
+ const { ProjectsCommand } = await import("./projects-L5AHUBGA.js");
2897
2983
  const command = new ProjectsCommand();
2898
2984
  const result = await command.execute(options);
2899
2985
  console.log(JSON.stringify(result, null, 2));
@@ -2904,7 +2990,7 @@ program.command("projects").description("List configured iloom projects").option
2904
2990
  });
2905
2991
  program.command("issues").description("List project issues from configured issue tracker").argument("[project-path]", "Path to project root (auto-detected if omitted)").option("--json", "Output as JSON (default behavior)").option("--limit <n>", "Max issues to return", "100").option("--sprint <name>", 'Jira only: filter by sprint name (e.g., "Sprint 17") or "current" for active sprint').option("--mine", "Show only issues and PRs assigned to me").action(async (projectPath, options) => {
2906
2992
  try {
2907
- const { IssuesCommand } = await import("./issues-DMRQJH7E.js");
2993
+ const { IssuesCommand } = await import("./issues-LZMIF22U.js");
2908
2994
  const command = new IssuesCommand();
2909
2995
  const parsedLimit = parseInt((options == null ? void 0 : options.limit) ?? "100", 10);
2910
2996
  const limit = Number.isNaN(parsedLimit) || parsedLimit <= 0 ? 100 : parsedLimit;
@@ -2922,7 +3008,7 @@ program.command("issues").description("List project issues from configured issue
2922
3008
  });
2923
3009
  program.command("init").alias("config").description("Initialize iloom configuration").argument("[prompt]", 'Custom initial message to send to Claude (defaults to "Help me configure iloom settings.")').addOption(new Option("--accept-defaults").hideHelp()).action(async (prompt, options) => {
2924
3010
  try {
2925
- const { InitCommand } = await import("./init-CI43GJHV.js");
3011
+ const { InitCommand } = await import("./init-5HFY7JG6.js");
2926
3012
  const command = new InitCommand();
2927
3013
  const trimmedPrompt = prompt == null ? void 0 : prompt.trim();
2928
3014
  const customPrompt = trimmedPrompt && trimmedPrompt.length > 0 ? trimmedPrompt : void 0;
@@ -2936,7 +3022,7 @@ program.command("plan").description("Launch interactive planning session with Ar
2936
3022
  new Option("--output-format <format>", "Output format for Claude CLI (requires --print)").choices(["json", "stream-json", "text"])
2937
3023
  ).option("--verbose", "Enable verbose output (requires --print)").option("--json", "Output final result as JSON object (requires --print)").option("--json-stream", "Stream JSONL output to stdout in real-time (requires --print)").option("--auto-swarm", "Enable auto-swarm: plan, start epic, and spin automatically").action(async (prompt, options) => {
2938
3024
  try {
2939
- const { PlanCommand } = await import("./plan-SWFPLNJE.js");
3025
+ const { PlanCommand } = await import("./plan-7CF56OIR.js");
2940
3026
  const command = new PlanCommand();
2941
3027
  if ((options == null ? void 0 : options.json) && (options == null ? void 0 : options.jsonStream)) {
2942
3028
  logger.error("--json and --json-stream are mutually exclusive");
@@ -2963,7 +3049,7 @@ program.command("plan").description("Launch interactive planning session with Ar
2963
3049
  });
2964
3050
  program.command("contribute").description("Set up local development environment for contributing to a GitHub project").argument("[repository]", "GitHub repository (owner/repo, github.com/owner/repo, or full URL). Defaults to iloom-ai/iloom-cli").action(async (repository) => {
2965
3051
  try {
2966
- const { ContributeCommand } = await import("./contribute-M5UWXCAV.js");
3052
+ const { ContributeCommand } = await import("./contribute-P4BMRY7C.js");
2967
3053
  const command = new ContributeCommand();
2968
3054
  await command.execute(repository);
2969
3055
  } catch (error) {
@@ -2973,7 +3059,7 @@ program.command("contribute").description("Set up local development environment
2973
3059
  });
2974
3060
  program.command("update").description("Update iloom-cli to the latest version").option("--dry-run", "Show what would be done without actually updating").action(async (options) => {
2975
3061
  try {
2976
- const { UpdateCommand } = await import("./update-XLW7R7FL.js");
3062
+ const { UpdateCommand } = await import("./update-AD3GE5C4.js");
2977
3063
  const command = new UpdateCommand();
2978
3064
  await command.execute(options);
2979
3065
  } catch (error) {
@@ -2983,8 +3069,8 @@ program.command("update").description("Update iloom-cli to the latest version").
2983
3069
  });
2984
3070
  program.command("test-github").description("Test GitHub integration (Issue #3)").argument("<identifier>", "Issue number or PR number").option("--no-claude", "Skip Claude for branch name generation").action(async (identifier, options) => {
2985
3071
  try {
2986
- const { GitHubService: GitHubService2 } = await import("./GitHubService-2R5GQG4K.js");
2987
- const { DefaultBranchNamingService } = await import("./BranchNamingService-XBCO747L.js");
3072
+ const { GitHubService: GitHubService2 } = await import("./GitHubService-UTAYZXL3.js");
3073
+ const { DefaultBranchNamingService } = await import("./BranchNamingService-MEK2WZUD.js");
2988
3074
  logger.info("Testing GitHub Integration\n");
2989
3075
  const service = new GitHubService2();
2990
3076
  const branchNaming = new DefaultBranchNamingService({ useClaude: options.claude !== false });
@@ -3042,10 +3128,10 @@ program.command("test-github").description("Test GitHub integration (Issue #3)")
3042
3128
  });
3043
3129
  program.command("test-claude").description("Test Claude integration (Issue #10)").option("--detect", "Test Claude CLI detection").option("--version", "Get Claude CLI version").option("--branch <title>", "Test branch name generation with given title").option("--issue <number>", "Issue number for branch generation", "123").option("--launch <prompt>", "Launch Claude with a prompt (headless)").option("--interactive", "Launch Claude interactively (requires --launch)").option("--template <name>", "Test template loading").action(async (options) => {
3044
3130
  try {
3045
- const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-ONQTDWV3.js");
3046
- const { PromptTemplateManager } = await import("./PromptTemplateManager-T5VTLJP3.js");
3047
- const { ClaudeService } = await import("./ClaudeService-6E6MCGJE.js");
3048
- const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-SXDCWDJA.js");
3131
+ const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-ACL7G4CF.js");
3132
+ const { PromptTemplateManager } = await import("./PromptTemplateManager-I75WKXM4.js");
3133
+ const { ClaudeService } = await import("./ClaudeService-LEPW6QAC.js");
3134
+ const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-RRGREEZQ.js");
3049
3135
  logger.info("Testing Claude Integration\n");
3050
3136
  if (options.detect) {
3051
3137
  logger.info("Detecting Claude CLI...");
@@ -3180,7 +3266,7 @@ program.command("test-claude").description("Test Claude integration (Issue #10)"
3180
3266
  });
3181
3267
  program.command("test-webserver").description("Test if a web server is running on a workspace port").argument("<issue-number>", "Issue number (port will be calculated as 3000 + issue number)", parseInt).option("--kill", "Kill the web server if detected").action(async (issueNumber, options) => {
3182
3268
  try {
3183
- const { TestWebserverCommand } = await import("./test-webserver-QI3QQFZ3.js");
3269
+ const { TestWebserverCommand } = await import("./test-webserver-GZFVXBGD.js");
3184
3270
  const command = new TestWebserverCommand();
3185
3271
  await command.execute({ issueNumber, options });
3186
3272
  } catch (error) {
@@ -3193,7 +3279,7 @@ program.command("test-webserver").description("Test if a web server is running o
3193
3279
  });
3194
3280
  program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
3195
3281
  try {
3196
- const { TestGitCommand } = await import("./test-git-2KFFAQ6B.js");
3282
+ const { TestGitCommand } = await import("./test-git-G7ATVIXG.js");
3197
3283
  const command = new TestGitCommand();
3198
3284
  await command.execute();
3199
3285
  } catch (error) {
@@ -3206,7 +3292,7 @@ program.command("test-git").description("Test Git integration - findMainWorktree
3206
3292
  });
3207
3293
  program.command("test-tabs").description("Test iTerm2 dual tab functionality - opens two tabs with test commands").action(async () => {
3208
3294
  try {
3209
- const { TestTabsCommand } = await import("./test-tabs-YDWMWTVA.js");
3295
+ const { TestTabsCommand } = await import("./test-tabs-NGPTFD5T.js");
3210
3296
  const command = new TestTabsCommand();
3211
3297
  await command.execute();
3212
3298
  } catch (error) {
@@ -3219,7 +3305,7 @@ program.command("test-tabs").description("Test iTerm2 dual tab functionality - o
3219
3305
  });
3220
3306
  program.command("test-prefix").description("[DEPRECATED] Test worktree prefix configuration - preview worktree paths").action(async () => {
3221
3307
  try {
3222
- const { TestPrefixCommand } = await import("./test-prefix-GP2DAX37.js");
3308
+ const { TestPrefixCommand } = await import("./test-prefix-JMDGXR5A.js");
3223
3309
  const command = new TestPrefixCommand();
3224
3310
  await command.execute();
3225
3311
  } catch (error) {
@@ -3233,7 +3319,7 @@ program.command("test-prefix").description("[DEPRECATED] Test worktree prefix co
3233
3319
  program.command("summary").description("Generate Claude session summary for a loom").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--with-comment", "Post summary as a comment to the issue/PR").option("--json", "Output result as JSON").action(async (identifier, options) => {
3234
3320
  const executeAction = async () => {
3235
3321
  try {
3236
- const { SummaryCommand } = await import("./summary-P2JCIIJO.js");
3322
+ const { SummaryCommand } = await import("./summary-7J2HORFD.js");
3237
3323
  const command = new SummaryCommand();
3238
3324
  const result = await command.execute({ identifier, options });
3239
3325
  if (options.json && result) {
@@ -3263,7 +3349,7 @@ program.command("summary").description("Generate Claude session summary for a lo
3263
3349
  program.command("recap").description("Get recap for a loom (defaults to current directory)").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--json", "Output as JSON with filePath for file watching").action(async (identifier, options) => {
3264
3350
  const executeAction = async () => {
3265
3351
  try {
3266
- const { RecapCommand } = await import("./recap-GGVCG5VH.js");
3352
+ const { RecapCommand } = await import("./recap-IDBO3KM5.js");
3267
3353
  const command = new RecapCommand();
3268
3354
  const result = await command.execute({ identifier, json: options.json });
3269
3355
  if (options.json && result) {
@@ -3293,7 +3379,7 @@ program.command("recap").description("Get recap for a loom (defaults to current
3293
3379
  var testJiraCommand = program.command("test-jira").description("Test Jira integration methods against a real Jira instance");
3294
3380
  testJiraCommand.command("child-issue").description("Create a test child issue under a parent").argument("<parentKey>", "Parent issue key (e.g., PROJ-123)").action(async (parentKey) => {
3295
3381
  try {
3296
- const { TestJiraCommand } = await import("./test-jira-FKDKG6CD.js");
3382
+ const { TestJiraCommand } = await import("./test-jira-Q2HPA522.js");
3297
3383
  await new TestJiraCommand().createChildIssue(parentKey);
3298
3384
  } catch (error) {
3299
3385
  logger.error(`Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
@@ -3302,7 +3388,7 @@ testJiraCommand.command("child-issue").description("Create a test child issue un
3302
3388
  });
3303
3389
  testJiraCommand.command("create-dep").description('Create a "Blocks" dependency between two issues').argument("<blockingKey>", "Issue key that blocks (e.g., PROJ-100)").argument("<blockedKey>", "Issue key being blocked (e.g., PROJ-200)").action(async (blockingKey, blockedKey) => {
3304
3390
  try {
3305
- const { TestJiraCommand } = await import("./test-jira-FKDKG6CD.js");
3391
+ const { TestJiraCommand } = await import("./test-jira-Q2HPA522.js");
3306
3392
  await new TestJiraCommand().createDependency(blockingKey, blockedKey);
3307
3393
  } catch (error) {
3308
3394
  logger.error(`Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
@@ -3311,7 +3397,7 @@ testJiraCommand.command("create-dep").description('Create a "Blocks" dependency
3311
3397
  });
3312
3398
  testJiraCommand.command("get-deps").description("Fetch and print dependencies for an issue").argument("<issueKey>", "Issue key (e.g., PROJ-123)").action(async (issueKey) => {
3313
3399
  try {
3314
- const { TestJiraCommand } = await import("./test-jira-FKDKG6CD.js");
3400
+ const { TestJiraCommand } = await import("./test-jira-Q2HPA522.js");
3315
3401
  await new TestJiraCommand().getDependencies(issueKey);
3316
3402
  } catch (error) {
3317
3403
  logger.error(`Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
@@ -3320,7 +3406,7 @@ testJiraCommand.command("get-deps").description("Fetch and print dependencies fo
3320
3406
  });
3321
3407
  testJiraCommand.command("remove-dep").description('Remove a "Blocks" dependency between two issues').argument("<blockingKey>", "Issue key that blocks (e.g., PROJ-100)").argument("<blockedKey>", "Issue key being blocked (e.g., PROJ-200)").action(async (blockingKey, blockedKey) => {
3322
3408
  try {
3323
- const { TestJiraCommand } = await import("./test-jira-FKDKG6CD.js");
3409
+ const { TestJiraCommand } = await import("./test-jira-Q2HPA522.js");
3324
3410
  await new TestJiraCommand().removeDependency(blockingKey, blockedKey);
3325
3411
  } catch (error) {
3326
3412
  logger.error(`Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
@@ -3329,51 +3415,54 @@ testJiraCommand.command("remove-dep").description('Remove a "Blocks" dependency
3329
3415
  });
3330
3416
  testJiraCommand.command("get-children").description("List child issues of a parent").argument("<issueKey>", "Parent issue key (e.g., PROJ-123)").action(async (issueKey) => {
3331
3417
  try {
3332
- const { TestJiraCommand } = await import("./test-jira-FKDKG6CD.js");
3418
+ const { TestJiraCommand } = await import("./test-jira-Q2HPA522.js");
3333
3419
  await new TestJiraCommand().getChildIssues(issueKey);
3334
3420
  } catch (error) {
3335
3421
  logger.error(`Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3336
3422
  process.exit(1);
3337
3423
  }
3338
3424
  });
3339
- program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
3340
- var _a2;
3425
+ program.command("test-db").description("Test database provider integration and debug configuration").action(async () => {
3341
3426
  try {
3342
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-WQ5NSGAH.js");
3343
- const { createNeonProviderFromSettings: createNeonProviderFromSettings2 } = await import("./neon-helpers-HWIYRKOW.js");
3344
- logger.info("Testing Neon Integration\n");
3427
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-KQU7OX7G.js");
3428
+ const { createDatabaseProviderFromSettings: createDatabaseProviderFromSettings2 } = await import("./database-helpers-PRDFNDRO.js");
3429
+ logger.info("Testing Database Provider Integration\n");
3345
3430
  logger.info("1. Settings Configuration:");
3346
3431
  const settingsManager = new SettingsManager2();
3347
3432
  const settings = await settingsManager.loadSettings();
3348
- const neonConfig = (_a2 = settings.databaseProviders) == null ? void 0 : _a2.neon;
3349
- logger.info(` projectId: ${(neonConfig == null ? void 0 : neonConfig.projectId) ?? "(not configured)"}`);
3350
- logger.info(` parentBranch: ${(neonConfig == null ? void 0 : neonConfig.parentBranch) ?? "(not configured)"}`);
3351
- logger.info("\n2. Creating NeonProvider...");
3433
+ logger.info("\n2. Creating database provider...");
3352
3434
  try {
3353
- const neonProvider = createNeonProviderFromSettings2(settings);
3354
- logger.success(" NeonProvider created successfully");
3355
- logger.info("\n3. Testing Neon CLI availability...");
3356
- const isAvailable = await neonProvider.isCliAvailable();
3435
+ const provider = createDatabaseProviderFromSettings2(settings);
3436
+ logger.info(` Provider: ${provider.displayName}`);
3437
+ const isConfigured = provider.isConfigured();
3438
+ if (isConfigured) {
3439
+ logger.success(` ${provider.displayName} is configured`);
3440
+ } else {
3441
+ logger.warn(` ${provider.displayName} is not configured`);
3442
+ }
3443
+ logger.info(`
3444
+ 3. Testing ${provider.displayName} CLI availability...`);
3445
+ const isAvailable = await provider.isCliAvailable();
3357
3446
  if (isAvailable) {
3358
- logger.success(" Neon CLI is available");
3447
+ logger.success(` ${provider.displayName} CLI is available`);
3359
3448
  } else {
3360
- logger.error(" Neon CLI not found");
3361
- logger.info(" Install with: npm install -g @neon/cli");
3449
+ logger.error(` ${provider.displayName} CLI not found`);
3450
+ logger.info(` Install with: ${provider.installHint}`);
3362
3451
  return;
3363
3452
  }
3364
- logger.info("\n4. Testing Neon CLI authentication...");
3365
- const isAuthenticated = await neonProvider.isAuthenticated();
3453
+ logger.info(`
3454
+ 4. Testing ${provider.displayName} CLI authentication...`);
3455
+ const isAuthenticated = await provider.isAuthenticated();
3366
3456
  if (isAuthenticated) {
3367
- logger.success(" Neon CLI is authenticated");
3457
+ logger.success(` ${provider.displayName} CLI is authenticated`);
3368
3458
  } else {
3369
- logger.error(" Neon CLI not authenticated");
3370
- logger.info(" Run: neon auth");
3459
+ logger.error(` ${provider.displayName} CLI not authenticated`);
3371
3460
  return;
3372
3461
  }
3373
- if (neonConfig == null ? void 0 : neonConfig.projectId) {
3462
+ if (isConfigured) {
3374
3463
  logger.info("\n5. Testing branch listing...");
3375
3464
  try {
3376
- const branches = await neonProvider.listBranches();
3465
+ const branches = await provider.listBranches();
3377
3466
  logger.success(` Found ${branches.length} branches:`);
3378
3467
  for (const branch of branches.slice(0, 5)) {
3379
3468
  logger.info(` - ${branch}`);
@@ -3385,17 +3474,18 @@ program.command("test-neon").description("Test Neon integration and debug config
3385
3474
  logger.error(` Failed to list branches: ${error instanceof Error ? error.message : "Unknown error"}`);
3386
3475
  }
3387
3476
  } else {
3388
- logger.warn("\n5. Skipping branch listing (Neon not configured in settings)");
3477
+ logger.warn(`
3478
+ 5. Skipping branch listing (${provider.displayName} not configured in settings)`);
3389
3479
  }
3390
3480
  } catch (error) {
3391
- logger.error(` Failed to create NeonProvider: ${error instanceof Error ? error.message : "Unknown error"}`);
3481
+ logger.error(` Failed to create database provider: ${error instanceof Error ? error.message : "Unknown error"}`);
3392
3482
  if (error instanceof Error && error.message.includes("not configured")) {
3393
- logger.info("\n This is expected if Neon is not configured.");
3394
- logger.info(" Configure databaseProviders.neon in .iloom/settings.json to test fully.");
3483
+ logger.info("\n This is expected if no database provider is configured.");
3484
+ logger.info(" Configure databaseProviders in .iloom/settings.json to test fully.");
3395
3485
  }
3396
3486
  }
3397
3487
  logger.info("\n" + "=".repeat(50));
3398
- logger.success("Neon integration test complete!");
3488
+ logger.success("Database provider integration test complete!");
3399
3489
  } catch (error) {
3400
3490
  logger.error(`Test failed: ${error instanceof Error ? error.message : "Unknown error"}`);
3401
3491
  if (error instanceof Error && error.stack) {
@@ -3435,6 +3525,69 @@ program.command("help").description("Display help information").argument("[comma
3435
3525
  }
3436
3526
  process.exit(0);
3437
3527
  });
3528
+ if (process.env.ILOOM_DEBUG === "true") {
3529
+ const debugCommand = program.command("debug").description("Debug tools (only available in debug mode)");
3530
+ const bitbucketDebugCommand = debugCommand.command("bitbucket").description("BitBucket debug tools");
3531
+ bitbucketDebugCommand.command("resolve-reviewer-ids").description("Resolve configured reviewer usernames to BitBucket account IDs").action(async () => {
3532
+ var _a2;
3533
+ try {
3534
+ const settingsManager = new SettingsManager();
3535
+ const settings = await settingsManager.loadSettings();
3536
+ const bitbucketConfig = (_a2 = settings.versionControl) == null ? void 0 : _a2.bitbucket;
3537
+ if (!bitbucketConfig) {
3538
+ logger.error("BitBucket configuration not found in settings");
3539
+ logger.info("Configure versionControl.bitbucket in .iloom/settings.json");
3540
+ process.exit(1);
3541
+ }
3542
+ if (!bitbucketConfig.username) {
3543
+ logger.error("BitBucket username not configured");
3544
+ logger.info("Configure versionControl.bitbucket.username in .iloom/settings.json");
3545
+ process.exit(1);
3546
+ }
3547
+ if (!bitbucketConfig.apiToken) {
3548
+ logger.error("BitBucket API token not configured");
3549
+ logger.info("Configure versionControl.bitbucket.apiToken in .iloom/settings.local.json");
3550
+ process.exit(1);
3551
+ }
3552
+ const reviewers = bitbucketConfig.reviewers ?? [];
3553
+ if (reviewers.length === 0) {
3554
+ logger.warn("No reviewers configured in settings");
3555
+ logger.info("Configure versionControl.bitbucket.reviewers in .iloom/settings.json");
3556
+ console.log(JSON.stringify({}, null, 2));
3557
+ process.exit(0);
3558
+ }
3559
+ let workspace = bitbucketConfig.workspace;
3560
+ if (!workspace) {
3561
+ const { parseGitRemotes } = await import("./remote-RO4LZKT2.js");
3562
+ const remotes = await parseGitRemotes();
3563
+ const bitbucketRemote = remotes.find((r) => r.url.includes("bitbucket.org"));
3564
+ if (!bitbucketRemote) {
3565
+ logger.error("Could not auto-detect BitBucket workspace from git remote");
3566
+ logger.info("Configure versionControl.bitbucket.workspace in .iloom/settings.json");
3567
+ process.exit(1);
3568
+ }
3569
+ workspace = bitbucketRemote.owner;
3570
+ }
3571
+ const resolvedWorkspace = workspace;
3572
+ const { BitBucketApiClient } = await import("./BitBucketApiClient-J2ZSCS5N.js");
3573
+ const apiClient = new BitBucketApiClient({
3574
+ username: bitbucketConfig.username,
3575
+ apiToken: bitbucketConfig.apiToken,
3576
+ workspace: resolvedWorkspace
3577
+ });
3578
+ const resolvedMap = await apiClient.findUsersByUsername(resolvedWorkspace, reviewers);
3579
+ const result = {};
3580
+ for (const [username, accountId] of resolvedMap) {
3581
+ result[username] = accountId;
3582
+ }
3583
+ console.log(JSON.stringify(result, null, 2));
3584
+ process.exit(0);
3585
+ } catch (error) {
3586
+ logger.error(`Failed to resolve reviewer IDs: ${error instanceof Error ? error.message : "Unknown error"}`);
3587
+ process.exit(1);
3588
+ }
3589
+ });
3590
+ }
3438
3591
  var isRunDirectly = process.argv[1] && (() => {
3439
3592
  try {
3440
3593
  const scriptPath = realpathSync2(process.argv[1]);