@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.
- package/LICENSE +1 -1
- package/README.md +170 -15
- 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-RRGREEZQ.js +14 -0
- package/dist/ClaudeService-LEPW6QAC.js +13 -0
- package/dist/GitHubService-UTAYZXL3.js +12 -0
- package/dist/IssueTrackerFactory-KE2BDCLC.js +15 -0
- package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-GKQMR5E6.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 +170 -15
- package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-KQU7OX7G.js} +15 -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 +5 -2
- 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-V3KADFMO.js +27 -0
- package/dist/{chunk-XXFSOVL3.js → chunk-3XEXT35Z.js} +4 -4
- package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
- package/dist/chunk-4JZEQBWV.js.map +1 -0
- package/dist/{chunk-LE2NOUTN.js → chunk-4VQXMEEP.js} +3 -3
- 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-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-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
- package/dist/{chunk-5PNZBH6V.js → chunk-H3T3EPF3.js} +2 -2
- package/dist/{chunk-VNYWBHKR.js → chunk-JD3K2344.js} +3 -3
- package/dist/{chunk-6YVJVUR4.js → chunk-JDN4SPV3.js} +3 -3
- package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
- package/dist/{chunk-ABVMUNCD.js → chunk-KQSV7FOG.js} +64 -10
- package/dist/chunk-KQSV7FOG.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-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
- package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
- package/dist/{chunk-RMLADZRY.js → chunk-NTDY5AMO.js} +5 -5
- package/dist/{chunk-UHIBKD73.js → chunk-NUUFP53X.js} +13 -32
- package/dist/{chunk-UHIBKD73.js.map → chunk-NUUFP53X.js.map} +1 -1
- package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
- package/dist/chunk-P5MXXHXQ.js +284 -0
- package/dist/chunk-P5MXXHXQ.js.map +1 -0
- package/dist/{chunk-TEJAGQX2.js → chunk-PD75ZCFT.js} +35 -35
- package/dist/chunk-PD75ZCFT.js.map +1 -0
- package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
- package/dist/{chunk-LL6TOX3G.js → chunk-Q7VXHJP6.js} +10 -10
- package/dist/chunk-Q7VXHJP6.js.map +1 -0
- package/dist/chunk-QC65IOV3.js +304 -0
- package/dist/chunk-QC65IOV3.js.map +1 -0
- package/dist/{chunk-V4STTBQD.js → chunk-QED2WB2D.js} +9 -9
- package/dist/{chunk-3RXYOBME.js → chunk-QNPJXO53.js} +5 -5
- package/dist/{chunk-3RXYOBME.js.map → chunk-QNPJXO53.js.map} +1 -1
- package/dist/chunk-QQULYI2S.js +696 -0
- package/dist/chunk-QQULYI2S.js.map +1 -0
- package/dist/{chunk-QNHZM5ZV.js → chunk-QXGM32TO.js} +3 -3
- package/dist/{chunk-TZNNJLGT.js → chunk-RFCAPHL5.js} +6 -6
- package/dist/{chunk-7FIXNAUO.js → chunk-SA446KA2.js} +66 -43
- package/dist/chunk-SA446KA2.js.map +1 -0
- package/dist/{chunk-UDCI3QTS.js → chunk-SN4S5CWL.js} +2 -2
- package/dist/{chunk-VUUN3KE4.js → chunk-TAEVA4QR.js} +8 -8
- package/dist/chunk-TAEVA4QR.js.map +1 -0
- package/dist/{chunk-IR74O2F6.js → chunk-TN2D2RX7.js} +253 -174
- package/dist/chunk-TN2D2RX7.js.map +1 -0
- 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-XFQGI2E3.js → chunk-VVQQIG64.js} +58 -53
- package/dist/chunk-VVQQIG64.js.map +1 -0
- package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
- package/dist/{chunk-ET6A2JR4.js → chunk-WGUGB54H.js} +120 -18
- package/dist/chunk-WGUGB54H.js.map +1 -0
- package/dist/{chunk-QR4FU53I.js → chunk-X5DRLONY.js} +22 -12
- package/dist/chunk-X5DRLONY.js.map +1 -0
- package/dist/{chunk-KQFIGI37.js → chunk-XCP2WDYA.js} +7 -7
- package/dist/{chunk-VMZG66UV.js → chunk-YUOVWWJX.js} +312 -7
- package/dist/chunk-YUOVWWJX.js.map +1 -0
- package/dist/{chunk-HLDY5S4C.js → chunk-ZUIFO7B4.js} +3 -3
- package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
- package/dist/{cleanup-YOM6PQCN.js → cleanup-RJKLI47I.js} +40 -37
- package/dist/cleanup-RJKLI47I.js.map +1 -0
- package/dist/cli.js +322 -169
- package/dist/cli.js.map +1 -1
- package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
- package/dist/{commit-DC2Q5CDY.js → commit-SUHRUMDE.js} +15 -15
- package/dist/{compile-4NCQECKE.js → compile-2MD346PO.js} +11 -11
- package/dist/{contribute-M5UWXCAV.js → contribute-P4BMRY7C.js} +11 -11
- package/dist/{contribute-M5UWXCAV.js.map → contribute-P4BMRY7C.js.map} +1 -1
- package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
- package/dist/database-helpers-PRDFNDRO.js +11 -0
- package/dist/{dev-server-CYRP6M73.js → dev-server-ZNTLWOL5.js} +35 -21
- package/dist/dev-server-ZNTLWOL5.js.map +1 -0
- package/dist/{feedback-BMAZGKRW.js → feedback-Q6WG2WX4.js} +17 -17
- package/dist/{git-BXUD6CL5.js → git-TX2IEMB3.js} +6 -6
- package/dist/ignite-P644W2PK.js +35 -0
- package/dist/index.d.ts +236 -18
- package/dist/index.js +180 -63
- package/dist/index.js.map +1 -1
- package/dist/{init-CI43GJHV.js → init-5HFY7JG6.js} +18 -18
- package/dist/{install-deps-SRTM5U7D.js → install-deps-J4ALTM27.js} +11 -11
- package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
- package/dist/{issues-DMRQJH7E.js → issues-LZMIF22U.js} +69 -56
- package/dist/issues-LZMIF22U.js.map +1 -0
- package/dist/lint-XIXKU22H.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 +908 -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/{open-2Y7GSUTJ.js → open-KUO35JIJ.js} +36 -21
- package/dist/open-KUO35JIJ.js.map +1 -0
- package/dist/{plan-SWFPLNJE.js → plan-7CF56OIR.js} +47 -43
- package/dist/{plan-SWFPLNJE.js.map → plan-7CF56OIR.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 +184 -23
- package/dist/prompts/issue-prompt.txt +94 -158
- package/dist/prompts/plan-prompt.txt +55 -0
- package/dist/prompts/regular-prompt.txt +1 -1
- package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
- package/dist/{rebase-S6OHAOOF.js → rebase-MAMWPA2L.js} +12 -12
- package/dist/{recap-GGVCG5VH.js → recap-IDBO3KM5.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-RGZHCQ6M.js} +36 -21
- package/dist/run-RGZHCQ6M.js.map +1 -0
- package/dist/schema/settings.schema.json +171 -11
- package/dist/{shell-W4SBQPTE.js → shell-7ADCDFIV.js} +8 -8
- package/dist/{summary-P2JCIIJO.js → summary-7J2HORFD.js} +21 -19
- package/dist/summary-7J2HORFD.js.map +1 -0
- package/dist/test-SRB7EWU6.js +27 -0
- package/dist/{test-git-2KFFAQ6B.js → test-git-G7ATVIXG.js} +6 -6
- package/dist/{test-jira-FKDKG6CD.js → test-jira-Q2HPA522.js} +8 -8
- package/dist/{test-prefix-GP2DAX37.js → test-prefix-JMDGXR5A.js} +6 -6
- package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
- package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-GZFVXBGD.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-3I7ISHUU.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-TEJAGQX2.js.map +0 -1
- package/dist/chunk-VMZG66UV.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/cleanup-YOM6PQCN.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-RRGREEZQ.js.map} +0 -0
- /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-LEPW6QAC.js.map} +0 -0
- /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
- /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-KE2BDCLC.js.map} +0 -0
- /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-GKQMR5E6.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-KQU7OX7G.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-V3KADFMO.js.map} +0 -0
- /package/dist/{chunk-XXFSOVL3.js.map → chunk-3XEXT35Z.js.map} +0 -0
- /package/dist/{chunk-LE2NOUTN.js.map → chunk-4VQXMEEP.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-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-5PNZBH6V.js.map → chunk-H3T3EPF3.js.map} +0 -0
- /package/dist/{chunk-VNYWBHKR.js.map → chunk-JD3K2344.js.map} +0 -0
- /package/dist/{chunk-6YVJVUR4.js.map → chunk-JDN4SPV3.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-RMLADZRY.js.map → chunk-NTDY5AMO.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-V4STTBQD.js.map → chunk-QED2WB2D.js.map} +0 -0
- /package/dist/{chunk-QNHZM5ZV.js.map → chunk-QXGM32TO.js.map} +0 -0
- /package/dist/{chunk-TZNNJLGT.js.map → chunk-RFCAPHL5.js.map} +0 -0
- /package/dist/{chunk-UDCI3QTS.js.map → chunk-SN4S5CWL.js.map} +0 -0
- /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
- /package/dist/{chunk-KQFIGI37.js.map → chunk-XCP2WDYA.js.map} +0 -0
- /package/dist/{chunk-HLDY5S4C.js.map → chunk-ZUIFO7B4.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-SUHRUMDE.js.map} +0 -0
- /package/dist/{compile-4NCQECKE.js.map → compile-2MD346PO.js.map} +0 -0
- /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
- /package/dist/{mcp/darwin-3JFFE3W2.js.map → database-helpers-PRDFNDRO.js.map} +0 -0
- /package/dist/{feedback-BMAZGKRW.js.map → feedback-Q6WG2WX4.js.map} +0 -0
- /package/dist/{neon-helpers-HWIYRKOW.js.map → git-TX2IEMB3.js.map} +0 -0
- /package/dist/{prompt-7LZB4PAT.js.map → ignite-P644W2PK.js.map} +0 -0
- /package/dist/{init-CI43GJHV.js.map → init-5HFY7JG6.js.map} +0 -0
- /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-J4ALTM27.js.map} +0 -0
- /package/dist/{remote-MZTFHHTU.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
- /package/dist/{lint-BSWRMGPZ.js.map → lint-XIXKU22H.js.map} +0 -0
- /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
- /package/dist/{update-notifier-EYLAXZAA.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/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
- /package/dist/{rebase-S6OHAOOF.js.map → rebase-MAMWPA2L.js.map} +0 -0
- /package/dist/{recap-GGVCG5VH.js.map → recap-IDBO3KM5.js.map} +0 -0
- /package/dist/{shell-W4SBQPTE.js.map → shell-7ADCDFIV.js.map} +0 -0
- /package/dist/{test-6JH4FE2X.js.map → test-SRB7EWU6.js.map} +0 -0
- /package/dist/{test-git-2KFFAQ6B.js.map → test-git-G7ATVIXG.js.map} +0 -0
- /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-Q2HPA522.js.map} +0 -0
- /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-JMDGXR5A.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-GZFVXBGD.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-3I7ISHUU.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
|
@@ -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-WGUGB54H.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-XCP2WDYA.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
promptConfirmation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NPVA65KS.js";
|
|
5
5
|
import {
|
|
6
6
|
getLogger
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FTYWGQFM.js";
|
|
8
8
|
|
|
9
9
|
// src/lib/providers/NeonProvider.ts
|
|
10
10
|
import { execa } from "execa";
|
|
@@ -32,6 +32,8 @@ function validateNeonConfig(config) {
|
|
|
32
32
|
var NeonProvider = class {
|
|
33
33
|
constructor(config) {
|
|
34
34
|
this.config = config;
|
|
35
|
+
this.displayName = "Neon";
|
|
36
|
+
this.installHint = "npm install -g neonctl";
|
|
35
37
|
this._isConfigured = false;
|
|
36
38
|
getLogger().debug("NeonProvider initialized with config:", {
|
|
37
39
|
projectId: config.projectId,
|
|
@@ -432,10 +434,313 @@ var NeonProvider = class {
|
|
|
432
434
|
}
|
|
433
435
|
};
|
|
434
436
|
|
|
435
|
-
// src/
|
|
436
|
-
|
|
437
|
-
|
|
437
|
+
// src/lib/providers/SupabaseProvider.ts
|
|
438
|
+
import { execa as execa2 } from "execa";
|
|
439
|
+
function validateSupabaseConfig(config) {
|
|
440
|
+
if (!config.projectRef) {
|
|
441
|
+
return {
|
|
442
|
+
valid: false,
|
|
443
|
+
error: "Supabase projectRef is required. Configure in .iloom/settings.json under databaseProviders.supabase"
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
if (!/^[a-zA-Z0-9-]+$/.test(config.projectRef)) {
|
|
447
|
+
return {
|
|
448
|
+
valid: false,
|
|
449
|
+
error: "Supabase projectRef contains invalid characters"
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
return { valid: true };
|
|
453
|
+
}
|
|
454
|
+
var SupabaseProvider = class {
|
|
455
|
+
constructor(config) {
|
|
456
|
+
this.config = config;
|
|
457
|
+
this._isConfigured = false;
|
|
458
|
+
this.displayName = "Supabase CLI";
|
|
459
|
+
this.installHint = "Install with: npm install -g supabase";
|
|
460
|
+
getLogger().debug("SupabaseProvider initialized with config:", {
|
|
461
|
+
projectRef: config.projectRef,
|
|
462
|
+
parentBranch: config.parentBranch,
|
|
463
|
+
withData: config.withData,
|
|
464
|
+
hasProjectRef: !!config.projectRef,
|
|
465
|
+
hasParentBranch: !!config.parentBranch
|
|
466
|
+
});
|
|
467
|
+
const validation = validateSupabaseConfig(config);
|
|
468
|
+
if (!validation.valid) {
|
|
469
|
+
getLogger().debug(`SupabaseProvider not configured: ${validation.error}`);
|
|
470
|
+
getLogger().debug("Supabase database branching will not be used");
|
|
471
|
+
this._isConfigured = false;
|
|
472
|
+
} else {
|
|
473
|
+
this._isConfigured = true;
|
|
474
|
+
}
|
|
475
|
+
if (config.parentBranch) {
|
|
476
|
+
getLogger().debug(
|
|
477
|
+
`parentBranch '${config.parentBranch}' is stored but Supabase currently always branches from the default branch`
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Check if provider is properly configured
|
|
483
|
+
* Returns true if projectRef and parentBranch are valid in settings
|
|
484
|
+
*/
|
|
485
|
+
isConfigured() {
|
|
486
|
+
return this._isConfigured;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Execute a Supabase CLI command and return stdout
|
|
490
|
+
* Throws an error if the command fails
|
|
491
|
+
*
|
|
492
|
+
* @param args - Command arguments to pass to supabase CLI
|
|
493
|
+
* @param cwd - Optional working directory to run the command from (defaults to current directory)
|
|
494
|
+
*/
|
|
495
|
+
async executeSupabaseCommand(args, cwd, timeout = 3e4) {
|
|
496
|
+
if (!this._isConfigured) {
|
|
497
|
+
throw new Error(
|
|
498
|
+
"SupabaseProvider is not configured. Check databaseProviders.supabase configuration in .iloom/settings.json"
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
const command = `supabase ${args.join(" ")}`;
|
|
502
|
+
getLogger().debug(`Executing Supabase CLI command: ${command}`);
|
|
503
|
+
getLogger().debug(`Project ref being used: ${this.config.projectRef}`);
|
|
504
|
+
if (cwd) {
|
|
505
|
+
getLogger().debug(`Working directory: ${cwd}`);
|
|
506
|
+
}
|
|
507
|
+
const result = await execa2("supabase", args, {
|
|
508
|
+
timeout,
|
|
509
|
+
encoding: "utf8",
|
|
510
|
+
stdio: "pipe",
|
|
511
|
+
...cwd && { cwd }
|
|
512
|
+
});
|
|
513
|
+
return result.stdout;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Check if supabase CLI is available
|
|
517
|
+
*/
|
|
518
|
+
async isCliAvailable() {
|
|
519
|
+
try {
|
|
520
|
+
await execa2("supabase", ["--version"], {
|
|
521
|
+
timeout: 5e3,
|
|
522
|
+
stdio: "pipe"
|
|
523
|
+
});
|
|
524
|
+
return true;
|
|
525
|
+
} catch (error) {
|
|
526
|
+
const errorCode = error.code;
|
|
527
|
+
if (errorCode === "ENOENT" || errorCode === "EACCES") {
|
|
528
|
+
return false;
|
|
529
|
+
}
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Check if user is authenticated with Supabase CLI
|
|
535
|
+
*
|
|
536
|
+
* @param cwd - Optional working directory to run the command from (prevents issues with deleted directories)
|
|
537
|
+
* @throws Error if authentication check fails for reasons other than not being authenticated
|
|
538
|
+
*/
|
|
539
|
+
async isAuthenticated(cwd) {
|
|
540
|
+
var _a;
|
|
541
|
+
const cliAvailable = await this.isCliAvailable();
|
|
542
|
+
if (!cliAvailable) {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
try {
|
|
546
|
+
await execa2("supabase", ["projects", "list"], {
|
|
547
|
+
timeout: 1e4,
|
|
548
|
+
stdio: "pipe",
|
|
549
|
+
...cwd && { cwd }
|
|
550
|
+
});
|
|
551
|
+
return true;
|
|
552
|
+
} catch (error) {
|
|
553
|
+
const execaError = error;
|
|
554
|
+
const stderr = ((_a = execaError.stderr) == null ? void 0 : _a.trim()) ?? "";
|
|
555
|
+
const isAuthError = stderr.toLowerCase().includes("not authenticated") || stderr.toLowerCase().includes("not logged in") || stderr.toLowerCase().includes("authentication required") || stderr.toLowerCase().includes("login required") || stderr.toLowerCase().includes("access token not provided") || stderr.toLowerCase().includes("you need to be logged in");
|
|
556
|
+
if (isAuthError) {
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
throw error;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Sanitize branch name for Supabase (replace slashes with hyphens)
|
|
564
|
+
* Supabase uses hyphens as separator (not underscores like Neon)
|
|
565
|
+
*/
|
|
566
|
+
sanitizeBranchName(branchName) {
|
|
567
|
+
let sanitized = branchName.replace(/\//g, "-").replace(/[^a-zA-Z0-9_-]/g, "").replace(/^-+/, "");
|
|
568
|
+
return sanitized || "unnamed-branch";
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* List all branches in the Supabase project
|
|
572
|
+
*
|
|
573
|
+
* @param cwd - Optional working directory to run commands from
|
|
574
|
+
*/
|
|
575
|
+
async listBranches(cwd) {
|
|
576
|
+
const output = await this.executeSupabaseCommand(
|
|
577
|
+
["branches", "list", "--project-ref", this.config.projectRef, "-o", "json"],
|
|
578
|
+
cwd
|
|
579
|
+
);
|
|
580
|
+
let jsonString = output;
|
|
581
|
+
const firstBracket = output.indexOf("[");
|
|
582
|
+
if (firstBracket > 0) {
|
|
583
|
+
jsonString = output.slice(firstBracket);
|
|
584
|
+
}
|
|
585
|
+
let branches;
|
|
586
|
+
try {
|
|
587
|
+
branches = JSON.parse(jsonString);
|
|
588
|
+
} catch (parseError) {
|
|
589
|
+
throw new Error(
|
|
590
|
+
`Failed to parse Supabase branch list as JSON: ${parseError instanceof Error ? parseError.message : String(parseError)}`
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
return branches.map((branch) => branch.name);
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Check if a branch exists
|
|
597
|
+
* Uses `supabase branches get` for a direct lookup (more efficient than listing all)
|
|
598
|
+
*
|
|
599
|
+
* @param name - Branch name to check
|
|
600
|
+
* @param cwd - Optional working directory to run commands from
|
|
601
|
+
*/
|
|
602
|
+
async branchExists(name, cwd) {
|
|
603
|
+
var _a, _b;
|
|
604
|
+
const sanitizedName = this.sanitizeBranchName(name);
|
|
605
|
+
try {
|
|
606
|
+
await this.executeSupabaseCommand(
|
|
607
|
+
["branches", "get", sanitizedName, "--project-ref", this.config.projectRef],
|
|
608
|
+
cwd
|
|
609
|
+
);
|
|
610
|
+
return true;
|
|
611
|
+
} catch (error) {
|
|
612
|
+
const execaError = error;
|
|
613
|
+
const stderr = ((_a = execaError.stderr) == null ? void 0 : _a.toLowerCase()) ?? "";
|
|
614
|
+
const stdout = ((_b = execaError.stdout) == null ? void 0 : _b.toLowerCase()) ?? "";
|
|
615
|
+
const message = (error instanceof Error ? error.message : String(error)).toLowerCase();
|
|
616
|
+
const isNotFound = stderr.includes("not found") || stderr.includes("does not exist") || stderr.includes("no branch") || stdout.includes("not found") || message.includes("not found") || message.includes("does not exist");
|
|
617
|
+
if (isNotFound) {
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
throw error;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Get connection string for a specific branch
|
|
625
|
+
* Parses POSTGRES_URL_NON_POOLING from `supabase branches get <name> -o env` output
|
|
626
|
+
* Connection strings are never logged at info level or above (security)
|
|
627
|
+
*
|
|
628
|
+
* @param branch - Branch name to get connection string for
|
|
629
|
+
* @param cwd - Optional working directory to run commands from
|
|
630
|
+
*/
|
|
631
|
+
async getConnectionString(branch, cwd) {
|
|
632
|
+
const sanitizedBranch = this.sanitizeBranchName(branch);
|
|
633
|
+
const output = await this.executeSupabaseCommand(
|
|
634
|
+
["branches", "get", sanitizedBranch, "--project-ref", this.config.projectRef, "-o", "env"],
|
|
635
|
+
cwd
|
|
636
|
+
);
|
|
637
|
+
const match = output.match(/^POSTGRES_URL_NON_POOLING=(.+)$/m);
|
|
638
|
+
if (!(match == null ? void 0 : match[1])) {
|
|
639
|
+
throw new Error(
|
|
640
|
+
`Could not find POSTGRES_URL_NON_POOLING in branch '${branch}' environment output`
|
|
641
|
+
);
|
|
642
|
+
}
|
|
643
|
+
const connectionString = match[1].trim();
|
|
644
|
+
getLogger().debug(`Connection string retrieved for branch '${branch}'`);
|
|
645
|
+
return connectionString;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Create a new database branch
|
|
649
|
+
* Returns connection string for the branch
|
|
650
|
+
*
|
|
651
|
+
* Note: Supabase preview branches always branch from the production database.
|
|
652
|
+
* The fromBranch parameter is accepted for interface compatibility but ignored.
|
|
653
|
+
*
|
|
654
|
+
* @param name - Name for the new branch
|
|
655
|
+
* @param fromBranch - Accepted for interface compatibility but ignored (Supabase always branches from production)
|
|
656
|
+
* @param cwd - Optional working directory to run commands from
|
|
657
|
+
*/
|
|
658
|
+
async createBranch(name, fromBranch, cwd) {
|
|
659
|
+
void fromBranch;
|
|
660
|
+
const sanitizedName = this.sanitizeBranchName(name);
|
|
661
|
+
getLogger().info("Creating Supabase database branch...");
|
|
662
|
+
getLogger().info(` New branch: ${sanitizedName}`);
|
|
663
|
+
const args = [
|
|
664
|
+
"branches",
|
|
665
|
+
"create",
|
|
666
|
+
sanitizedName,
|
|
667
|
+
"--project-ref",
|
|
668
|
+
this.config.projectRef
|
|
669
|
+
];
|
|
670
|
+
if (this.config.withData !== false) {
|
|
671
|
+
args.push("--with-data");
|
|
672
|
+
}
|
|
673
|
+
await this.executeSupabaseCommand(args, cwd, 3e5);
|
|
674
|
+
getLogger().success("Database branch created successfully");
|
|
675
|
+
getLogger().info("Getting connection string for new database branch...");
|
|
676
|
+
const connectionString = await this.getConnectionString(sanitizedName, cwd);
|
|
677
|
+
return connectionString;
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* Delete a database branch
|
|
681
|
+
*
|
|
682
|
+
* @param name - Name of the branch to delete
|
|
683
|
+
* @param isPreview - Accepted but ignored (Neon-specific concept for Vercel preview databases)
|
|
684
|
+
* @param cwd - Optional working directory to run commands from (prevents issues with deleted directories)
|
|
685
|
+
*/
|
|
686
|
+
async deleteBranch(name, isPreview = false, cwd) {
|
|
687
|
+
void isPreview;
|
|
688
|
+
const sanitizedName = this.sanitizeBranchName(name);
|
|
689
|
+
getLogger().info(`Checking for Supabase database branch: ${sanitizedName}`);
|
|
690
|
+
try {
|
|
691
|
+
const exists = await this.branchExists(sanitizedName, cwd);
|
|
692
|
+
if (!exists) {
|
|
693
|
+
getLogger().info(`No database branch found for '${name}'`);
|
|
694
|
+
return {
|
|
695
|
+
success: true,
|
|
696
|
+
deleted: false,
|
|
697
|
+
notFound: true,
|
|
698
|
+
branchName: sanitizedName
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
getLogger().info(`Deleting Supabase database branch: ${sanitizedName}`);
|
|
702
|
+
await this.executeSupabaseCommand(
|
|
703
|
+
["branches", "delete", sanitizedName, "--project-ref", this.config.projectRef],
|
|
704
|
+
cwd
|
|
705
|
+
);
|
|
706
|
+
getLogger().success("Database branch deleted successfully");
|
|
707
|
+
return {
|
|
708
|
+
success: true,
|
|
709
|
+
deleted: true,
|
|
710
|
+
notFound: false,
|
|
711
|
+
branchName: sanitizedName
|
|
712
|
+
};
|
|
713
|
+
} catch (error) {
|
|
714
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
715
|
+
getLogger().error(`Failed to delete database branch: ${errorMessage}`);
|
|
716
|
+
return {
|
|
717
|
+
success: false,
|
|
718
|
+
deleted: false,
|
|
719
|
+
notFound: false,
|
|
720
|
+
error: errorMessage,
|
|
721
|
+
branchName: sanitizedName
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
};
|
|
726
|
+
|
|
727
|
+
// src/utils/database-helpers.ts
|
|
728
|
+
function createDatabaseProviderFromSettings(settings) {
|
|
729
|
+
var _a, _b;
|
|
438
730
|
const neonConfig = (_a = settings.databaseProviders) == null ? void 0 : _a.neon;
|
|
731
|
+
const supabaseConfig = (_b = settings.databaseProviders) == null ? void 0 : _b.supabase;
|
|
732
|
+
if (neonConfig && supabaseConfig) {
|
|
733
|
+
throw new Error(
|
|
734
|
+
"Cannot configure both Neon and Supabase database providers simultaneously. Remove one from databaseProviders in .iloom/settings.json."
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
if (supabaseConfig) {
|
|
738
|
+
return new SupabaseProvider({
|
|
739
|
+
projectRef: supabaseConfig.projectRef,
|
|
740
|
+
...supabaseConfig.parentBranch && { parentBranch: supabaseConfig.parentBranch },
|
|
741
|
+
...supabaseConfig.withData !== void 0 && { withData: supabaseConfig.withData }
|
|
742
|
+
});
|
|
743
|
+
}
|
|
439
744
|
return new NeonProvider({
|
|
440
745
|
projectId: (neonConfig == null ? void 0 : neonConfig.projectId) ?? "",
|
|
441
746
|
parentBranch: (neonConfig == null ? void 0 : neonConfig.parentBranch) ?? ""
|
|
@@ -443,6 +748,6 @@ function createNeonProviderFromSettings(settings) {
|
|
|
443
748
|
}
|
|
444
749
|
|
|
445
750
|
export {
|
|
446
|
-
|
|
751
|
+
createDatabaseProviderFromSettings
|
|
447
752
|
};
|
|
448
|
-
//# sourceMappingURL=chunk-
|
|
753
|
+
//# sourceMappingURL=chunk-YUOVWWJX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/providers/NeonProvider.ts","../src/lib/providers/SupabaseProvider.ts","../src/utils/database-helpers.ts"],"sourcesContent":["import { execa, type ExecaError } from 'execa'\nimport type { DatabaseProvider } from '../../types/index.js'\nimport { getLogger } from '../../utils/logger-context.js'\nimport { promptConfirmation } from '../../utils/prompt.js'\n\ninterface NeonBranch {\n name: string\n id: string\n [key: string]: unknown\n}\n\nexport interface NeonConfig {\n projectId: string\n parentBranch: string\n}\n\n/**\n * Validate Neon configuration\n * Checks that required configuration values are present\n */\nexport function validateNeonConfig(config: {\n projectId?: string\n parentBranch?: string\n}): { valid: boolean; error?: string } {\n if (!config.projectId) {\n return {\n valid: false,\n error: 'Neon projectId is required. Configure in .iloom/settings.json under databaseProviders.neon',\n }\n }\n\n if (!config.parentBranch) {\n return {\n valid: false,\n error: 'Neon parentBranch is required. Configure in .iloom/settings.json under databaseProviders.neon',\n }\n }\n\n // Basic validation for project ID format (should start with appropriate prefix)\n if (!/^[a-zA-Z0-9-]+$/.test(config.projectId)) {\n return {\n valid: false,\n error: 'Neon projectId contains invalid characters',\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Neon database provider implementation\n * Ports functionality from bash/utils/neon-utils.sh\n */\nexport class NeonProvider implements DatabaseProvider {\n readonly displayName = 'Neon'\n readonly installHint = 'npm install -g neonctl'\n private _isConfigured: boolean = false\n\n constructor(private config: NeonConfig) {\n getLogger().debug('NeonProvider initialized with config:', {\n projectId: config.projectId,\n parentBranch: config.parentBranch,\n hasProjectId: !!config.projectId,\n hasParentBranch: !!config.parentBranch,\n })\n\n // Validate config but don't throw - just mark as not configured\n // This allows the provider to be instantiated even when Neon is not being used\n const validation = validateNeonConfig(config)\n if (!validation.valid) {\n getLogger().debug(`NeonProvider not configured: ${validation.error}`)\n getLogger().debug('Neon database branching will not be used')\n this._isConfigured = false\n } else {\n this._isConfigured = true\n }\n }\n\n /**\n * Check if provider is properly configured\n * Returns true if projectId and parentBranch are valid in settings\n */\n isConfigured(): boolean {\n return this._isConfigured\n }\n\n /**\n * Execute a Neon CLI command and return stdout\n * Throws an error if the command fails\n *\n * @param args - Command arguments to pass to neon CLI\n * @param cwd - Optional working directory to run the command from (defaults to current directory)\n */\n private async executeNeonCommand(args: string[], cwd?: string): Promise<string> {\n // Check if provider is properly configured\n if (!this._isConfigured) {\n throw new Error('NeonProvider is not configured. Check databaseProviders.neon configuration in .iloom/settings.json')\n }\n\n // Log the exact command being executed for debugging\n const command = `neon ${args.join(' ')}`\n getLogger().debug(`Executing Neon CLI command: ${command}`)\n getLogger().debug(`Project ID being used: ${this.config.projectId}`)\n if (cwd) {\n getLogger().debug(`Working directory: ${cwd}`)\n }\n\n const result = await execa('neon', args, {\n timeout: 30000,\n encoding: 'utf8',\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return result.stdout\n }\n\n /**\n * Check if neon CLI is available\n * Ports: check_neon_cli() from bash/utils/neon-utils.sh:18-23\n */\n async isCliAvailable(): Promise<boolean> {\n try {\n await execa('command', ['-v', 'neon'], {\n timeout: 5000,\n shell: true,\n })\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Check if user is authenticated with Neon CLI\n * Ports: check_neon_auth() from bash/utils/neon-utils.sh:25-36\n *\n * @param cwd - Optional working directory to run the command from (prevents issues with deleted directories)\n * @throws Error if authentication check fails for reasons other than not being authenticated\n */\n async isAuthenticated(cwd?: string): Promise<boolean> {\n const cliAvailable = await this.isCliAvailable()\n if (!cliAvailable) {\n return false\n }\n\n try {\n await execa('neon', ['me'], {\n timeout: 10000,\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return true\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr?.trim() ?? ''\n\n // Check for authentication failure patterns (should return false, not throw)\n const isAuthError =\n stderr.toLowerCase().includes('not authenticated') ||\n stderr.toLowerCase().includes('not logged in') ||\n stderr.toLowerCase().includes('authentication required') ||\n stderr.toLowerCase().includes('login required')\n\n if (isAuthError) {\n return false\n }\n\n // For any other error, let it bubble up\n throw error\n }\n }\n\n /**\n * Sanitize branch name for Neon (replace slashes with underscores)\n * Ports: sanitize_neon_branch_name() from bash/utils/neon-utils.sh:11-15\n */\n sanitizeBranchName(branchName: string): string {\n return branchName.replace(/\\//g, '_')\n }\n\n /**\n * Extract endpoint ID from Neon connection string\n * Pattern matches: ep-abc-123 or ep-abc-123-pooler\n * Returns: ep-abc-123 (without -pooler suffix)\n * Used by: get_neon_branch_name() from bash/utils/neon-utils.sh:294\n */\n private extractEndpointId(connectionString: string): string | null {\n // First, extract the full host part between @ and first dot\n // Examples:\n // @ep-abc123.us-east-1.neon.tech -> ep-abc123\n // @ep-abc123-pooler.us-east-1.neon.tech -> ep-abc123-pooler\n const hostMatch = connectionString.match(/@(ep-[a-z0-9-]+)\\./)\n if (!hostMatch?.[1]) {\n return null\n }\n\n const fullEndpoint = hostMatch[1]\n // Remove -pooler suffix if present\n return fullEndpoint.replace(/-pooler$/, '')\n }\n\n /**\n * List all branches in the Neon project\n * Ports: list_neon_branches() from bash/utils/neon-utils.sh:63-74\n *\n * @param cwd - Optional working directory to run commands from\n */\n async listBranches(cwd?: string): Promise<string[]> {\n const output = await this.executeNeonCommand([\n 'branches',\n 'list',\n '--project-id',\n this.config.projectId,\n '--output',\n 'json',\n ], cwd)\n\n const branches: NeonBranch[] = JSON.parse(output)\n return branches.map(branch => branch.name)\n }\n\n /**\n * Check if a branch exists\n * Ports: check_neon_branch_exists() from bash/utils/neon-utils.sh:38-61\n *\n * @param name - Branch name to check\n * @param cwd - Optional working directory to run commands from\n */\n async branchExists(name: string, cwd?: string): Promise<boolean> {\n const branches = await this.listBranches(cwd)\n return branches.includes(name)\n }\n\n /**\n * Get connection string for a specific branch\n * Ports: get_neon_connection_string() from bash/utils/neon-utils.sh:76-90\n *\n * @param branch - Branch name to get connection string for\n * @param cwd - Optional working directory to run commands from\n */\n async getConnectionString(branch: string, cwd?: string): Promise<string> {\n const connectionString = await this.executeNeonCommand([\n 'connection-string',\n '--branch',\n branch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n return connectionString.trim()\n }\n\n /**\n * Find Vercel preview database branch\n * Checks for both patterns: preview/<branch> and preview_<sanitized-branch>\n * Ports: find_preview_database_branch() from bash/utils/neon-utils.sh:92-124\n *\n * @param branchName - Branch name to find preview for\n * @param cwd - Optional working directory to run commands from\n */\n async findPreviewBranch(branchName: string, cwd?: string): Promise<string | null> {\n // Check for exact preview branch match with slash pattern\n const slashPattern = `preview/${branchName}`\n if (await this.branchExists(slashPattern, cwd)) {\n getLogger().info(`Found Vercel preview database: ${slashPattern}`)\n return slashPattern\n }\n\n // Check for underscore pattern variation\n const sanitized = this.sanitizeBranchName(branchName)\n const underscorePattern = `preview_${sanitized}`\n if (await this.branchExists(underscorePattern, cwd)) {\n getLogger().info(`Found Vercel preview database: ${underscorePattern}`)\n return underscorePattern\n }\n\n return null\n }\n\n /**\n * Remove expiration date from a Neon branch\n * Used when parent branches need to have child branches created\n * Neon limitation: \"Branches with an expiration date cannot have child branches\"\n *\n * @param branchName - Name of the branch to remove expiration from\n * @param cwd - Optional working directory to run commands from\n */\n private async removeExpiration(branchName: string, cwd?: string): Promise<void> {\n getLogger().info(`Removing expiration date from branch: ${branchName}`)\n await this.executeNeonCommand([\n 'branches',\n 'set-expiration',\n branchName,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success(`Expiration date removed from ${branchName}`)\n }\n\n /**\n * Create a new database branch\n * ALWAYS checks for Vercel preview database first\n * Handles Neon limitation where parent branches with expiration dates cannot have children\n * Returns connection string for the branch\n * Ports: create_neon_database_branch() from bash/utils/neon-utils.sh:126-187\n *\n * @param name - Name for the new branch\n * @param fromBranch - Parent branch to create from (defaults to config.parentBranch)\n * @param cwd - Optional working directory to run commands from\n */\n async createBranch(name: string, fromBranch?: string, cwd?: string): Promise<string> {\n // Always check for existing Vercel preview database first (lines 149-158)\n const previewBranch = await this.findPreviewBranch(name, cwd)\n if (previewBranch) {\n const connectionString = await this.getConnectionString(previewBranch, cwd)\n getLogger().success(`Using existing Vercel preview database: ${previewBranch}`)\n return connectionString\n }\n\n // Sanitize branch name for Neon (replace slashes with underscores)\n const sanitizedName = this.sanitizeBranchName(name)\n const parentBranch = fromBranch ?? this.config.parentBranch\n\n getLogger().info('Creating Neon database branch...')\n getLogger().info(` Parent branch: ${parentBranch}`)\n getLogger().info(` New branch: ${sanitizedName}`)\n\n try {\n // Create the database branch\n await this.executeNeonCommand([\n 'branches',\n 'create',\n '--name',\n sanitizedName,\n '--parent',\n parentBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n } catch (error) {\n // Check if error is about parent branch having an expiration date\n const errorMessage = error instanceof Error ? error.message : String(error)\n if (errorMessage.toLowerCase().includes('expiration') &&\n errorMessage.toLowerCase().includes('child')) {\n getLogger().warn('Parent branch has an expiration date - removing it to allow child branch creation')\n\n // Remove expiration from parent branch\n await this.removeExpiration(parentBranch, cwd)\n\n // Retry branch creation\n getLogger().info('Retrying database branch creation...')\n await this.executeNeonCommand([\n 'branches',\n 'create',\n '--name',\n sanitizedName,\n '--parent',\n parentBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n } else {\n // Re-throw if it's a different error\n throw error\n }\n }\n\n getLogger().success('Database branch created successfully')\n\n // Get the connection string for the new branch\n getLogger().info('Getting connection string for new database branch...')\n const connectionString = await this.getConnectionString(sanitizedName, cwd)\n\n return connectionString\n }\n\n /**\n * Delete a database branch\n * Includes preview database protection with user confirmation\n * Ports: delete_neon_database_branch() from bash/utils/neon-utils.sh:204-259\n *\n * @param name - Name of the branch to delete\n * @param isPreview - Whether this is a preview database branch\n * @param cwd - Optional working directory to run commands from (prevents issues with deleted directories)\n */\n async deleteBranch(name: string, isPreview: boolean = false, cwd?: string): Promise<import('../../types/index.js').DatabaseDeletionResult> {\n // Sanitize branch name for Neon\n const sanitizedName = this.sanitizeBranchName(name)\n\n // For preview contexts, check for preview databases first\n if (isPreview) {\n const previewBranch = await this.findPreviewBranch(name, cwd)\n if (previewBranch) {\n getLogger().warn(`Found Vercel preview database: ${previewBranch}`)\n getLogger().warn('Preview databases are managed by Vercel and will be cleaned up automatically')\n getLogger().warn('Manual deletion may interfere with Vercel\\'s preview deployments')\n\n const confirmed = await promptConfirmation(\n 'Delete preview database anyway?',\n false\n )\n\n if (confirmed) {\n // User confirmed - delete preview branch\n try {\n getLogger().info(`Deleting Vercel preview database: ${previewBranch}`)\n await this.executeNeonCommand([\n 'branches',\n 'delete',\n previewBranch,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success('Preview database deleted successfully')\n return {\n success: true,\n deleted: true,\n notFound: false,\n branchName: previewBranch\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n getLogger().error(`Failed to delete preview database: ${errorMessage}`)\n return {\n success: false,\n deleted: false,\n notFound: false,\n error: errorMessage,\n branchName: previewBranch\n }\n }\n } else {\n // User declined deletion\n getLogger().info('Skipping preview database deletion')\n return {\n success: true,\n deleted: false,\n notFound: false,\n userDeclined: true,\n branchName: previewBranch\n }\n }\n }\n // If no preview database found, fall through to check regular branch\n }\n\n // Check for regular branch\n getLogger().info(`Checking for Neon database branch: ${sanitizedName}`)\n\n try {\n const exists = await this.branchExists(sanitizedName, cwd)\n\n if (!exists) {\n getLogger().info(`No database branch found for '${name}'`)\n return {\n success: true,\n deleted: false,\n notFound: true,\n branchName: sanitizedName\n }\n }\n\n // Branch exists - delete it\n getLogger().info(`Deleting Neon database branch: ${sanitizedName}`)\n await this.executeNeonCommand([\n 'branches',\n 'delete',\n sanitizedName,\n '--project-id',\n this.config.projectId,\n ], cwd)\n getLogger().success('Database branch deleted successfully')\n\n return {\n success: true,\n deleted: true,\n notFound: false,\n branchName: sanitizedName\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n getLogger().error(`Failed to delete database branch: ${errorMessage}`)\n return {\n success: false,\n deleted: false,\n notFound: false,\n error: errorMessage,\n branchName: sanitizedName\n }\n }\n }\n\n /**\n * Get branch name from endpoint ID (reverse lookup)\n * Searches all branches to find one with matching endpoint\n * Ports: get_neon_branch_name() from bash/utils/neon-utils.sh:262-308\n *\n * @param endpointId - Endpoint ID to search for\n * @param cwd - Optional working directory to run commands from\n */\n async getBranchNameFromEndpoint(endpointId: string, cwd?: string): Promise<string | null> {\n const branches = await this.listBranches(cwd)\n\n for (const branch of branches) {\n try {\n const connectionString = await this.getConnectionString(branch, cwd)\n const branchEndpointId = this.extractEndpointId(connectionString)\n\n if (branchEndpointId === endpointId) {\n return branch\n }\n } catch {\n // Skip branches that fail to get connection string\n continue\n }\n }\n\n return null\n }\n\n /**\n * Get branch name from a connection string (reverse lookup)\n * Extracts endpoint ID from connection string and finds matching branch\n *\n * @param connectionString - Neon connection string (e.g., postgres://...@ep-abc-123.region.neon.tech/...)\n * @param cwd - Optional working directory to run commands from\n */\n async getBranchNameFromConnectionString(connectionString: string, cwd?: string): Promise<string | null> {\n const endpointId = this.extractEndpointId(connectionString)\n if (!endpointId) {\n getLogger().debug('Could not extract endpoint ID from connection string')\n return null\n }\n return this.getBranchNameFromEndpoint(endpointId, cwd)\n }\n}\n","import { execa, type ExecaError } from 'execa'\nimport type { DatabaseProvider, DatabaseDeletionResult } from '../../types/index.js'\nimport { getLogger } from '../../utils/logger-context.js'\n\nexport interface SupabaseConfig {\n projectRef: string\n parentBranch?: string\n withData?: boolean // default: true\n}\n\n/**\n * Validate Supabase configuration\n * Checks that required configuration values are present\n */\nexport function validateSupabaseConfig(config: {\n projectRef?: string\n parentBranch?: string\n}): { valid: boolean; error?: string } {\n if (!config.projectRef) {\n return {\n valid: false,\n error:\n 'Supabase projectRef is required. Configure in .iloom/settings.json under databaseProviders.supabase',\n }\n }\n\n // parentBranch is optional — Supabase currently always branches from the default branch\n\n // Basic validation for project ref format (alphanumeric and hyphens)\n if (!/^[a-zA-Z0-9-]+$/.test(config.projectRef)) {\n return {\n valid: false,\n error: 'Supabase projectRef contains invalid characters',\n }\n }\n\n return { valid: true }\n}\n\n/**\n * Supabase database provider implementation\n * Provides database branching via the Supabase CLI\n */\nexport class SupabaseProvider implements DatabaseProvider {\n private _isConfigured: boolean = false\n\n readonly displayName = 'Supabase CLI'\n readonly installHint = 'Install with: npm install -g supabase'\n\n constructor(private config: SupabaseConfig) {\n getLogger().debug('SupabaseProvider initialized with config:', {\n projectRef: config.projectRef,\n parentBranch: config.parentBranch,\n withData: config.withData,\n hasProjectRef: !!config.projectRef,\n hasParentBranch: !!config.parentBranch,\n })\n\n // Validate config but don't throw - just mark as not configured\n // This allows the provider to be instantiated even when Supabase is not being used\n const validation = validateSupabaseConfig(config)\n if (!validation.valid) {\n getLogger().debug(`SupabaseProvider not configured: ${validation.error}`)\n getLogger().debug('Supabase database branching will not be used')\n this._isConfigured = false\n } else {\n this._isConfigured = true\n }\n\n if (config.parentBranch) {\n getLogger().debug(\n `parentBranch '${config.parentBranch}' is stored but Supabase currently always branches from the default branch`\n )\n }\n }\n\n /**\n * Check if provider is properly configured\n * Returns true if projectRef and parentBranch are valid in settings\n */\n isConfigured(): boolean {\n return this._isConfigured\n }\n\n /**\n * Execute a Supabase CLI command and return stdout\n * Throws an error if the command fails\n *\n * @param args - Command arguments to pass to supabase CLI\n * @param cwd - Optional working directory to run the command from (defaults to current directory)\n */\n private async executeSupabaseCommand(args: string[], cwd?: string, timeout: number = 30000): Promise<string> {\n // Check if provider is properly configured\n if (!this._isConfigured) {\n throw new Error(\n 'SupabaseProvider is not configured. Check databaseProviders.supabase configuration in .iloom/settings.json'\n )\n }\n\n // Log the exact command being executed for debugging\n const command = `supabase ${args.join(' ')}`\n getLogger().debug(`Executing Supabase CLI command: ${command}`)\n getLogger().debug(`Project ref being used: ${this.config.projectRef}`)\n if (cwd) {\n getLogger().debug(`Working directory: ${cwd}`)\n }\n\n const result = await execa('supabase', args, {\n timeout,\n encoding: 'utf8',\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return result.stdout\n }\n\n /**\n * Check if supabase CLI is available\n */\n async isCliAvailable(): Promise<boolean> {\n try {\n await execa('supabase', ['--version'], {\n timeout: 5000,\n stdio: 'pipe',\n })\n return true\n } catch (error) {\n const errorCode = (error as NodeJS.ErrnoException).code\n // ENOENT means the binary was not found on the system\n // EACCES means the binary exists but has no execute permission\n if (errorCode === 'ENOENT' || errorCode === 'EACCES') {\n return false\n }\n // Any other error (e.g., non-zero exit) still means CLI is present\n return true\n }\n }\n\n /**\n * Check if user is authenticated with Supabase CLI\n *\n * @param cwd - Optional working directory to run the command from (prevents issues with deleted directories)\n * @throws Error if authentication check fails for reasons other than not being authenticated\n */\n async isAuthenticated(cwd?: string): Promise<boolean> {\n const cliAvailable = await this.isCliAvailable()\n if (!cliAvailable) {\n return false\n }\n\n try {\n await execa('supabase', ['projects', 'list'], {\n timeout: 10000,\n stdio: 'pipe',\n ...(cwd && { cwd }),\n })\n return true\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr?.trim() ?? ''\n\n // Check for authentication failure patterns (should return false, not throw)\n const isAuthError =\n stderr.toLowerCase().includes('not authenticated') ||\n stderr.toLowerCase().includes('not logged in') ||\n stderr.toLowerCase().includes('authentication required') ||\n stderr.toLowerCase().includes('login required') ||\n stderr.toLowerCase().includes('access token not provided') ||\n stderr.toLowerCase().includes('you need to be logged in')\n\n if (isAuthError) {\n return false\n }\n\n // For any other error, let it bubble up\n throw error\n }\n }\n\n /**\n * Sanitize branch name for Supabase (replace slashes with hyphens)\n * Supabase uses hyphens as separator (not underscores like Neon)\n */\n sanitizeBranchName(branchName: string): string {\n let sanitized = branchName\n .replace(/\\//g, '-') // replace slashes with hyphens\n .replace(/[^a-zA-Z0-9_-]/g, '') // remove chars that aren't alphanumeric, hyphens, or underscores\n .replace(/^-+/, '') // strip leading hyphens (prevents CLI flag injection)\n return sanitized || 'unnamed-branch'\n }\n\n /**\n * List all branches in the Supabase project\n *\n * @param cwd - Optional working directory to run commands from\n */\n async listBranches(cwd?: string): Promise<string[]> {\n const output = await this.executeSupabaseCommand(\n ['branches', 'list', '--project-ref', this.config.projectRef, '-o', 'json'],\n cwd\n )\n\n interface SupabaseBranch {\n name: string\n [key: string]: unknown\n }\n\n let jsonString = output\n // CLI tools can prepend warnings to stdout; strip non-JSON prefixes\n const firstBracket = output.indexOf('[')\n if (firstBracket > 0) {\n jsonString = output.slice(firstBracket)\n }\n\n let branches: SupabaseBranch[]\n try {\n branches = JSON.parse(jsonString)\n } catch (parseError) {\n throw new Error(\n `Failed to parse Supabase branch list as JSON: ${parseError instanceof Error ? parseError.message : String(parseError)}`\n )\n }\n return branches.map((branch) => branch.name)\n }\n\n /**\n * Check if a branch exists\n * Uses `supabase branches get` for a direct lookup (more efficient than listing all)\n *\n * @param name - Branch name to check\n * @param cwd - Optional working directory to run commands from\n */\n async branchExists(name: string, cwd?: string): Promise<boolean> {\n const sanitizedName = this.sanitizeBranchName(name)\n try {\n await this.executeSupabaseCommand(\n ['branches', 'get', sanitizedName, '--project-ref', this.config.projectRef],\n cwd\n )\n return true\n } catch (error) {\n const execaError = error as ExecaError\n const stderr = execaError.stderr?.toLowerCase() ?? ''\n const stdout = execaError.stdout?.toLowerCase() ?? ''\n const message = (error instanceof Error ? error.message : String(error)).toLowerCase()\n\n // Only return false for explicit \"not found\" error signatures\n // Note: Supabase CLI uses exitCode=1 for \"not found\" and exitCode=2 for auth errors\n const isNotFound =\n stderr.includes('not found') ||\n stderr.includes('does not exist') ||\n stderr.includes('no branch') ||\n stdout.includes('not found') ||\n message.includes('not found') ||\n message.includes('does not exist')\n\n if (isNotFound) {\n return false\n }\n\n // For any other error (auth, network, CLI unavailable), rethrow\n throw error\n }\n }\n\n /**\n * Get connection string for a specific branch\n * Parses POSTGRES_URL_NON_POOLING from `supabase branches get <name> -o env` output\n * Connection strings are never logged at info level or above (security)\n *\n * @param branch - Branch name to get connection string for\n * @param cwd - Optional working directory to run commands from\n */\n async getConnectionString(branch: string, cwd?: string): Promise<string> {\n const sanitizedBranch = this.sanitizeBranchName(branch)\n const output = await this.executeSupabaseCommand(\n ['branches', 'get', sanitizedBranch, '--project-ref', this.config.projectRef, '-o', 'env'],\n cwd\n )\n\n // Parse POSTGRES_URL_NON_POOLING from env output\n const match = output.match(/^POSTGRES_URL_NON_POOLING=(.+)$/m)\n if (!match?.[1]) {\n throw new Error(\n `Could not find POSTGRES_URL_NON_POOLING in branch '${branch}' environment output`\n )\n }\n\n const connectionString = match[1].trim()\n // Log only at debug level - never at info level or above (security)\n getLogger().debug(`Connection string retrieved for branch '${branch}'`)\n return connectionString\n }\n\n /**\n * Create a new database branch\n * Returns connection string for the branch\n *\n * Note: Supabase preview branches always branch from the production database.\n * The fromBranch parameter is accepted for interface compatibility but ignored.\n *\n * @param name - Name for the new branch\n * @param fromBranch - Accepted for interface compatibility but ignored (Supabase always branches from production)\n * @param cwd - Optional working directory to run commands from\n */\n async createBranch(name: string, fromBranch?: string, cwd?: string): Promise<string> {\n void fromBranch // accepted for interface compatibility but ignored - Supabase always branches from production\n\n const sanitizedName = this.sanitizeBranchName(name)\n\n getLogger().info('Creating Supabase database branch...')\n getLogger().info(` New branch: ${sanitizedName}`)\n\n const args = [\n 'branches',\n 'create',\n sanitizedName,\n '--project-ref',\n this.config.projectRef,\n ]\n\n // Add --with-data flag when withData is true (default: true per acceptance criteria)\n if (this.config.withData !== false) {\n args.push('--with-data')\n }\n\n await this.executeSupabaseCommand(args, cwd, 300000)\n\n getLogger().success('Database branch created successfully')\n\n // Get the connection string for the new branch\n getLogger().info('Getting connection string for new database branch...')\n const connectionString = await this.getConnectionString(sanitizedName, cwd)\n\n return connectionString\n }\n\n /**\n * Delete a database branch\n *\n * @param name - Name of the branch to delete\n * @param isPreview - Accepted but ignored (Neon-specific concept for Vercel preview databases)\n * @param cwd - Optional working directory to run commands from (prevents issues with deleted directories)\n */\n async deleteBranch(\n name: string,\n isPreview: boolean = false,\n cwd?: string\n ): Promise<DatabaseDeletionResult> {\n void isPreview // accepted but ignored - Neon-specific concept\n\n const sanitizedName = this.sanitizeBranchName(name)\n\n getLogger().info(`Checking for Supabase database branch: ${sanitizedName}`)\n\n try {\n const exists = await this.branchExists(sanitizedName, cwd)\n\n if (!exists) {\n getLogger().info(`No database branch found for '${name}'`)\n return {\n success: true,\n deleted: false,\n notFound: true,\n branchName: sanitizedName,\n }\n }\n\n // Branch exists - delete it\n getLogger().info(`Deleting Supabase database branch: ${sanitizedName}`)\n await this.executeSupabaseCommand(\n ['branches', 'delete', sanitizedName, '--project-ref', this.config.projectRef],\n cwd\n )\n getLogger().success('Database branch deleted successfully')\n\n return {\n success: true,\n deleted: true,\n notFound: false,\n branchName: sanitizedName,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n getLogger().error(`Failed to delete database branch: ${errorMessage}`)\n return {\n success: false,\n deleted: false,\n notFound: false,\n error: errorMessage,\n branchName: sanitizedName,\n }\n }\n }\n\n}\n","import { NeonProvider } from '../lib/providers/NeonProvider.js'\nimport { SupabaseProvider } from '../lib/providers/SupabaseProvider.js'\nimport type { IloomSettings } from '../lib/SettingsManager.js'\nimport type { DatabaseProvider } from '../types/index.js'\n\n/**\n * Create the appropriate database provider from iloom settings.\n *\n * - Returns a NeonProvider when databaseProviders.neon is configured\n * - Returns a SupabaseProvider when databaseProviders.supabase is configured\n * - Throws if both neon and supabase are configured simultaneously\n * - Returns an unconfigured NeonProvider (isConfigured() = false) when neither is configured\n */\nexport function createDatabaseProviderFromSettings(settings: IloomSettings): DatabaseProvider {\n\tconst neonConfig = settings.databaseProviders?.neon\n\tconst supabaseConfig = settings.databaseProviders?.supabase\n\n\tif (neonConfig && supabaseConfig) {\n\t\tthrow new Error(\n\t\t\t'Cannot configure both Neon and Supabase database providers simultaneously. ' +\n\t\t\t\t'Remove one from databaseProviders in .iloom/settings.json.',\n\t\t)\n\t}\n\n\tif (supabaseConfig) {\n\t\treturn new SupabaseProvider({\n\t\t\tprojectRef: supabaseConfig.projectRef,\n\t\t\t...(supabaseConfig.parentBranch && { parentBranch: supabaseConfig.parentBranch }),\n\t\t\t...(supabaseConfig.withData !== undefined && { withData: supabaseConfig.withData }),\n\t\t})\n\t}\n\n\treturn new NeonProvider({\n\t\tprojectId: neonConfig?.projectId ?? '',\n\t\tparentBranch: neonConfig?.parentBranch ?? '',\n\t})\n}\n"],"mappings":"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","names":["connectionString","execa","execa"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
extractIssueNumber
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-QNPJXO53.js";
|
|
5
5
|
import {
|
|
6
6
|
extractPort,
|
|
7
7
|
findEnvFileContainingVariable,
|
|
8
8
|
logger,
|
|
9
9
|
parseEnvFile
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-VRPPI6GU.js";
|
|
11
11
|
|
|
12
12
|
// src/utils/port.ts
|
|
13
13
|
import { createHash } from "crypto";
|
|
@@ -108,4 +108,4 @@ export {
|
|
|
108
108
|
calculatePortFromIdentifier,
|
|
109
109
|
getWorkspacePort
|
|
110
110
|
};
|
|
111
|
-
//# sourceMappingURL=chunk-
|
|
111
|
+
//# sourceMappingURL=chunk-ZUIFO7B4.js.map
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
getClaudeVersion,
|
|
8
8
|
launchClaude,
|
|
9
9
|
launchClaudeInNewTerminalWindow
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-DDHWZNGL.js";
|
|
11
|
+
import "./chunk-FTYWGQFM.js";
|
|
12
|
+
import "./chunk-VRPPI6GU.js";
|
|
13
13
|
export {
|
|
14
14
|
detectClaudeCli,
|
|
15
15
|
generateBranchName,
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
launchClaude,
|
|
20
20
|
launchClaudeInNewTerminalWindow
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=claude-
|
|
22
|
+
//# sourceMappingURL=claude-ACL7G4CF.js.map
|
|
@@ -1,59 +1,62 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ResourceCleanup
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-SA446KA2.js";
|
|
5
|
+
import "./chunk-3XEXT35Z.js";
|
|
6
6
|
import {
|
|
7
7
|
CLIIsolationManager,
|
|
8
8
|
DatabaseManager,
|
|
9
9
|
EnvironmentManager,
|
|
10
10
|
LoomManager
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-4232AHNQ.js";
|
|
11
|
+
} from "./chunk-VVQQIG64.js";
|
|
12
|
+
import "./chunk-KQSV7FOG.js";
|
|
13
|
+
import "./chunk-7UBEHQTP.js";
|
|
14
|
+
import "./chunk-AYLC633W.js";
|
|
16
15
|
import {
|
|
17
16
|
ProcessManager
|
|
18
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-H3T3EPF3.js";
|
|
18
|
+
import "./chunk-ZUIFO7B4.js";
|
|
19
19
|
import {
|
|
20
20
|
IdentifierParser
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import "./chunk-YETJNRQM.js";
|
|
23
|
-
import "./chunk-HLDY5S4C.js";
|
|
24
|
-
import "./chunk-3GTUXW26.js";
|
|
25
|
-
import "./chunk-NCPZYQ4B.js";
|
|
21
|
+
} from "./chunk-SN4S5CWL.js";
|
|
26
22
|
import {
|
|
27
|
-
|
|
28
|
-
} from "./chunk-
|
|
23
|
+
createDatabaseProviderFromSettings
|
|
24
|
+
} from "./chunk-YUOVWWJX.js";
|
|
29
25
|
import {
|
|
30
26
|
TelemetryService
|
|
31
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-MY2Q3FJ3.js";
|
|
28
|
+
import "./chunk-NTDY5AMO.js";
|
|
29
|
+
import "./chunk-4232AHNQ.js";
|
|
30
|
+
import "./chunk-VIQOQ463.js";
|
|
32
31
|
import {
|
|
33
32
|
GitWorktreeManager
|
|
34
|
-
} from "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
37
|
-
import "./chunk-
|
|
33
|
+
} from "./chunk-4VQXMEEP.js";
|
|
34
|
+
import "./chunk-WEBMMJKL.js";
|
|
35
|
+
import "./chunk-K3QGG4O2.js";
|
|
36
|
+
import "./chunk-DMSL5BAP.js";
|
|
37
|
+
import "./chunk-D4Q7T5KD.js";
|
|
38
|
+
import "./chunk-KV4NU3RP.js";
|
|
38
39
|
import {
|
|
39
40
|
promptConfirmation
|
|
40
|
-
} from "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
43
|
-
import "./chunk-
|
|
44
|
-
import "./chunk-
|
|
41
|
+
} from "./chunk-NPVA65KS.js";
|
|
42
|
+
import "./chunk-QC65IOV3.js";
|
|
43
|
+
import "./chunk-P5MXXHXQ.js";
|
|
44
|
+
import "./chunk-BZ7KTXPB.js";
|
|
45
|
+
import "./chunk-OIVFHJOA.js";
|
|
46
|
+
import "./chunk-DDHWZNGL.js";
|
|
47
|
+
import "./chunk-QNPJXO53.js";
|
|
45
48
|
import {
|
|
46
49
|
SettingsManager
|
|
47
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-WGUGB54H.js";
|
|
48
51
|
import {
|
|
49
52
|
MetadataManager
|
|
50
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-4JZEQBWV.js";
|
|
51
54
|
import {
|
|
52
55
|
getLogger
|
|
53
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-FTYWGQFM.js";
|
|
54
57
|
import {
|
|
55
58
|
loadEnvIntoProcess
|
|
56
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-VRPPI6GU.js";
|
|
57
60
|
|
|
58
61
|
// src/commands/cleanup.ts
|
|
59
62
|
function trackLoomAbandoned(metadata) {
|
|
@@ -94,8 +97,8 @@ var CleanupCommand = class {
|
|
|
94
97
|
const settings = await settingsManager.loadSettings();
|
|
95
98
|
const databaseUrlEnvVarName = ((_b = (_a = settings.capabilities) == null ? void 0 : _a.database) == null ? void 0 : _b.databaseUrlEnvVarName) ?? "DATABASE_URL";
|
|
96
99
|
const environmentManager = new EnvironmentManager();
|
|
97
|
-
const
|
|
98
|
-
const databaseManager = new DatabaseManager(
|
|
100
|
+
const databaseProvider = createDatabaseProviderFromSettings(settings);
|
|
101
|
+
const databaseManager = new DatabaseManager(databaseProvider, environmentManager, databaseUrlEnvVarName);
|
|
99
102
|
const cliIsolationManager = new CLIIsolationManager();
|
|
100
103
|
this.resourceCleanup ??= new ResourceCleanup(
|
|
101
104
|
this.gitWorktreeManager,
|
|
@@ -104,10 +107,10 @@ var CleanupCommand = class {
|
|
|
104
107
|
cliIsolationManager
|
|
105
108
|
);
|
|
106
109
|
if (!this.loomManager) {
|
|
107
|
-
const { IssueTrackerFactory } = await import("./IssueTrackerFactory-
|
|
108
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
109
|
-
const { ProjectCapabilityDetector } = await import("./ProjectCapabilityDetector-
|
|
110
|
-
const { DefaultBranchNamingService } = await import("./BranchNamingService-
|
|
110
|
+
const { IssueTrackerFactory } = await import("./IssueTrackerFactory-KE2BDCLC.js");
|
|
111
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-RRGREEZQ.js");
|
|
112
|
+
const { ProjectCapabilityDetector } = await import("./ProjectCapabilityDetector-I4J66WKF.js");
|
|
113
|
+
const { DefaultBranchNamingService } = await import("./BranchNamingService-MEK2WZUD.js");
|
|
111
114
|
this.loomManager = new LoomManager(
|
|
112
115
|
this.gitWorktreeManager,
|
|
113
116
|
IssueTrackerFactory.create(settings),
|
|
@@ -311,7 +314,7 @@ var CleanupCommand = class {
|
|
|
311
314
|
const { force, dryRun } = parsed.options;
|
|
312
315
|
let parsedInput = await this.identifierParser.parseForPatternDetection(identifier);
|
|
313
316
|
if (parsedInput.type === "branch" && parsedInput.branchName) {
|
|
314
|
-
const { extractIssueNumber } = await import("./git-
|
|
317
|
+
const { extractIssueNumber } = await import("./git-TX2IEMB3.js");
|
|
315
318
|
const extractedNumber = extractIssueNumber(parsedInput.branchName);
|
|
316
319
|
if (extractedNumber !== null) {
|
|
317
320
|
parsedInput = {
|
|
@@ -541,4 +544,4 @@ var CleanupCommand = class {
|
|
|
541
544
|
export {
|
|
542
545
|
CleanupCommand
|
|
543
546
|
};
|
|
544
|
-
//# sourceMappingURL=cleanup-
|
|
547
|
+
//# sourceMappingURL=cleanup-RJKLI47I.js.map
|