@iloom/cli 0.11.0 → 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.
- package/LICENSE +1 -1
- package/README.md +153 -13
- package/dist/BitBucketApiClient-J2ZSCS5N.js +10 -0
- package/dist/BitBucketVCSProvider-5X64IXXW.js +12 -0
- package/dist/{BranchNamingService-XBCO747L.js → BranchNamingService-MEK2WZUD.js} +4 -4
- package/dist/ClaudeContextManager-IENAE2CP.js +14 -0
- package/dist/ClaudeService-YIJCZUUB.js +13 -0
- package/dist/GitHubService-UTAYZXL3.js +12 -0
- package/dist/IssueTrackerFactory-2OI7YIN6.js +15 -0
- package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-3TSFW7QP.js} +10 -10
- package/dist/MetadataManager-V4LSJ2PB.js +10 -0
- package/dist/ProjectCapabilityDetector-I4J66WKF.js +11 -0
- package/dist/{PromptTemplateManager-T5VTLJP3.js → PromptTemplateManager-I75WKXM4.js} +3 -3
- package/dist/README.md +153 -13
- package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-BMQCAXPP.js} +13 -5
- package/dist/SettingsMigrationManager-ZPARZ5KH.js +10 -0
- package/dist/agents/iloom-code-reviewer.md +2 -1
- package/dist/agents/iloom-framework-detector.md +0 -1
- package/dist/agents/iloom-issue-analyze-and-plan.md +4 -1
- package/dist/agents/iloom-issue-analyzer.md +4 -1
- package/dist/agents/iloom-issue-complexity-evaluator.md +4 -1
- package/dist/agents/iloom-issue-enhancer.md +4 -1
- package/dist/agents/iloom-issue-implementer.md +8 -3
- package/dist/agents/iloom-issue-planner.md +4 -1
- package/dist/agents/iloom-wave-verifier.md +186 -0
- package/dist/browser-VZY7F2DF.js +10 -0
- package/dist/build-DMWSIME6.js +27 -0
- package/dist/{chunk-UHIBKD73.js → chunk-35CBWAJL.js} +13 -32
- package/dist/{chunk-UHIBKD73.js.map → chunk-35CBWAJL.js.map} +1 -1
- package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
- package/dist/chunk-4JZEQBWV.js.map +1 -0
- package/dist/{chunk-ET6A2JR4.js → chunk-653XBU3L.js} +111 -18
- package/dist/chunk-653XBU3L.js.map +1 -0
- package/dist/{chunk-G2MNSPA4.js → chunk-772N5WCA.js} +2 -2
- package/dist/{chunk-WG4MLJ6J.js → chunk-7RCUWU3I.js} +2 -2
- package/dist/chunk-7RCUWU3I.js.map +1 -0
- package/dist/{chunk-NOMQ5RFG.js → chunk-7UBEHQTP.js} +2 -2
- package/dist/{chunk-7NFCGKZT.js → chunk-AQUSMNBF.js} +3 -3
- package/dist/{chunk-IDCE26KD.js → chunk-AUYSAMXV.js} +3 -3
- package/dist/chunk-AYLC633W.js +406 -0
- package/dist/chunk-AYLC633W.js.map +1 -0
- package/dist/{chunk-HLDY5S4C.js → chunk-BFF27W3S.js} +3 -3
- package/dist/{chunk-QVAA5KHK.js → chunk-BZ7KTXPB.js} +16 -8
- package/dist/chunk-BZ7KTXPB.js.map +1 -0
- package/dist/{chunk-K7R5QY6C.js → chunk-CE676WCN.js} +2 -2
- package/dist/{chunk-5UFGO4ZT.js → chunk-CQHHEW2M.js} +6 -3
- package/dist/chunk-CQHHEW2M.js.map +1 -0
- package/dist/{chunk-LHDD4JHC.js → chunk-D4Q7T5KD.js} +4 -4
- package/dist/{chunk-RBYTXYGD.js → chunk-D75KSI3V.js} +2 -2
- package/dist/{chunk-Y3RX7LZT.js → chunk-DDHWZNGL.js} +18 -12
- package/dist/chunk-DDHWZNGL.js.map +1 -0
- package/dist/{chunk-5LTID2AF.js → chunk-DMSL5BAP.js} +35 -6
- package/dist/{chunk-5LTID2AF.js.map → chunk-DMSL5BAP.js.map} +1 -1
- package/dist/{chunk-SQYHPBFP.js → chunk-EGNUOALL.js} +2 -2
- package/dist/{chunk-LL6TOX3G.js → chunk-EQIII6GI.js} +10 -10
- package/dist/chunk-EQIII6GI.js.map +1 -0
- package/dist/{chunk-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
- package/dist/{chunk-LE2NOUTN.js → chunk-FV4KXBGO.js} +3 -3
- package/dist/{chunk-XFQGI2E3.js → chunk-GWJWECZB.js} +51 -45
- package/dist/chunk-GWJWECZB.js.map +1 -0
- package/dist/{chunk-QNHZM5ZV.js → chunk-HIGWKLQR.js} +3 -3
- package/dist/{chunk-VMZG66UV.js → chunk-HKEXRZMU.js} +3 -3
- package/dist/{chunk-V4STTBQD.js → chunk-IHSA7VGI.js} +9 -9
- package/dist/{chunk-TEJAGQX2.js → chunk-IS46GQRA.js} +33 -33
- package/dist/{chunk-VNYWBHKR.js → chunk-JD3K2344.js} +3 -3
- package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
- package/dist/{chunk-QR4FU53I.js → chunk-KCZSUJUR.js} +22 -12
- package/dist/chunk-KCZSUJUR.js.map +1 -0
- package/dist/{chunk-NH3QZYE5.js → chunk-KV4NU3RP.js} +2 -2
- package/dist/{chunk-NDSGJZI2.js → chunk-LOAYWTJJ.js} +2 -2
- package/dist/{chunk-ABVMUNCD.js → chunk-M3FBM4T3.js} +64 -10
- package/dist/chunk-M3FBM4T3.js.map +1 -0
- package/dist/{chunk-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
- package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
- package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
- package/dist/{chunk-7FIXNAUO.js → chunk-OKB2NEDQ.js} +66 -43
- package/dist/chunk-OKB2NEDQ.js.map +1 -0
- package/dist/{chunk-3RXYOBME.js → chunk-OPQC4OWM.js} +5 -5
- package/dist/{chunk-3RXYOBME.js.map → chunk-OPQC4OWM.js.map} +1 -1
- package/dist/chunk-P5MXXHXQ.js +284 -0
- package/dist/chunk-P5MXXHXQ.js.map +1 -0
- package/dist/{chunk-IR74O2F6.js → chunk-PDG74IJT.js} +239 -162
- package/dist/chunk-PDG74IJT.js.map +1 -0
- package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
- package/dist/{chunk-TZNNJLGT.js → chunk-PMB6TYV4.js} +6 -6
- package/dist/chunk-QC65IOV3.js +304 -0
- package/dist/chunk-QC65IOV3.js.map +1 -0
- package/dist/{chunk-6YVJVUR4.js → chunk-QF2DROQR.js} +3 -3
- package/dist/{chunk-XXFSOVL3.js → chunk-QFDM23CO.js} +4 -4
- package/dist/{chunk-RMLADZRY.js → chunk-R7DGN73N.js} +5 -5
- package/dist/{chunk-5PNZBH6V.js → chunk-V5IYLWRA.js} +2 -2
- package/dist/{chunk-KQFIGI37.js → chunk-VA6CWUAE.js} +7 -7
- package/dist/{chunk-3GTUXW26.js → chunk-VIQOQ463.js} +19 -3
- package/dist/chunk-VIQOQ463.js.map +1 -0
- package/dist/{chunk-H2SSF24U.js → chunk-VRPPI6GU.js} +17 -6
- package/dist/{chunk-H2SSF24U.js.map → chunk-VRPPI6GU.js.map} +1 -1
- package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
- package/dist/{chunk-VUUN3KE4.js → chunk-XVCGPTEQ.js} +8 -8
- package/dist/chunk-XVCGPTEQ.js.map +1 -0
- package/dist/chunk-YWNF5755.js +696 -0
- package/dist/chunk-YWNF5755.js.map +1 -0
- package/dist/{chunk-UDCI3QTS.js → chunk-ZM2AYHMO.js} +2 -2
- package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
- package/dist/{cleanup-YOM6PQCN.js → cleanup-RLBLNQZN.js} +37 -34
- package/dist/{cleanup-YOM6PQCN.js.map → cleanup-RLBLNQZN.js.map} +1 -1
- package/dist/cli.js +290 -141
- package/dist/cli.js.map +1 -1
- package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
- package/dist/{commit-DC2Q5CDY.js → commit-RILBXFWO.js} +15 -15
- package/dist/{compile-4NCQECKE.js → compile-QEL5724K.js} +11 -11
- package/dist/{contribute-M5UWXCAV.js → contribute-EHWLYOMZ.js} +11 -11
- package/dist/{contribute-M5UWXCAV.js.map → contribute-EHWLYOMZ.js.map} +1 -1
- package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
- package/dist/{dev-server-CYRP6M73.js → dev-server-2WSWZXJG.js} +35 -21
- package/dist/dev-server-2WSWZXJG.js.map +1 -0
- package/dist/{feedback-BMAZGKRW.js → feedback-I6ZEHEUB.js} +17 -17
- package/dist/{git-BXUD6CL5.js → git-I3PO6FY7.js} +6 -6
- package/dist/ignite-XZFYRVRJ.js +35 -0
- package/dist/index.d.ts +200 -16
- package/dist/index.js +164 -55
- package/dist/index.js.map +1 -1
- package/dist/{init-CI43GJHV.js → init-A6WRP77L.js} +18 -18
- package/dist/{install-deps-SRTM5U7D.js → install-deps-HXP2TM7G.js} +11 -11
- package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
- package/dist/{issues-DMRQJH7E.js → issues-SUFQJY6O.js} +69 -56
- package/dist/issues-SUFQJY6O.js.map +1 -0
- package/dist/lint-FDZC77GL.js +27 -0
- package/dist/{linux-RYLOP2LY.js → linux-WUGRYCJY.js} +2 -2
- package/dist/mcp/{chunk-PIIRD4LO.js → chunk-4HZMW2V3.js} +1 -1
- package/dist/mcp/{chunk-PIIRD4LO.js.map → chunk-4HZMW2V3.js.map} +1 -1
- package/dist/{darwin-5BHWRJ7D.js → mcp/darwin-U25WIGH6.js} +2 -2
- package/dist/mcp/issue-management-server.js +900 -20
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/mcp/{linux-JBVS4R3A.js → linux-5BXVBGSY.js} +2 -2
- package/dist/mcp/recap-server.js +24 -22
- package/dist/mcp/recap-server.js.map +1 -1
- package/dist/mcp/{tmux-RYBLEHUZ.js → tmux-CU26ZTNM.js} +2 -2
- package/dist/mcp/{wsl-4QZIQLLE.js → wsl-KI25UDOF.js} +2 -2
- package/dist/neon-helpers-LCZAN4U4.js +11 -0
- package/dist/{open-2Y7GSUTJ.js → open-US4XACLW.js} +36 -21
- package/dist/open-US4XACLW.js.map +1 -0
- package/dist/{plan-SWFPLNJE.js → plan-PL3ZB32J.js} +47 -43
- package/dist/{plan-SWFPLNJE.js.map → plan-PL3ZB32J.js.map} +1 -1
- package/dist/{projects-IUSUXD5D.js → projects-L5AHUBGA.js} +6 -6
- package/dist/{prompt-7LZB4PAT.js → prompt-FUU5NMJQ.js} +3 -3
- package/dist/prompt-FUU5NMJQ.js.map +1 -0
- package/dist/prompts/init-prompt.txt +160 -23
- package/dist/prompts/issue-prompt.txt +93 -157
- package/dist/prompts/plan-prompt.txt +55 -0
- package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
- package/dist/{rebase-S6OHAOOF.js → rebase-JA3RW2XO.js} +12 -12
- package/dist/{recap-GGVCG5VH.js → recap-5TO42HN2.js} +9 -9
- package/dist/{remote-MZTFHHTU.js → remote-RO4LZKT2.js} +3 -3
- package/dist/remote-RO4LZKT2.js.map +1 -0
- package/dist/{run-ST3FR75O.js → run-KKCRBRLW.js} +36 -21
- package/dist/run-KKCRBRLW.js.map +1 -0
- package/dist/schema/settings.schema.json +147 -11
- package/dist/{shell-W4SBQPTE.js → shell-GAB2FCXH.js} +8 -8
- package/dist/{summary-P2JCIIJO.js → summary-P7QE3TNW.js} +21 -19
- package/dist/summary-P7QE3TNW.js.map +1 -0
- package/dist/test-6LFB5WOO.js +27 -0
- package/dist/{test-git-2KFFAQ6B.js → test-git-PYJOYSED.js} +6 -6
- package/dist/{test-jira-FKDKG6CD.js → test-jira-SM7IU5HW.js} +8 -8
- package/dist/{test-prefix-GP2DAX37.js → test-prefix-HIRZBXTM.js} +6 -6
- package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
- package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-43PVP2JL.js} +8 -8
- package/dist/{tmux-7ZTA3BDI.js → tmux-6LRFH3DM.js} +2 -2
- package/dist/{update-XLW7R7FL.js → update-AD3GE5C4.js} +4 -4
- package/dist/{update-notifier-EYLAXZAA.js → update-notifier-VYDTDMSJ.js} +3 -3
- package/dist/update-notifier-VYDTDMSJ.js.map +1 -0
- package/dist/{vscode-TOGE5N67.js → vscode-HXIXRZ3A.js} +12 -12
- package/dist/{vscode-announcement-NIX7O2MG.js → vscode-announcement-AL3EHORH.js} +3 -3
- package/dist/{wsl-Y4GUTOQ7.js → wsl-4VMVT2PO.js} +2 -2
- package/package.json +1 -1
- package/dist/ClaudeContextManager-SXDCWDJA.js +0 -14
- package/dist/ClaudeService-6E6MCGJE.js +0 -13
- package/dist/GitHubService-2R5GQG4K.js +0 -12
- package/dist/IssueTrackerFactory-XN6MQ4UN.js +0 -14
- package/dist/MetadataManager-CMQQTFLQ.js +0 -10
- package/dist/ProjectCapabilityDetector-IC6NAFGY.js +0 -11
- package/dist/SettingsMigrationManager-S6J7OHUH.js +0 -10
- package/dist/build-OLS6J5KZ.js +0 -27
- package/dist/chunk-3GTUXW26.js.map +0 -1
- package/dist/chunk-5UFGO4ZT.js.map +0 -1
- package/dist/chunk-7FIXNAUO.js.map +0 -1
- package/dist/chunk-ABVMUNCD.js.map +0 -1
- package/dist/chunk-ET6A2JR4.js.map +0 -1
- package/dist/chunk-IR74O2F6.js.map +0 -1
- package/dist/chunk-LL6TOX3G.js.map +0 -1
- package/dist/chunk-QR4FU53I.js.map +0 -1
- package/dist/chunk-QVAA5KHK.js.map +0 -1
- package/dist/chunk-RVI6C2H5.js +0 -220
- package/dist/chunk-RVI6C2H5.js.map +0 -1
- package/dist/chunk-VUUN3KE4.js.map +0 -1
- package/dist/chunk-WG4MLJ6J.js.map +0 -1
- package/dist/chunk-XFQGI2E3.js.map +0 -1
- package/dist/chunk-Y3RX7LZT.js.map +0 -1
- package/dist/chunk-YRCEOQPX.js.map +0 -1
- package/dist/dev-server-CYRP6M73.js.map +0 -1
- package/dist/ignite-IO4LXVXJ.js +0 -35
- package/dist/issues-DMRQJH7E.js.map +0 -1
- package/dist/lint-BSWRMGPZ.js +0 -27
- package/dist/neon-helpers-HWIYRKOW.js +0 -11
- package/dist/open-2Y7GSUTJ.js.map +0 -1
- package/dist/run-ST3FR75O.js.map +0 -1
- package/dist/summary-P2JCIIJO.js.map +0 -1
- package/dist/test-6JH4FE2X.js +0 -27
- /package/dist/{BranchNamingService-XBCO747L.js.map → BitBucketApiClient-J2ZSCS5N.js.map} +0 -0
- /package/dist/{ClaudeContextManager-SXDCWDJA.js.map → BitBucketVCSProvider-5X64IXXW.js.map} +0 -0
- /package/dist/{ClaudeService-6E6MCGJE.js.map → BranchNamingService-MEK2WZUD.js.map} +0 -0
- /package/dist/{GitHubService-2R5GQG4K.js.map → ClaudeContextManager-IENAE2CP.js.map} +0 -0
- /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-YIJCZUUB.js.map} +0 -0
- /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
- /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-2OI7YIN6.js.map} +0 -0
- /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-3TSFW7QP.js.map} +0 -0
- /package/dist/{PromptTemplateManager-T5VTLJP3.js.map → MetadataManager-V4LSJ2PB.js.map} +0 -0
- /package/dist/{SettingsManager-WQ5NSGAH.js.map → ProjectCapabilityDetector-I4J66WKF.js.map} +0 -0
- /package/dist/{SettingsMigrationManager-S6J7OHUH.js.map → PromptTemplateManager-I75WKXM4.js.map} +0 -0
- /package/dist/{claude-ONQTDWV3.js.map → SettingsManager-BMQCAXPP.js.map} +0 -0
- /package/dist/{color-VQD52LOI.js.map → SettingsMigrationManager-ZPARZ5KH.js.map} +0 -0
- /package/dist/{darwin-5BHWRJ7D.js.map → browser-VZY7F2DF.js.map} +0 -0
- /package/dist/{build-OLS6J5KZ.js.map → build-DMWSIME6.js.map} +0 -0
- /package/dist/{chunk-G2MNSPA4.js.map → chunk-772N5WCA.js.map} +0 -0
- /package/dist/{chunk-NOMQ5RFG.js.map → chunk-7UBEHQTP.js.map} +0 -0
- /package/dist/{chunk-7NFCGKZT.js.map → chunk-AQUSMNBF.js.map} +0 -0
- /package/dist/{chunk-IDCE26KD.js.map → chunk-AUYSAMXV.js.map} +0 -0
- /package/dist/{chunk-HLDY5S4C.js.map → chunk-BFF27W3S.js.map} +0 -0
- /package/dist/{chunk-K7R5QY6C.js.map → chunk-CE676WCN.js.map} +0 -0
- /package/dist/{chunk-LHDD4JHC.js.map → chunk-D4Q7T5KD.js.map} +0 -0
- /package/dist/{chunk-RBYTXYGD.js.map → chunk-D75KSI3V.js.map} +0 -0
- /package/dist/{chunk-SQYHPBFP.js.map → chunk-EGNUOALL.js.map} +0 -0
- /package/dist/{chunk-ZAXRQLK3.js.map → chunk-FTYWGQFM.js.map} +0 -0
- /package/dist/{chunk-LE2NOUTN.js.map → chunk-FV4KXBGO.js.map} +0 -0
- /package/dist/{chunk-QNHZM5ZV.js.map → chunk-HIGWKLQR.js.map} +0 -0
- /package/dist/{chunk-VMZG66UV.js.map → chunk-HKEXRZMU.js.map} +0 -0
- /package/dist/{chunk-V4STTBQD.js.map → chunk-IHSA7VGI.js.map} +0 -0
- /package/dist/{chunk-TEJAGQX2.js.map → chunk-IS46GQRA.js.map} +0 -0
- /package/dist/{chunk-VNYWBHKR.js.map → chunk-JD3K2344.js.map} +0 -0
- /package/dist/{chunk-NCPZYQ4B.js.map → chunk-K3QGG4O2.js.map} +0 -0
- /package/dist/{chunk-NH3QZYE5.js.map → chunk-KV4NU3RP.js.map} +0 -0
- /package/dist/{chunk-NDSGJZI2.js.map → chunk-LOAYWTJJ.js.map} +0 -0
- /package/dist/{chunk-GMDSYLI6.js.map → chunk-MY2Q3FJ3.js.map} +0 -0
- /package/dist/{chunk-CV47VCMQ.js.map → chunk-NPVA65KS.js.map} +0 -0
- /package/dist/{chunk-7OCGBJLR.js.map → chunk-OIVFHJOA.js.map} +0 -0
- /package/dist/{chunk-NN5RYWXA.js.map → chunk-PH65MFQM.js.map} +0 -0
- /package/dist/{chunk-TZNNJLGT.js.map → chunk-PMB6TYV4.js.map} +0 -0
- /package/dist/{chunk-6YVJVUR4.js.map → chunk-QF2DROQR.js.map} +0 -0
- /package/dist/{chunk-XXFSOVL3.js.map → chunk-QFDM23CO.js.map} +0 -0
- /package/dist/{chunk-RMLADZRY.js.map → chunk-R7DGN73N.js.map} +0 -0
- /package/dist/{chunk-5PNZBH6V.js.map → chunk-V5IYLWRA.js.map} +0 -0
- /package/dist/{chunk-KQFIGI37.js.map → chunk-VA6CWUAE.js.map} +0 -0
- /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
- /package/dist/{chunk-UDCI3QTS.js.map → chunk-ZM2AYHMO.js.map} +0 -0
- /package/dist/{git-BXUD6CL5.js.map → claude-ACL7G4CF.js.map} +0 -0
- /package/dist/{ignite-IO4LXVXJ.js.map → color-AC6F2QE7.js.map} +0 -0
- /package/dist/{commit-DC2Q5CDY.js.map → commit-RILBXFWO.js.map} +0 -0
- /package/dist/{compile-4NCQECKE.js.map → compile-QEL5724K.js.map} +0 -0
- /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
- /package/dist/{feedback-BMAZGKRW.js.map → feedback-I6ZEHEUB.js.map} +0 -0
- /package/dist/{mcp/darwin-3JFFE3W2.js.map → git-I3PO6FY7.js.map} +0 -0
- /package/dist/{neon-helpers-HWIYRKOW.js.map → ignite-XZFYRVRJ.js.map} +0 -0
- /package/dist/{init-CI43GJHV.js.map → init-A6WRP77L.js.map} +0 -0
- /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-HXP2TM7G.js.map} +0 -0
- /package/dist/{prompt-7LZB4PAT.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
- /package/dist/{lint-BSWRMGPZ.js.map → lint-FDZC77GL.js.map} +0 -0
- /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
- /package/dist/{remote-MZTFHHTU.js.map → mcp/darwin-U25WIGH6.js.map} +0 -0
- /package/dist/mcp/{linux-JBVS4R3A.js.map → linux-5BXVBGSY.js.map} +0 -0
- /package/dist/mcp/{tmux-RYBLEHUZ.js.map → tmux-CU26ZTNM.js.map} +0 -0
- /package/dist/mcp/{wsl-4QZIQLLE.js.map → wsl-KI25UDOF.js.map} +0 -0
- /package/dist/{update-notifier-EYLAXZAA.js.map → neon-helpers-LCZAN4U4.js.map} +0 -0
- /package/dist/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
- /package/dist/{rebase-S6OHAOOF.js.map → rebase-JA3RW2XO.js.map} +0 -0
- /package/dist/{recap-GGVCG5VH.js.map → recap-5TO42HN2.js.map} +0 -0
- /package/dist/{shell-W4SBQPTE.js.map → shell-GAB2FCXH.js.map} +0 -0
- /package/dist/{test-6JH4FE2X.js.map → test-6LFB5WOO.js.map} +0 -0
- /package/dist/{test-git-2KFFAQ6B.js.map → test-git-PYJOYSED.js.map} +0 -0
- /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-SM7IU5HW.js.map} +0 -0
- /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-HIRZBXTM.js.map} +0 -0
- /package/dist/{test-tabs-YDWMWTVA.js.map → test-tabs-NGPTFD5T.js.map} +0 -0
- /package/dist/{test-webserver-QI3QQFZ3.js.map → test-webserver-43PVP2JL.js.map} +0 -0
- /package/dist/{tmux-7ZTA3BDI.js.map → tmux-6LRFH3DM.js.map} +0 -0
- /package/dist/{update-XLW7R7FL.js.map → update-AD3GE5C4.js.map} +0 -0
- /package/dist/{vscode-TOGE5N67.js.map → vscode-HXIXRZ3A.js.map} +0 -0
- /package/dist/{vscode-announcement-NIX7O2MG.js.map → vscode-announcement-AL3EHORH.js.map} +0 -0
- /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-
|
|
4
|
+
} from "./chunk-VA6CWUAE.js";
|
|
5
5
|
import {
|
|
6
6
|
logger
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-OPQC4OWM.js";
|
|
5
5
|
import {
|
|
6
6
|
MetadataManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-4JZEQBWV.js";
|
|
8
8
|
import {
|
|
9
9
|
getLogger
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
73
|
+
//# sourceMappingURL=chunk-QFDM23CO.js.map
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
getLinearIssueDependencies,
|
|
19
19
|
updateLinearComment,
|
|
20
20
|
updateLinearIssueState
|
|
21
|
-
} from "./chunk-
|
|
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-
|
|
38
|
+
} from "./chunk-KV4NU3RP.js";
|
|
39
39
|
import {
|
|
40
40
|
SettingsManager
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-653XBU3L.js";
|
|
42
42
|
import {
|
|
43
43
|
logger
|
|
44
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
7
|
-
import {
|
|
8
|
-
PromptTemplateManager
|
|
9
|
-
} from "./chunk-WG4MLJ6J.js";
|
|
9
|
+
} from "./chunk-DDHWZNGL.js";
|
|
10
10
|
import {
|
|
11
11
|
SettingsManager
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-653XBU3L.js";
|
|
13
13
|
import {
|
|
14
14
|
logger
|
|
15
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-K3QGG4O2.js";
|
|
5
5
|
import {
|
|
6
6
|
getLogger
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
79
|
+
const { detectLinuxTerminal } = await import("./linux-WUGRYCJY.js");
|
|
79
80
|
if (await detectLinuxTerminal()) {
|
|
80
|
-
const { LinuxBackend } = await import("./linux-
|
|
81
|
+
const { LinuxBackend } = await import("./linux-WUGRYCJY.js");
|
|
81
82
|
return new LinuxBackend();
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
|
-
const { isTmuxAvailable, TmuxBackend } = await import("./tmux-
|
|
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-
|
|
664
|
+
//# sourceMappingURL=chunk-VRPPI6GU.js.map
|