@iloom/cli 0.11.1 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +153 -13
  3. package/dist/BitBucketApiClient-J2ZSCS5N.js +10 -0
  4. package/dist/BitBucketVCSProvider-5X64IXXW.js +12 -0
  5. package/dist/{BranchNamingService-XBCO747L.js → BranchNamingService-MEK2WZUD.js} +4 -4
  6. package/dist/ClaudeContextManager-IENAE2CP.js +14 -0
  7. package/dist/ClaudeService-YIJCZUUB.js +13 -0
  8. package/dist/GitHubService-UTAYZXL3.js +12 -0
  9. package/dist/IssueTrackerFactory-2OI7YIN6.js +15 -0
  10. package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-3TSFW7QP.js} +10 -10
  11. package/dist/MetadataManager-V4LSJ2PB.js +10 -0
  12. package/dist/ProjectCapabilityDetector-I4J66WKF.js +11 -0
  13. package/dist/{PromptTemplateManager-T5VTLJP3.js → PromptTemplateManager-I75WKXM4.js} +3 -3
  14. package/dist/README.md +153 -13
  15. package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-BMQCAXPP.js} +13 -5
  16. package/dist/SettingsMigrationManager-ZPARZ5KH.js +10 -0
  17. package/dist/agents/iloom-code-reviewer.md +2 -1
  18. package/dist/agents/iloom-framework-detector.md +0 -1
  19. package/dist/agents/iloom-issue-analyze-and-plan.md +4 -1
  20. package/dist/agents/iloom-issue-analyzer.md +4 -1
  21. package/dist/agents/iloom-issue-complexity-evaluator.md +4 -1
  22. package/dist/agents/iloom-issue-enhancer.md +4 -1
  23. package/dist/agents/iloom-issue-implementer.md +5 -2
  24. package/dist/agents/iloom-issue-planner.md +4 -1
  25. package/dist/agents/iloom-wave-verifier.md +186 -0
  26. package/dist/browser-VZY7F2DF.js +10 -0
  27. package/dist/build-DMWSIME6.js +27 -0
  28. package/dist/{chunk-UHIBKD73.js → chunk-35CBWAJL.js} +13 -32
  29. package/dist/{chunk-UHIBKD73.js.map → chunk-35CBWAJL.js.map} +1 -1
  30. package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
  31. package/dist/chunk-4JZEQBWV.js.map +1 -0
  32. package/dist/{chunk-ET6A2JR4.js → chunk-653XBU3L.js} +111 -18
  33. package/dist/chunk-653XBU3L.js.map +1 -0
  34. package/dist/{chunk-G2MNSPA4.js → chunk-772N5WCA.js} +2 -2
  35. package/dist/{chunk-WG4MLJ6J.js → chunk-7RCUWU3I.js} +2 -2
  36. package/dist/chunk-7RCUWU3I.js.map +1 -0
  37. package/dist/{chunk-NOMQ5RFG.js → chunk-7UBEHQTP.js} +2 -2
  38. package/dist/{chunk-7NFCGKZT.js → chunk-AQUSMNBF.js} +3 -3
  39. package/dist/{chunk-IDCE26KD.js → chunk-AUYSAMXV.js} +3 -3
  40. package/dist/chunk-AYLC633W.js +406 -0
  41. package/dist/chunk-AYLC633W.js.map +1 -0
  42. package/dist/{chunk-HLDY5S4C.js → chunk-BFF27W3S.js} +3 -3
  43. package/dist/{chunk-QVAA5KHK.js → chunk-BZ7KTXPB.js} +16 -8
  44. package/dist/chunk-BZ7KTXPB.js.map +1 -0
  45. package/dist/{chunk-K7R5QY6C.js → chunk-CE676WCN.js} +2 -2
  46. package/dist/{chunk-5UFGO4ZT.js → chunk-CQHHEW2M.js} +6 -3
  47. package/dist/chunk-CQHHEW2M.js.map +1 -0
  48. package/dist/{chunk-LHDD4JHC.js → chunk-D4Q7T5KD.js} +4 -4
  49. package/dist/{chunk-RBYTXYGD.js → chunk-D75KSI3V.js} +2 -2
  50. package/dist/{chunk-Y3RX7LZT.js → chunk-DDHWZNGL.js} +18 -12
  51. package/dist/chunk-DDHWZNGL.js.map +1 -0
  52. package/dist/{chunk-5LTID2AF.js → chunk-DMSL5BAP.js} +35 -6
  53. package/dist/{chunk-5LTID2AF.js.map → chunk-DMSL5BAP.js.map} +1 -1
  54. package/dist/{chunk-TEJAGQX2.js → chunk-DY6MUWQW.js} +36 -36
  55. package/dist/chunk-DY6MUWQW.js.map +1 -0
  56. package/dist/{chunk-SQYHPBFP.js → chunk-EGNUOALL.js} +2 -2
  57. package/dist/{chunk-LL6TOX3G.js → chunk-EQIII6GI.js} +10 -10
  58. package/dist/chunk-EQIII6GI.js.map +1 -0
  59. package/dist/{chunk-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
  60. package/dist/{chunk-LE2NOUTN.js → chunk-FV4KXBGO.js} +3 -3
  61. package/dist/{chunk-XFQGI2E3.js → chunk-GWJWECZB.js} +51 -45
  62. package/dist/chunk-GWJWECZB.js.map +1 -0
  63. package/dist/{chunk-QNHZM5ZV.js → chunk-HIGWKLQR.js} +3 -3
  64. package/dist/{chunk-VMZG66UV.js → chunk-HKEXRZMU.js} +3 -3
  65. package/dist/{chunk-V4STTBQD.js → chunk-IHSA7VGI.js} +9 -9
  66. package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
  67. package/dist/{chunk-QR4FU53I.js → chunk-KCZSUJUR.js} +22 -12
  68. package/dist/chunk-KCZSUJUR.js.map +1 -0
  69. package/dist/{chunk-NH3QZYE5.js → chunk-KV4NU3RP.js} +2 -2
  70. package/dist/{chunk-NDSGJZI2.js → chunk-LOAYWTJJ.js} +2 -2
  71. package/dist/{chunk-ABVMUNCD.js → chunk-M3FBM4T3.js} +64 -10
  72. package/dist/chunk-M3FBM4T3.js.map +1 -0
  73. package/dist/{chunk-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
  74. package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
  75. package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
  76. package/dist/{chunk-7FIXNAUO.js → chunk-OKB2NEDQ.js} +66 -43
  77. package/dist/chunk-OKB2NEDQ.js.map +1 -0
  78. package/dist/{chunk-3RXYOBME.js → chunk-OPQC4OWM.js} +5 -5
  79. package/dist/{chunk-3RXYOBME.js.map → chunk-OPQC4OWM.js.map} +1 -1
  80. package/dist/chunk-P5MXXHXQ.js +284 -0
  81. package/dist/chunk-P5MXXHXQ.js.map +1 -0
  82. package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
  83. package/dist/{chunk-TZNNJLGT.js → chunk-PMB6TYV4.js} +6 -6
  84. package/dist/chunk-QC65IOV3.js +304 -0
  85. package/dist/chunk-QC65IOV3.js.map +1 -0
  86. package/dist/{chunk-6YVJVUR4.js → chunk-QF2DROQR.js} +3 -3
  87. package/dist/{chunk-XXFSOVL3.js → chunk-QFDM23CO.js} +4 -4
  88. package/dist/{chunk-RMLADZRY.js → chunk-R7DGN73N.js} +5 -5
  89. package/dist/{chunk-IR74O2F6.js → chunk-UVXB6O24.js} +245 -187
  90. package/dist/chunk-UVXB6O24.js.map +1 -0
  91. package/dist/{chunk-5PNZBH6V.js → chunk-V5IYLWRA.js} +2 -2
  92. package/dist/{chunk-KQFIGI37.js → chunk-VA6CWUAE.js} +7 -7
  93. package/dist/{chunk-3GTUXW26.js → chunk-VIQOQ463.js} +19 -3
  94. package/dist/chunk-VIQOQ463.js.map +1 -0
  95. package/dist/{chunk-H2SSF24U.js → chunk-VRPPI6GU.js} +17 -6
  96. package/dist/{chunk-H2SSF24U.js.map → chunk-VRPPI6GU.js.map} +1 -1
  97. package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
  98. package/dist/{chunk-VUUN3KE4.js → chunk-XVCGPTEQ.js} +8 -8
  99. package/dist/chunk-XVCGPTEQ.js.map +1 -0
  100. package/dist/{chunk-VNYWBHKR.js → chunk-Y2MVSEJK.js} +33 -3
  101. package/dist/chunk-Y2MVSEJK.js.map +1 -0
  102. package/dist/chunk-YWNF5755.js +696 -0
  103. package/dist/chunk-YWNF5755.js.map +1 -0
  104. package/dist/{chunk-UDCI3QTS.js → chunk-ZM2AYHMO.js} +2 -2
  105. package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
  106. package/dist/{cleanup-YOM6PQCN.js → cleanup-RLBLNQZN.js} +37 -34
  107. package/dist/{cleanup-YOM6PQCN.js.map → cleanup-RLBLNQZN.js.map} +1 -1
  108. package/dist/cli.js +290 -141
  109. package/dist/cli.js.map +1 -1
  110. package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
  111. package/dist/{commit-DC2Q5CDY.js → commit-RILBXFWO.js} +15 -15
  112. package/dist/{compile-4NCQECKE.js → compile-QEL5724K.js} +11 -11
  113. package/dist/{contribute-M5UWXCAV.js → contribute-EHWLYOMZ.js} +11 -11
  114. package/dist/{contribute-M5UWXCAV.js.map → contribute-EHWLYOMZ.js.map} +1 -1
  115. package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
  116. package/dist/{dev-server-CYRP6M73.js → dev-server-2WSWZXJG.js} +35 -21
  117. package/dist/dev-server-2WSWZXJG.js.map +1 -0
  118. package/dist/{feedback-BMAZGKRW.js → feedback-RFWGB4I5.js} +17 -17
  119. package/dist/{git-BXUD6CL5.js → git-I3PO6FY7.js} +6 -6
  120. package/dist/ignite-X2NNTNUN.js +35 -0
  121. package/dist/index.d.ts +200 -16
  122. package/dist/index.js +164 -55
  123. package/dist/index.js.map +1 -1
  124. package/dist/{init-CI43GJHV.js → init-LWU2M53W.js} +18 -18
  125. package/dist/{install-deps-SRTM5U7D.js → install-deps-HXP2TM7G.js} +11 -11
  126. package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
  127. package/dist/{issues-DMRQJH7E.js → issues-SUFQJY6O.js} +69 -56
  128. package/dist/issues-SUFQJY6O.js.map +1 -0
  129. package/dist/lint-FDZC77GL.js +27 -0
  130. package/dist/{linux-RYLOP2LY.js → linux-WUGRYCJY.js} +2 -2
  131. package/dist/mcp/{chunk-PIIRD4LO.js → chunk-4HZMW2V3.js} +1 -1
  132. package/dist/mcp/{chunk-PIIRD4LO.js.map → chunk-4HZMW2V3.js.map} +1 -1
  133. package/dist/{darwin-5BHWRJ7D.js → mcp/darwin-U25WIGH6.js} +2 -2
  134. package/dist/mcp/issue-management-server.js +900 -20
  135. package/dist/mcp/issue-management-server.js.map +1 -1
  136. package/dist/mcp/{linux-JBVS4R3A.js → linux-5BXVBGSY.js} +2 -2
  137. package/dist/mcp/recap-server.js +24 -22
  138. package/dist/mcp/recap-server.js.map +1 -1
  139. package/dist/mcp/{tmux-RYBLEHUZ.js → tmux-CU26ZTNM.js} +2 -2
  140. package/dist/mcp/{wsl-4QZIQLLE.js → wsl-KI25UDOF.js} +2 -2
  141. package/dist/neon-helpers-LCZAN4U4.js +11 -0
  142. package/dist/{open-2Y7GSUTJ.js → open-US4XACLW.js} +36 -21
  143. package/dist/open-US4XACLW.js.map +1 -0
  144. package/dist/{plan-SWFPLNJE.js → plan-5S6355GF.js} +68 -75
  145. package/dist/plan-5S6355GF.js.map +1 -0
  146. package/dist/{projects-IUSUXD5D.js → projects-L5AHUBGA.js} +6 -6
  147. package/dist/{prompt-7LZB4PAT.js → prompt-FUU5NMJQ.js} +3 -3
  148. package/dist/prompt-FUU5NMJQ.js.map +1 -0
  149. package/dist/prompts/init-prompt.txt +160 -23
  150. package/dist/prompts/issue-prompt.txt +93 -157
  151. package/dist/prompts/plan-prompt.txt +86 -6
  152. package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
  153. package/dist/{rebase-S6OHAOOF.js → rebase-JA3RW2XO.js} +12 -12
  154. package/dist/{recap-GGVCG5VH.js → recap-5TO42HN2.js} +9 -9
  155. package/dist/{remote-MZTFHHTU.js → remote-RO4LZKT2.js} +3 -3
  156. package/dist/remote-RO4LZKT2.js.map +1 -0
  157. package/dist/{run-ST3FR75O.js → run-KKCRBRLW.js} +36 -21
  158. package/dist/run-KKCRBRLW.js.map +1 -0
  159. package/dist/schema/settings.schema.json +147 -11
  160. package/dist/{shell-W4SBQPTE.js → shell-GAB2FCXH.js} +8 -8
  161. package/dist/{summary-P2JCIIJO.js → summary-P7QE3TNW.js} +21 -19
  162. package/dist/summary-P7QE3TNW.js.map +1 -0
  163. package/dist/test-6LFB5WOO.js +27 -0
  164. package/dist/{test-git-2KFFAQ6B.js → test-git-PYJOYSED.js} +6 -6
  165. package/dist/{test-jira-FKDKG6CD.js → test-jira-SM7IU5HW.js} +8 -8
  166. package/dist/{test-prefix-GP2DAX37.js → test-prefix-HIRZBXTM.js} +6 -6
  167. package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
  168. package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-43PVP2JL.js} +8 -8
  169. package/dist/{tmux-7ZTA3BDI.js → tmux-6LRFH3DM.js} +2 -2
  170. package/dist/{update-XLW7R7FL.js → update-AD3GE5C4.js} +4 -4
  171. package/dist/{update-notifier-EYLAXZAA.js → update-notifier-VYDTDMSJ.js} +3 -3
  172. package/dist/update-notifier-VYDTDMSJ.js.map +1 -0
  173. package/dist/{vscode-TOGE5N67.js → vscode-HXIXRZ3A.js} +12 -12
  174. package/dist/{vscode-announcement-NIX7O2MG.js → vscode-announcement-AL3EHORH.js} +3 -3
  175. package/dist/{wsl-Y4GUTOQ7.js → wsl-4VMVT2PO.js} +2 -2
  176. package/package.json +1 -1
  177. package/dist/ClaudeContextManager-SXDCWDJA.js +0 -14
  178. package/dist/ClaudeService-6E6MCGJE.js +0 -13
  179. package/dist/GitHubService-2R5GQG4K.js +0 -12
  180. package/dist/IssueTrackerFactory-XN6MQ4UN.js +0 -14
  181. package/dist/MetadataManager-CMQQTFLQ.js +0 -10
  182. package/dist/ProjectCapabilityDetector-IC6NAFGY.js +0 -11
  183. package/dist/SettingsMigrationManager-S6J7OHUH.js +0 -10
  184. package/dist/build-OLS6J5KZ.js +0 -27
  185. package/dist/chunk-3GTUXW26.js.map +0 -1
  186. package/dist/chunk-5UFGO4ZT.js.map +0 -1
  187. package/dist/chunk-7FIXNAUO.js.map +0 -1
  188. package/dist/chunk-ABVMUNCD.js.map +0 -1
  189. package/dist/chunk-ET6A2JR4.js.map +0 -1
  190. package/dist/chunk-IR74O2F6.js.map +0 -1
  191. package/dist/chunk-LL6TOX3G.js.map +0 -1
  192. package/dist/chunk-QR4FU53I.js.map +0 -1
  193. package/dist/chunk-QVAA5KHK.js.map +0 -1
  194. package/dist/chunk-RVI6C2H5.js +0 -220
  195. package/dist/chunk-RVI6C2H5.js.map +0 -1
  196. package/dist/chunk-TEJAGQX2.js.map +0 -1
  197. package/dist/chunk-VNYWBHKR.js.map +0 -1
  198. package/dist/chunk-VUUN3KE4.js.map +0 -1
  199. package/dist/chunk-WG4MLJ6J.js.map +0 -1
  200. package/dist/chunk-XFQGI2E3.js.map +0 -1
  201. package/dist/chunk-Y3RX7LZT.js.map +0 -1
  202. package/dist/chunk-YRCEOQPX.js.map +0 -1
  203. package/dist/dev-server-CYRP6M73.js.map +0 -1
  204. package/dist/ignite-IO4LXVXJ.js +0 -35
  205. package/dist/issues-DMRQJH7E.js.map +0 -1
  206. package/dist/lint-BSWRMGPZ.js +0 -27
  207. package/dist/neon-helpers-HWIYRKOW.js +0 -11
  208. package/dist/open-2Y7GSUTJ.js.map +0 -1
  209. package/dist/plan-SWFPLNJE.js.map +0 -1
  210. package/dist/run-ST3FR75O.js.map +0 -1
  211. package/dist/summary-P2JCIIJO.js.map +0 -1
  212. package/dist/test-6JH4FE2X.js +0 -27
  213. /package/dist/{BranchNamingService-XBCO747L.js.map → BitBucketApiClient-J2ZSCS5N.js.map} +0 -0
  214. /package/dist/{ClaudeContextManager-SXDCWDJA.js.map → BitBucketVCSProvider-5X64IXXW.js.map} +0 -0
  215. /package/dist/{ClaudeService-6E6MCGJE.js.map → BranchNamingService-MEK2WZUD.js.map} +0 -0
  216. /package/dist/{GitHubService-2R5GQG4K.js.map → ClaudeContextManager-IENAE2CP.js.map} +0 -0
  217. /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-YIJCZUUB.js.map} +0 -0
  218. /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
  219. /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-2OI7YIN6.js.map} +0 -0
  220. /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-3TSFW7QP.js.map} +0 -0
  221. /package/dist/{PromptTemplateManager-T5VTLJP3.js.map → MetadataManager-V4LSJ2PB.js.map} +0 -0
  222. /package/dist/{SettingsManager-WQ5NSGAH.js.map → ProjectCapabilityDetector-I4J66WKF.js.map} +0 -0
  223. /package/dist/{SettingsMigrationManager-S6J7OHUH.js.map → PromptTemplateManager-I75WKXM4.js.map} +0 -0
  224. /package/dist/{claude-ONQTDWV3.js.map → SettingsManager-BMQCAXPP.js.map} +0 -0
  225. /package/dist/{color-VQD52LOI.js.map → SettingsMigrationManager-ZPARZ5KH.js.map} +0 -0
  226. /package/dist/{darwin-5BHWRJ7D.js.map → browser-VZY7F2DF.js.map} +0 -0
  227. /package/dist/{build-OLS6J5KZ.js.map → build-DMWSIME6.js.map} +0 -0
  228. /package/dist/{chunk-G2MNSPA4.js.map → chunk-772N5WCA.js.map} +0 -0
  229. /package/dist/{chunk-NOMQ5RFG.js.map → chunk-7UBEHQTP.js.map} +0 -0
  230. /package/dist/{chunk-7NFCGKZT.js.map → chunk-AQUSMNBF.js.map} +0 -0
  231. /package/dist/{chunk-IDCE26KD.js.map → chunk-AUYSAMXV.js.map} +0 -0
  232. /package/dist/{chunk-HLDY5S4C.js.map → chunk-BFF27W3S.js.map} +0 -0
  233. /package/dist/{chunk-K7R5QY6C.js.map → chunk-CE676WCN.js.map} +0 -0
  234. /package/dist/{chunk-LHDD4JHC.js.map → chunk-D4Q7T5KD.js.map} +0 -0
  235. /package/dist/{chunk-RBYTXYGD.js.map → chunk-D75KSI3V.js.map} +0 -0
  236. /package/dist/{chunk-SQYHPBFP.js.map → chunk-EGNUOALL.js.map} +0 -0
  237. /package/dist/{chunk-ZAXRQLK3.js.map → chunk-FTYWGQFM.js.map} +0 -0
  238. /package/dist/{chunk-LE2NOUTN.js.map → chunk-FV4KXBGO.js.map} +0 -0
  239. /package/dist/{chunk-QNHZM5ZV.js.map → chunk-HIGWKLQR.js.map} +0 -0
  240. /package/dist/{chunk-VMZG66UV.js.map → chunk-HKEXRZMU.js.map} +0 -0
  241. /package/dist/{chunk-V4STTBQD.js.map → chunk-IHSA7VGI.js.map} +0 -0
  242. /package/dist/{chunk-NCPZYQ4B.js.map → chunk-K3QGG4O2.js.map} +0 -0
  243. /package/dist/{chunk-NH3QZYE5.js.map → chunk-KV4NU3RP.js.map} +0 -0
  244. /package/dist/{chunk-NDSGJZI2.js.map → chunk-LOAYWTJJ.js.map} +0 -0
  245. /package/dist/{chunk-GMDSYLI6.js.map → chunk-MY2Q3FJ3.js.map} +0 -0
  246. /package/dist/{chunk-CV47VCMQ.js.map → chunk-NPVA65KS.js.map} +0 -0
  247. /package/dist/{chunk-7OCGBJLR.js.map → chunk-OIVFHJOA.js.map} +0 -0
  248. /package/dist/{chunk-NN5RYWXA.js.map → chunk-PH65MFQM.js.map} +0 -0
  249. /package/dist/{chunk-TZNNJLGT.js.map → chunk-PMB6TYV4.js.map} +0 -0
  250. /package/dist/{chunk-6YVJVUR4.js.map → chunk-QF2DROQR.js.map} +0 -0
  251. /package/dist/{chunk-XXFSOVL3.js.map → chunk-QFDM23CO.js.map} +0 -0
  252. /package/dist/{chunk-RMLADZRY.js.map → chunk-R7DGN73N.js.map} +0 -0
  253. /package/dist/{chunk-5PNZBH6V.js.map → chunk-V5IYLWRA.js.map} +0 -0
  254. /package/dist/{chunk-KQFIGI37.js.map → chunk-VA6CWUAE.js.map} +0 -0
  255. /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
  256. /package/dist/{chunk-UDCI3QTS.js.map → chunk-ZM2AYHMO.js.map} +0 -0
  257. /package/dist/{git-BXUD6CL5.js.map → claude-ACL7G4CF.js.map} +0 -0
  258. /package/dist/{ignite-IO4LXVXJ.js.map → color-AC6F2QE7.js.map} +0 -0
  259. /package/dist/{commit-DC2Q5CDY.js.map → commit-RILBXFWO.js.map} +0 -0
  260. /package/dist/{compile-4NCQECKE.js.map → compile-QEL5724K.js.map} +0 -0
  261. /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
  262. /package/dist/{feedback-BMAZGKRW.js.map → feedback-RFWGB4I5.js.map} +0 -0
  263. /package/dist/{mcp/darwin-3JFFE3W2.js.map → git-I3PO6FY7.js.map} +0 -0
  264. /package/dist/{neon-helpers-HWIYRKOW.js.map → ignite-X2NNTNUN.js.map} +0 -0
  265. /package/dist/{init-CI43GJHV.js.map → init-LWU2M53W.js.map} +0 -0
  266. /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-HXP2TM7G.js.map} +0 -0
  267. /package/dist/{prompt-7LZB4PAT.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
  268. /package/dist/{lint-BSWRMGPZ.js.map → lint-FDZC77GL.js.map} +0 -0
  269. /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
  270. /package/dist/{remote-MZTFHHTU.js.map → mcp/darwin-U25WIGH6.js.map} +0 -0
  271. /package/dist/mcp/{linux-JBVS4R3A.js.map → linux-5BXVBGSY.js.map} +0 -0
  272. /package/dist/mcp/{tmux-RYBLEHUZ.js.map → tmux-CU26ZTNM.js.map} +0 -0
  273. /package/dist/mcp/{wsl-4QZIQLLE.js.map → wsl-KI25UDOF.js.map} +0 -0
  274. /package/dist/{update-notifier-EYLAXZAA.js.map → neon-helpers-LCZAN4U4.js.map} +0 -0
  275. /package/dist/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
  276. /package/dist/{rebase-S6OHAOOF.js.map → rebase-JA3RW2XO.js.map} +0 -0
  277. /package/dist/{recap-GGVCG5VH.js.map → recap-5TO42HN2.js.map} +0 -0
  278. /package/dist/{shell-W4SBQPTE.js.map → shell-GAB2FCXH.js.map} +0 -0
  279. /package/dist/{test-6JH4FE2X.js.map → test-6LFB5WOO.js.map} +0 -0
  280. /package/dist/{test-git-2KFFAQ6B.js.map → test-git-PYJOYSED.js.map} +0 -0
  281. /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-SM7IU5HW.js.map} +0 -0
  282. /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-HIRZBXTM.js.map} +0 -0
  283. /package/dist/{test-tabs-YDWMWTVA.js.map → test-tabs-NGPTFD5T.js.map} +0 -0
  284. /package/dist/{test-webserver-QI3QQFZ3.js.map → test-webserver-43PVP2JL.js.map} +0 -0
  285. /package/dist/{tmux-7ZTA3BDI.js.map → tmux-6LRFH3DM.js.map} +0 -0
  286. /package/dist/{update-XLW7R7FL.js.map → update-AD3GE5C4.js.map} +0 -0
  287. /package/dist/{vscode-TOGE5N67.js.map → vscode-HXIXRZ3A.js.map} +0 -0
  288. /package/dist/{vscode-announcement-NIX7O2MG.js.map → vscode-announcement-AL3EHORH.js.map} +0 -0
  289. /package/dist/{wsl-Y4GUTOQ7.js.map → wsl-4VMVT2PO.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  buildCommandSequence,
4
4
  logger
5
- } from "./chunk-PIIRD4LO.js";
5
+ } from "./chunk-4HZMW2V3.js";
6
6
 
7
7
  // src/utils/terminal-backends/linux.ts
8
8
  import { execa } from "execa";
@@ -100,4 +100,4 @@ export {
100
100
  LinuxBackend,
101
101
  detectLinuxTerminal
102
102
  };
103
- //# sourceMappingURL=linux-JBVS4R3A.js.map
103
+ //# sourceMappingURL=linux-5BXVBGSY.js.map
@@ -92,30 +92,32 @@ var server = new McpServer({
92
92
  name: "loom-recap",
93
93
  version: "0.1.0"
94
94
  });
95
- server.registerTool(
96
- "set_goal",
97
- {
98
- title: "Set Goal",
99
- description: "Set the initial goal (called once at session start)",
100
- inputSchema: {
101
- goal: z.string().describe("The original problem statement"),
102
- worktreePath: z.string().optional().describe("Optional worktree path to scope recap to a specific loom")
95
+ if (!process.env.RECAP_DISABLE_SET_GOAL) {
96
+ server.registerTool(
97
+ "set_goal",
98
+ {
99
+ title: "Set Goal",
100
+ description: "Set the initial goal (called once at session start)",
101
+ inputSchema: {
102
+ goal: z.string().describe("The original problem statement"),
103
+ worktreePath: z.string().optional().describe("Optional worktree path to scope recap to a specific loom")
104
+ },
105
+ outputSchema: {
106
+ success: z.literal(true)
107
+ }
103
108
  },
104
- outputSchema: {
105
- success: z.literal(true)
109
+ async ({ goal, worktreePath }) => {
110
+ const filePath = resolveRecapFilePath(worktreePath);
111
+ const recap = await readRecapFile(filePath);
112
+ recap.goal = goal;
113
+ await writeRecapFile(filePath, recap);
114
+ return {
115
+ content: [{ type: "text", text: JSON.stringify({ success: true }) }],
116
+ structuredContent: { success: true }
117
+ };
106
118
  }
107
- },
108
- async ({ goal, worktreePath }) => {
109
- const filePath = resolveRecapFilePath(worktreePath);
110
- const recap = await readRecapFile(filePath);
111
- recap.goal = goal;
112
- await writeRecapFile(filePath, recap);
113
- return {
114
- content: [{ type: "text", text: JSON.stringify({ success: true }) }],
115
- structuredContent: { success: true }
116
- };
117
- }
118
- );
119
+ );
120
+ }
119
121
  server.registerTool(
120
122
  "set_complexity",
121
123
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/recap-server.ts"],"sourcesContent":["/**\n * Loom Recap MCP Server\n *\n * Captures session context (goal, decisions, insights, risks, assumptions)\n * for the VS Code Loom Context Panel.\n *\n * Environment variables:\n * - RECAP_FILE_PATH: Complete path to the recap.json file (read/write)\n * - LOOM_METADATA_JSON: Stringified JSON of the loom metadata (parsed using LoomMetadata type)\n * - METADATA_FILE_PATH: Complete path to the loom metadata JSON file (for state transition tools)\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport path from 'path'\nimport os from 'os'\nimport fs from 'fs-extra'\nimport { randomUUID } from 'crypto'\nimport type { RecapFile, RecapEntry, RecapOutput, RecapArtifact } from './recap-types.js'\nimport type { LoomMetadata, MetadataFile, SwarmState } from '../lib/MetadataManager.js'\n\ninterface EnvConfig {\n\trecapFilePath: string\n\tloomMetadata: LoomMetadata\n\tmetadataFilePath: string | null\n}\n\n// Store validated config for use in tool handlers\nlet validatedRecapFilePath: string | null = null\nlet validatedLoomMetadata: LoomMetadata | null = null\nlet validatedMetadataFilePath: string | null = null\n\n/**\n * Validate required environment variables\n * Exits with error if missing (matches issue-management-server.ts pattern)\n */\nfunction validateEnvironment(): EnvConfig {\n\tconst recapFilePath = process.env.RECAP_FILE_PATH\n\tconst loomMetadataJson = process.env.LOOM_METADATA_JSON\n\n\tif (!recapFilePath) {\n\t\tconsole.error('Missing required environment variable: RECAP_FILE_PATH')\n\t\tprocess.exit(1)\n\t}\n\tif (!loomMetadataJson) {\n\t\tconsole.error('Missing required environment variable: LOOM_METADATA_JSON')\n\t\tprocess.exit(1)\n\t}\n\n\tlet loomMetadata: LoomMetadata\n\ttry {\n\t\tloomMetadata = JSON.parse(loomMetadataJson) as LoomMetadata\n\t} catch (error) {\n\t\tconsole.error('Failed to parse LOOM_METADATA_JSON:', error)\n\t\tprocess.exit(1)\n\t}\n\n\t// METADATA_FILE_PATH is optional (only needed for state transition tools)\n\tconst metadataFilePath = process.env.METADATA_FILE_PATH ?? null\n\n\t// Store for tool handlers\n\tvalidatedRecapFilePath = recapFilePath\n\tvalidatedLoomMetadata = loomMetadata\n\tvalidatedMetadataFilePath = metadataFilePath\n\n\treturn { recapFilePath, loomMetadata, metadataFilePath }\n}\n\n/**\n * Get the validated recap file path\n * Throws if called before validateEnvironment()\n */\nfunction getRecapFilePath(): string {\n\tif (!validatedRecapFilePath) {\n\t\tthrow new Error('RECAP_FILE_PATH not validated - validateEnvironment() must be called first')\n\t}\n\treturn validatedRecapFilePath\n}\n\n/**\n * Get the validated loom metadata\n * Throws if called before validateEnvironment()\n */\nexport function getLoomMetadata(): LoomMetadata {\n\tif (!validatedLoomMetadata) {\n\t\tthrow new Error('LOOM_METADATA_JSON not validated - validateEnvironment() must be called first')\n\t}\n\treturn validatedLoomMetadata\n}\n\n/**\n * Get the validated metadata file path\n * Throws if METADATA_FILE_PATH was not provided\n */\nfunction getMetadataFilePath(): string {\n\tif (!validatedMetadataFilePath) {\n\t\tthrow new Error('METADATA_FILE_PATH not configured - state transition tools require this environment variable')\n\t}\n\treturn validatedMetadataFilePath\n}\n\n/**\n * Convert worktree path to filename slug\n * Same algorithm as MetadataManager.slugifyPath() and src/utils/mcp.ts slugifyPath()\n */\nfunction slugifyPath(worktreePath: string): string {\n\tlet slug = worktreePath.replace(/[/\\\\]+$/, '')\n\tslug = slug.replace(/[/\\\\]/g, '___')\n\tslug = slug.replace(/[^a-zA-Z0-9_-]/g, '-')\n\treturn `${slug}.json`\n}\n\n/**\n * Resolve the recap file path.\n * When worktreePath is provided, derives the path dynamically.\n * Otherwise falls back to the env var default.\n */\nexport function resolveRecapFilePath(worktreePath?: string): string {\n\tif (worktreePath) {\n\t\tconst recapsDir = path.join(os.homedir(), '.config', 'iloom-ai', 'recaps')\n\t\treturn path.join(recapsDir, slugifyPath(worktreePath))\n\t}\n\treturn getRecapFilePath()\n}\n\n/**\n * Resolve the metadata file path.\n * When worktreePath is provided, derives the path dynamically.\n * Otherwise falls back to the env var default.\n */\nexport function resolveMetadataFilePath(worktreePath?: string): string {\n\tif (worktreePath) {\n\t\tconst loomsDir = path.join(os.homedir(), '.config', 'iloom-ai', 'looms')\n\t\treturn path.join(loomsDir, slugifyPath(worktreePath))\n\t}\n\treturn getMetadataFilePath()\n}\n\n/**\n * Read recap file (returns empty object if not found or invalid)\n */\nasync function readRecapFile(filePath: string): Promise<RecapFile> {\n\ttry {\n\t\tif (await fs.pathExists(filePath)) {\n\t\t\tconst content = await fs.readFile(filePath, 'utf8')\n\t\t\treturn JSON.parse(content) as RecapFile\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not read recap file: ${error}`)\n\t}\n\treturn {}\n}\n\n/**\n * Write recap file (ensures parent directory exists)\n */\nasync function writeRecapFile(filePath: string, recap: RecapFile): Promise<void> {\n\tawait fs.ensureDir(path.dirname(filePath), { mode: 0o755 })\n\tawait fs.writeFile(filePath, JSON.stringify(recap, null, 2), { mode: 0o644 })\n}\n\n// Initialize MCP server\nconst server = new McpServer({\n\tname: 'loom-recap',\n\tversion: '0.1.0',\n})\n\n// Register set_goal tool\nserver.registerTool(\n\t'set_goal',\n\t{\n\t\ttitle: 'Set Goal',\n\t\tdescription: 'Set the initial goal (called once at session start)',\n\t\tinputSchema: {\n\t\t\tgoal: z.string().describe('The original problem statement'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tsuccess: z.literal(true),\n\t\t},\n\t},\n\tasync ({ goal, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\trecap.goal = goal\n\t\tawait writeRecapFile(filePath, recap)\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify({ success: true }) }],\n\t\t\tstructuredContent: { success: true },\n\t\t}\n\t}\n)\n\n// Register set_complexity tool\nserver.registerTool(\n\t'set_complexity',\n\t{\n\t\ttitle: 'Set Complexity',\n\t\tdescription: 'Set the assessed complexity of the current task',\n\t\tinputSchema: {\n\t\t\tcomplexity: z.enum(['trivial', 'simple', 'complex']).describe('Task complexity level'),\n\t\t\treason: z.string().optional().describe('Brief explanation for the assessment'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tsuccess: z.literal(true),\n\t\t\ttimestamp: z.string(),\n\t\t},\n\t},\n\tasync ({ complexity, reason, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\tconst timestamp = new Date().toISOString()\n\t\trecap.complexity = reason !== undefined ? { level: complexity, reason, timestamp } : { level: complexity, timestamp }\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { success: true as const, timestamp }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register add_entry tool\nserver.registerTool(\n\t'add_entry',\n\t{\n\t\ttitle: 'Add Entry',\n\t\tdescription:\n\t\t\t'Append an entry to the recap. If an entry with the same type and content already exists, it will be skipped.',\n\t\tinputSchema: {\n\t\t\ttype: z\n\t\t\t\t.enum(['decision', 'insight', 'risk', 'assumption', 'other'])\n\t\t\t\t.describe('Entry type'),\n\t\t\tcontent: z.string().describe('Entry content'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tid: z.string(),\n\t\t\ttimestamp: z.string(),\n\t\t\tskipped: z.boolean(),\n\t\t},\n\t},\n\tasync ({ type, content, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\trecap.entries ??= []\n\n\t\t// Deduplication: skip if entry with same type and content exists\n\t\tconst existingEntry = recap.entries.find((e) => e.type === type && e.content === content)\n\n\t\tif (existingEntry) {\n\t\t\tconst result = { id: existingEntry.id, timestamp: existingEntry.timestamp, skipped: true }\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\t\tstructuredContent: result,\n\t\t\t}\n\t\t}\n\n\t\tconst entry: RecapEntry = {\n\t\t\tid: randomUUID(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttype,\n\t\t\tcontent,\n\t\t}\n\t\trecap.entries.push(entry)\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { id: entry.id, timestamp: entry.timestamp, skipped: false }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register add_artifact tool\nserver.registerTool(\n\t'add_artifact',\n\t{\n\t\ttitle: 'Add Artifact',\n\t\tdescription:\n\t\t\t'Track an artifact (comment, issue, PR) created during the session. If an artifact with the same primaryUrl already exists, it will be replaced.',\n\t\tinputSchema: {\n\t\t\ttype: z.enum(['comment', 'issue', 'pr']).describe('Artifact type'),\n\t\t\tprimaryUrl: z.string().url().describe('Main URL for the artifact'),\n\t\t\tdescription: z.string().describe('Brief description of the artifact'),\n\t\t\tid: z.string().optional().describe('Optional artifact ID (e.g., comment ID, issue number)'),\n\t\t\turls: z.record(z.string()).optional().describe('Optional additional URLs (e.g., { api: \"...\" })'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tid: z.string(),\n\t\t\ttimestamp: z.string(),\n\t\t\treplaced: z.boolean(),\n\t\t},\n\t},\n\tasync ({ type, primaryUrl, description, id, urls, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\n\t\tconst artifact: RecapArtifact = {\n\t\t\tid: id ?? randomUUID(),\n\t\t\ttype,\n\t\t\tprimaryUrl,\n\t\t\turls: urls ?? {},\n\t\t\tdescription,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t}\n\n\t\trecap.artifacts ??= []\n\n\t\t// Deduplication: replace existing artifact with same primaryUrl\n\t\tconst existingIndex = recap.artifacts.findIndex((a) => a.primaryUrl === primaryUrl)\n\t\tconst replaced = existingIndex !== -1\n\n\t\tif (replaced) {\n\t\t\t// Preserve the original id if not explicitly provided\n\t\t\tconst existingArtifact = recap.artifacts[existingIndex]\n\t\t\tif (existingArtifact) {\n\t\t\t\tartifact.id = id ?? existingArtifact.id\n\t\t\t\trecap.artifacts[existingIndex] = artifact\n\t\t\t}\n\t\t} else {\n\t\t\trecap.artifacts.push(artifact)\n\t\t}\n\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { id: artifact.id, timestamp: artifact.timestamp, replaced }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register get_recap tool\nserver.registerTool(\n\t'get_recap',\n\t{\n\t\ttitle: 'Get Recap',\n\t\tdescription: 'Read current recap (for catching up or review)',\n\t\tinputSchema: {\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tfilePath: z.string(),\n\t\t\tgoal: z.string().nullable(),\n\t\t\tcomplexity: z\n\t\t\t\t.object({\n\t\t\t\t\tlevel: z.enum(['trivial', 'simple', 'complex']),\n\t\t\t\t\treason: z.string().optional(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t})\n\t\t\t\t.nullable(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t\ttype: z.enum(['decision', 'insight', 'risk', 'assumption', 'other']),\n\t\t\t\t\tcontent: z.string(),\n\t\t\t\t})\n\t\t\t),\n\t\t\tartifacts: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\ttype: z.enum(['comment', 'issue', 'pr']),\n\t\t\t\t\tprimaryUrl: z.string(),\n\t\t\t\t\turls: z.record(z.string()),\n\t\t\t\t\tdescription: z.string(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t})\n\t\t\t),\n\t\t},\n\t},\n\tasync ({ worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\t// Use loom description as default goal for new/missing recap files\n\t\t// When worktreePath is provided, read metadata from the target worktree's metadata file\n\t\tlet defaultGoal: string | null = null\n\t\tif (worktreePath) {\n\t\t\ttry {\n\t\t\t\tconst metaPath = resolveMetadataFilePath(worktreePath)\n\t\t\t\tif (await fs.pathExists(metaPath)) {\n\t\t\t\t\tconst metaContent = await fs.readFile(metaPath, 'utf8')\n\t\t\t\t\tconst meta = JSON.parse(metaContent) as MetadataFile\n\t\t\t\t\tdefaultGoal = meta.description || null\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to null default goal\n\t\t\t}\n\t\t} else {\n\t\t\tdefaultGoal = getLoomMetadata().description || null\n\t\t}\n\t\tconst result: RecapOutput = {\n\t\t\tfilePath,\n\t\t\tgoal: recap.goal ?? defaultGoal,\n\t\t\tcomplexity: recap.complexity ?? null,\n\t\t\tentries: recap.entries ?? [],\n\t\t\tartifacts: recap.artifacts ?? [],\n\t\t}\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result as unknown as Record<string, unknown>,\n\t\t}\n\t}\n)\n\n// Zod schema for swarm state values\nconst swarmStateSchema = z.enum(['pending', 'in_progress', 'code_review', 'done', 'failed'])\n\n// Register set_loom_state tool\nserver.registerTool(\n\t'set_loom_state',\n\t{\n\t\ttitle: 'Set Loom State',\n\t\tdescription: 'Set the swarm lifecycle state of the current loom',\n\t\tinputSchema: {\n\t\t\tstate: swarmStateSchema.describe('The new state for the loom'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope state operations to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tsuccess: z.literal(true),\n\t\t\tstate: swarmStateSchema,\n\t\t},\n\t},\n\tasync ({ state, worktreePath }) => {\n\t\tconst metadataFilePath = resolveMetadataFilePath(worktreePath)\n\n\t\t// Read existing metadata\n\t\tlet metadata: MetadataFile\n\t\ttry {\n\t\t\tconst content = await fs.readFile(metadataFilePath, 'utf8')\n\t\t\tmetadata = JSON.parse(content) as MetadataFile\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to read metadata file at ${metadataFilePath}: ${error instanceof Error ? error.message : String(error)}`)\n\t\t}\n\n\t\t// Update state\n\t\tmetadata.state = state as SwarmState\n\n\t\t// Write back\n\t\tawait fs.writeFile(metadataFilePath, JSON.stringify(metadata, null, 2), { mode: 0o644 })\n\n\t\tconst result = { success: true as const, state: state as SwarmState }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register get_loom_state tool\nserver.registerTool(\n\t'get_loom_state',\n\t{\n\t\ttitle: 'Get Loom State',\n\t\tdescription: 'Get the current swarm lifecycle state of the loom',\n\t\tinputSchema: {\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope state operations to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tstate: swarmStateSchema.nullable(),\n\t\t},\n\t},\n\tasync ({ worktreePath }) => {\n\t\tconst metadataFilePath = resolveMetadataFilePath(worktreePath)\n\n\t\t// Read metadata\n\t\tlet metadata: MetadataFile\n\t\ttry {\n\t\t\tconst content = await fs.readFile(metadataFilePath, 'utf8')\n\t\t\tmetadata = JSON.parse(content) as MetadataFile\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to read metadata file at ${metadataFilePath}: ${error instanceof Error ? error.message : String(error)}`)\n\t\t}\n\n\t\tconst result = { state: metadata.state ?? null }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Main server startup\nasync function main(): Promise<void> {\n\tconsole.error('=== Loom Recap MCP Server Starting ===')\n\tconsole.error(`PID: ${process.pid}`)\n\tconsole.error(`Node version: ${process.version}`)\n\tconsole.error(`CWD: ${process.cwd()}`)\n\tconsole.error(`Script: ${new URL(import.meta.url).pathname}`)\n\n\t// Log relevant env vars (LOOM_METADATA_JSON is large, just log presence and length)\n\tconsole.error('Environment variables:')\n\tconsole.error(` RECAP_FILE_PATH=${process.env.RECAP_FILE_PATH ?? '<not set>'}`)\n\tconsole.error(` METADATA_FILE_PATH=${process.env.METADATA_FILE_PATH ?? '<not set>'}`)\n\tconsole.error(` LOOM_METADATA_JSON=${process.env.LOOM_METADATA_JSON ? `<set, ${process.env.LOOM_METADATA_JSON.length} chars>` : '<not set>'}`)\n\n\tconst { recapFilePath, loomMetadata, metadataFilePath } = validateEnvironment()\n\tconsole.error(`Recap file path: ${recapFilePath}`)\n\tconsole.error(`Metadata file path: ${metadataFilePath ?? '<not configured>'}`)\n\tconsole.error(`Loom: ${loomMetadata.description} (branch: ${loomMetadata.branchName})`)\n\n\t// Check if recap file already exists\n\tconst recapExists = await fs.pathExists(recapFilePath)\n\tconsole.error(`Recap file exists: ${recapExists}`)\n\n\tconst transport = new StdioServerTransport()\n\tawait server.connect(transport)\n\tconsole.error('=== Loom Recap MCP Server READY (stdio transport) ===')\n}\n\nmain().catch((error) => {\n\tconsole.error('Fatal error starting MCP server:', error)\n\tprocess.exit(1)\n})\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../../src/mcp/recap-server.ts"],"sourcesContent":["/**\n * Loom Recap MCP Server\n *\n * Captures session context (goal, decisions, insights, risks, assumptions)\n * for the VS Code Loom Context Panel.\n *\n * Environment variables:\n * - RECAP_FILE_PATH: Complete path to the recap.json file (read/write)\n * - LOOM_METADATA_JSON: Stringified JSON of the loom metadata (parsed using LoomMetadata type)\n * - METADATA_FILE_PATH: Complete path to the loom metadata JSON file (for state transition tools)\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport path from 'path'\nimport os from 'os'\nimport fs from 'fs-extra'\nimport { randomUUID } from 'crypto'\nimport type { RecapFile, RecapEntry, RecapOutput, RecapArtifact } from './recap-types.js'\nimport type { LoomMetadata, MetadataFile, SwarmState } from '../lib/MetadataManager.js'\n\ninterface EnvConfig {\n\trecapFilePath: string\n\tloomMetadata: LoomMetadata\n\tmetadataFilePath: string | null\n}\n\n// Store validated config for use in tool handlers\nlet validatedRecapFilePath: string | null = null\nlet validatedLoomMetadata: LoomMetadata | null = null\nlet validatedMetadataFilePath: string | null = null\n\n/**\n * Validate required environment variables\n * Exits with error if missing (matches issue-management-server.ts pattern)\n */\nfunction validateEnvironment(): EnvConfig {\n\tconst recapFilePath = process.env.RECAP_FILE_PATH\n\tconst loomMetadataJson = process.env.LOOM_METADATA_JSON\n\n\tif (!recapFilePath) {\n\t\tconsole.error('Missing required environment variable: RECAP_FILE_PATH')\n\t\tprocess.exit(1)\n\t}\n\tif (!loomMetadataJson) {\n\t\tconsole.error('Missing required environment variable: LOOM_METADATA_JSON')\n\t\tprocess.exit(1)\n\t}\n\n\tlet loomMetadata: LoomMetadata\n\ttry {\n\t\tloomMetadata = JSON.parse(loomMetadataJson) as LoomMetadata\n\t} catch (error) {\n\t\tconsole.error('Failed to parse LOOM_METADATA_JSON:', error)\n\t\tprocess.exit(1)\n\t}\n\n\t// METADATA_FILE_PATH is optional (only needed for state transition tools)\n\tconst metadataFilePath = process.env.METADATA_FILE_PATH ?? null\n\n\t// Store for tool handlers\n\tvalidatedRecapFilePath = recapFilePath\n\tvalidatedLoomMetadata = loomMetadata\n\tvalidatedMetadataFilePath = metadataFilePath\n\n\treturn { recapFilePath, loomMetadata, metadataFilePath }\n}\n\n/**\n * Get the validated recap file path\n * Throws if called before validateEnvironment()\n */\nfunction getRecapFilePath(): string {\n\tif (!validatedRecapFilePath) {\n\t\tthrow new Error('RECAP_FILE_PATH not validated - validateEnvironment() must be called first')\n\t}\n\treturn validatedRecapFilePath\n}\n\n/**\n * Get the validated loom metadata\n * Throws if called before validateEnvironment()\n */\nexport function getLoomMetadata(): LoomMetadata {\n\tif (!validatedLoomMetadata) {\n\t\tthrow new Error('LOOM_METADATA_JSON not validated - validateEnvironment() must be called first')\n\t}\n\treturn validatedLoomMetadata\n}\n\n/**\n * Get the validated metadata file path\n * Throws if METADATA_FILE_PATH was not provided\n */\nfunction getMetadataFilePath(): string {\n\tif (!validatedMetadataFilePath) {\n\t\tthrow new Error('METADATA_FILE_PATH not configured - state transition tools require this environment variable')\n\t}\n\treturn validatedMetadataFilePath\n}\n\n/**\n * Convert worktree path to filename slug\n * Same algorithm as MetadataManager.slugifyPath() and src/utils/mcp.ts slugifyPath()\n */\nfunction slugifyPath(worktreePath: string): string {\n\tlet slug = worktreePath.replace(/[/\\\\]+$/, '')\n\tslug = slug.replace(/[/\\\\]/g, '___')\n\tslug = slug.replace(/[^a-zA-Z0-9_-]/g, '-')\n\treturn `${slug}.json`\n}\n\n/**\n * Resolve the recap file path.\n * When worktreePath is provided, derives the path dynamically.\n * Otherwise falls back to the env var default.\n */\nexport function resolveRecapFilePath(worktreePath?: string): string {\n\tif (worktreePath) {\n\t\tconst recapsDir = path.join(os.homedir(), '.config', 'iloom-ai', 'recaps')\n\t\treturn path.join(recapsDir, slugifyPath(worktreePath))\n\t}\n\treturn getRecapFilePath()\n}\n\n/**\n * Resolve the metadata file path.\n * When worktreePath is provided, derives the path dynamically.\n * Otherwise falls back to the env var default.\n */\nexport function resolveMetadataFilePath(worktreePath?: string): string {\n\tif (worktreePath) {\n\t\tconst loomsDir = path.join(os.homedir(), '.config', 'iloom-ai', 'looms')\n\t\treturn path.join(loomsDir, slugifyPath(worktreePath))\n\t}\n\treturn getMetadataFilePath()\n}\n\n/**\n * Read recap file (returns empty object if not found or invalid)\n */\nasync function readRecapFile(filePath: string): Promise<RecapFile> {\n\ttry {\n\t\tif (await fs.pathExists(filePath)) {\n\t\t\tconst content = await fs.readFile(filePath, 'utf8')\n\t\t\treturn JSON.parse(content) as RecapFile\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(`Warning: Could not read recap file: ${error}`)\n\t}\n\treturn {}\n}\n\n/**\n * Write recap file (ensures parent directory exists)\n */\nasync function writeRecapFile(filePath: string, recap: RecapFile): Promise<void> {\n\tawait fs.ensureDir(path.dirname(filePath), { mode: 0o755 })\n\tawait fs.writeFile(filePath, JSON.stringify(recap, null, 2), { mode: 0o644 })\n}\n\n// Initialize MCP server\nconst server = new McpServer({\n\tname: 'loom-recap',\n\tversion: '0.1.0',\n})\n\n// Register set_goal tool conditionally\n// In issue/epic workflows, set_goal is disabled via RECAP_DISABLE_SET_GOAL env var\n// to prevent agents from overwriting the goal set by the PR-level prompt\nif (!process.env.RECAP_DISABLE_SET_GOAL) {\n\tserver.registerTool(\n\t\t'set_goal',\n\t\t{\n\t\t\ttitle: 'Set Goal',\n\t\t\tdescription: 'Set the initial goal (called once at session start)',\n\t\t\tinputSchema: {\n\t\t\t\tgoal: z.string().describe('The original problem statement'),\n\t\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t\t},\n\t\t\toutputSchema: {\n\t\t\t\tsuccess: z.literal(true),\n\t\t\t},\n\t\t},\n\t\tasync ({ goal, worktreePath }) => {\n\t\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\t\tconst recap = await readRecapFile(filePath)\n\t\t\trecap.goal = goal\n\t\t\tawait writeRecapFile(filePath, recap)\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify({ success: true }) }],\n\t\t\t\tstructuredContent: { success: true },\n\t\t\t}\n\t\t}\n\t)\n}\n\n// Register set_complexity tool\nserver.registerTool(\n\t'set_complexity',\n\t{\n\t\ttitle: 'Set Complexity',\n\t\tdescription: 'Set the assessed complexity of the current task',\n\t\tinputSchema: {\n\t\t\tcomplexity: z.enum(['trivial', 'simple', 'complex']).describe('Task complexity level'),\n\t\t\treason: z.string().optional().describe('Brief explanation for the assessment'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tsuccess: z.literal(true),\n\t\t\ttimestamp: z.string(),\n\t\t},\n\t},\n\tasync ({ complexity, reason, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\tconst timestamp = new Date().toISOString()\n\t\trecap.complexity = reason !== undefined ? { level: complexity, reason, timestamp } : { level: complexity, timestamp }\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { success: true as const, timestamp }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register add_entry tool\nserver.registerTool(\n\t'add_entry',\n\t{\n\t\ttitle: 'Add Entry',\n\t\tdescription:\n\t\t\t'Append an entry to the recap. If an entry with the same type and content already exists, it will be skipped.',\n\t\tinputSchema: {\n\t\t\ttype: z\n\t\t\t\t.enum(['decision', 'insight', 'risk', 'assumption', 'other'])\n\t\t\t\t.describe('Entry type'),\n\t\t\tcontent: z.string().describe('Entry content'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tid: z.string(),\n\t\t\ttimestamp: z.string(),\n\t\t\tskipped: z.boolean(),\n\t\t},\n\t},\n\tasync ({ type, content, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\trecap.entries ??= []\n\n\t\t// Deduplication: skip if entry with same type and content exists\n\t\tconst existingEntry = recap.entries.find((e) => e.type === type && e.content === content)\n\n\t\tif (existingEntry) {\n\t\t\tconst result = { id: existingEntry.id, timestamp: existingEntry.timestamp, skipped: true }\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\t\tstructuredContent: result,\n\t\t\t}\n\t\t}\n\n\t\tconst entry: RecapEntry = {\n\t\t\tid: randomUUID(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttype,\n\t\t\tcontent,\n\t\t}\n\t\trecap.entries.push(entry)\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { id: entry.id, timestamp: entry.timestamp, skipped: false }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register add_artifact tool\nserver.registerTool(\n\t'add_artifact',\n\t{\n\t\ttitle: 'Add Artifact',\n\t\tdescription:\n\t\t\t'Track an artifact (comment, issue, PR) created during the session. If an artifact with the same primaryUrl already exists, it will be replaced.',\n\t\tinputSchema: {\n\t\t\ttype: z.enum(['comment', 'issue', 'pr']).describe('Artifact type'),\n\t\t\tprimaryUrl: z.string().url().describe('Main URL for the artifact'),\n\t\t\tdescription: z.string().describe('Brief description of the artifact'),\n\t\t\tid: z.string().optional().describe('Optional artifact ID (e.g., comment ID, issue number)'),\n\t\t\turls: z.record(z.string()).optional().describe('Optional additional URLs (e.g., { api: \"...\" })'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tid: z.string(),\n\t\t\ttimestamp: z.string(),\n\t\t\treplaced: z.boolean(),\n\t\t},\n\t},\n\tasync ({ type, primaryUrl, description, id, urls, worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\n\t\tconst artifact: RecapArtifact = {\n\t\t\tid: id ?? randomUUID(),\n\t\t\ttype,\n\t\t\tprimaryUrl,\n\t\t\turls: urls ?? {},\n\t\t\tdescription,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t}\n\n\t\trecap.artifacts ??= []\n\n\t\t// Deduplication: replace existing artifact with same primaryUrl\n\t\tconst existingIndex = recap.artifacts.findIndex((a) => a.primaryUrl === primaryUrl)\n\t\tconst replaced = existingIndex !== -1\n\n\t\tif (replaced) {\n\t\t\t// Preserve the original id if not explicitly provided\n\t\t\tconst existingArtifact = recap.artifacts[existingIndex]\n\t\t\tif (existingArtifact) {\n\t\t\t\tartifact.id = id ?? existingArtifact.id\n\t\t\t\trecap.artifacts[existingIndex] = artifact\n\t\t\t}\n\t\t} else {\n\t\t\trecap.artifacts.push(artifact)\n\t\t}\n\n\t\tawait writeRecapFile(filePath, recap)\n\t\tconst result = { id: artifact.id, timestamp: artifact.timestamp, replaced }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register get_recap tool\nserver.registerTool(\n\t'get_recap',\n\t{\n\t\ttitle: 'Get Recap',\n\t\tdescription: 'Read current recap (for catching up or review)',\n\t\tinputSchema: {\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope recap to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tfilePath: z.string(),\n\t\t\tgoal: z.string().nullable(),\n\t\t\tcomplexity: z\n\t\t\t\t.object({\n\t\t\t\t\tlevel: z.enum(['trivial', 'simple', 'complex']),\n\t\t\t\t\treason: z.string().optional(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t})\n\t\t\t\t.nullable(),\n\t\t\tentries: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t\ttype: z.enum(['decision', 'insight', 'risk', 'assumption', 'other']),\n\t\t\t\t\tcontent: z.string(),\n\t\t\t\t})\n\t\t\t),\n\t\t\tartifacts: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\ttype: z.enum(['comment', 'issue', 'pr']),\n\t\t\t\t\tprimaryUrl: z.string(),\n\t\t\t\t\turls: z.record(z.string()),\n\t\t\t\t\tdescription: z.string(),\n\t\t\t\t\ttimestamp: z.string(),\n\t\t\t\t})\n\t\t\t),\n\t\t},\n\t},\n\tasync ({ worktreePath }) => {\n\t\tconst filePath = resolveRecapFilePath(worktreePath)\n\t\tconst recap = await readRecapFile(filePath)\n\t\t// Use loom description as default goal for new/missing recap files\n\t\t// When worktreePath is provided, read metadata from the target worktree's metadata file\n\t\tlet defaultGoal: string | null = null\n\t\tif (worktreePath) {\n\t\t\ttry {\n\t\t\t\tconst metaPath = resolveMetadataFilePath(worktreePath)\n\t\t\t\tif (await fs.pathExists(metaPath)) {\n\t\t\t\t\tconst metaContent = await fs.readFile(metaPath, 'utf8')\n\t\t\t\t\tconst meta = JSON.parse(metaContent) as MetadataFile\n\t\t\t\t\tdefaultGoal = meta.description || null\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to null default goal\n\t\t\t}\n\t\t} else {\n\t\t\tdefaultGoal = getLoomMetadata().description || null\n\t\t}\n\t\tconst result: RecapOutput = {\n\t\t\tfilePath,\n\t\t\tgoal: recap.goal ?? defaultGoal,\n\t\t\tcomplexity: recap.complexity ?? null,\n\t\t\tentries: recap.entries ?? [],\n\t\t\tartifacts: recap.artifacts ?? [],\n\t\t}\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result as unknown as Record<string, unknown>,\n\t\t}\n\t}\n)\n\n// Zod schema for swarm state values\nconst swarmStateSchema = z.enum(['pending', 'in_progress', 'code_review', 'done', 'failed'])\n\n// Register set_loom_state tool\nserver.registerTool(\n\t'set_loom_state',\n\t{\n\t\ttitle: 'Set Loom State',\n\t\tdescription: 'Set the swarm lifecycle state of the current loom',\n\t\tinputSchema: {\n\t\t\tstate: swarmStateSchema.describe('The new state for the loom'),\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope state operations to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tsuccess: z.literal(true),\n\t\t\tstate: swarmStateSchema,\n\t\t},\n\t},\n\tasync ({ state, worktreePath }) => {\n\t\tconst metadataFilePath = resolveMetadataFilePath(worktreePath)\n\n\t\t// Read existing metadata\n\t\tlet metadata: MetadataFile\n\t\ttry {\n\t\t\tconst content = await fs.readFile(metadataFilePath, 'utf8')\n\t\t\tmetadata = JSON.parse(content) as MetadataFile\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to read metadata file at ${metadataFilePath}: ${error instanceof Error ? error.message : String(error)}`)\n\t\t}\n\n\t\t// Update state\n\t\tmetadata.state = state as SwarmState\n\n\t\t// Write back\n\t\tawait fs.writeFile(metadataFilePath, JSON.stringify(metadata, null, 2), { mode: 0o644 })\n\n\t\tconst result = { success: true as const, state: state as SwarmState }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Register get_loom_state tool\nserver.registerTool(\n\t'get_loom_state',\n\t{\n\t\ttitle: 'Get Loom State',\n\t\tdescription: 'Get the current swarm lifecycle state of the loom',\n\t\tinputSchema: {\n\t\t\tworktreePath: z.string().optional().describe('Optional worktree path to scope state operations to a specific loom'),\n\t\t},\n\t\toutputSchema: {\n\t\t\tstate: swarmStateSchema.nullable(),\n\t\t},\n\t},\n\tasync ({ worktreePath }) => {\n\t\tconst metadataFilePath = resolveMetadataFilePath(worktreePath)\n\n\t\t// Read metadata\n\t\tlet metadata: MetadataFile\n\t\ttry {\n\t\t\tconst content = await fs.readFile(metadataFilePath, 'utf8')\n\t\t\tmetadata = JSON.parse(content) as MetadataFile\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to read metadata file at ${metadataFilePath}: ${error instanceof Error ? error.message : String(error)}`)\n\t\t}\n\n\t\tconst result = { state: metadata.state ?? null }\n\t\treturn {\n\t\t\tcontent: [{ type: 'text' as const, text: JSON.stringify(result) }],\n\t\t\tstructuredContent: result,\n\t\t}\n\t}\n)\n\n// Main server startup\nasync function main(): Promise<void> {\n\tconsole.error('=== Loom Recap MCP Server Starting ===')\n\tconsole.error(`PID: ${process.pid}`)\n\tconsole.error(`Node version: ${process.version}`)\n\tconsole.error(`CWD: ${process.cwd()}`)\n\tconsole.error(`Script: ${new URL(import.meta.url).pathname}`)\n\n\t// Log relevant env vars (LOOM_METADATA_JSON is large, just log presence and length)\n\tconsole.error('Environment variables:')\n\tconsole.error(` RECAP_FILE_PATH=${process.env.RECAP_FILE_PATH ?? '<not set>'}`)\n\tconsole.error(` METADATA_FILE_PATH=${process.env.METADATA_FILE_PATH ?? '<not set>'}`)\n\tconsole.error(` LOOM_METADATA_JSON=${process.env.LOOM_METADATA_JSON ? `<set, ${process.env.LOOM_METADATA_JSON.length} chars>` : '<not set>'}`)\n\n\tconst { recapFilePath, loomMetadata, metadataFilePath } = validateEnvironment()\n\tconsole.error(`Recap file path: ${recapFilePath}`)\n\tconsole.error(`Metadata file path: ${metadataFilePath ?? '<not configured>'}`)\n\tconsole.error(`Loom: ${loomMetadata.description} (branch: ${loomMetadata.branchName})`)\n\n\t// Check if recap file already exists\n\tconst recapExists = await fs.pathExists(recapFilePath)\n\tconsole.error(`Recap file exists: ${recapExists}`)\n\n\tconst transport = new StdioServerTransport()\n\tawait server.connect(transport)\n\tconsole.error('=== Loom Recap MCP Server READY (stdio transport) ===')\n}\n\nmain().catch((error) => {\n\tconsole.error('Fatal error starting MCP server:', error)\n\tprocess.exit(1)\n})\n"],"mappings":"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","names":["result"]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  buildCommandSequence,
4
4
  logger
5
- } from "./chunk-PIIRD4LO.js";
5
+ } from "./chunk-4HZMW2V3.js";
6
6
 
7
7
  // src/utils/terminal-backends/tmux.ts
8
8
  import { execa } from "execa";
@@ -153,4 +153,4 @@ export {
153
153
  TmuxBackend,
154
154
  isTmuxAvailable
155
155
  };
156
- //# sourceMappingURL=tmux-RYBLEHUZ.js.map
156
+ //# sourceMappingURL=tmux-CU26ZTNM.js.map
@@ -3,7 +3,7 @@ import {
3
3
  buildCommandSequence,
4
4
  detectWSLDistro,
5
5
  rgbToHex
6
- } from "./chunk-PIIRD4LO.js";
6
+ } from "./chunk-4HZMW2V3.js";
7
7
 
8
8
  // src/utils/terminal-backends/wsl.ts
9
9
  import { execa } from "execa";
@@ -75,4 +75,4 @@ var WSLBackend = class {
75
75
  export {
76
76
  WSLBackend
77
77
  };
78
- //# sourceMappingURL=wsl-4QZIQLLE.js.map
78
+ //# sourceMappingURL=wsl-KI25UDOF.js.map
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createNeonProviderFromSettings
4
+ } from "./chunk-HKEXRZMU.js";
5
+ import "./chunk-NPVA65KS.js";
6
+ import "./chunk-FTYWGQFM.js";
7
+ import "./chunk-VRPPI6GU.js";
8
+ export {
9
+ createNeonProviderFromSettings
10
+ };
11
+ //# sourceMappingURL=neon-helpers-LCZAN4U4.js.map
@@ -1,39 +1,42 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DevServerManager
4
- } from "./chunk-RVI6C2H5.js";
5
- import "./chunk-5PNZBH6V.js";
4
+ } from "./chunk-YWNF5755.js";
5
+ import {
6
+ DockerManager
7
+ } from "./chunk-AYLC633W.js";
8
+ import "./chunk-V5IYLWRA.js";
9
+ import {
10
+ getWorkspacePort
11
+ } from "./chunk-BFF27W3S.js";
6
12
  import {
7
13
  IdentifierParser
8
- } from "./chunk-UDCI3QTS.js";
14
+ } from "./chunk-ZM2AYHMO.js";
15
+ import "./chunk-VIQOQ463.js";
9
16
  import {
10
- openBrowser
11
- } from "./chunk-YETJNRQM.js";
17
+ GitWorktreeManager
18
+ } from "./chunk-FV4KXBGO.js";
12
19
  import {
13
- getWorkspacePort
14
- } from "./chunk-HLDY5S4C.js";
15
- import "./chunk-3GTUXW26.js";
20
+ openBrowser
21
+ } from "./chunk-WEBMMJKL.js";
16
22
  import {
17
23
  extractSettingsOverrides
18
24
  } from "./chunk-GYCR2LOU.js";
19
25
  import {
20
26
  ProjectCapabilityDetector
21
- } from "./chunk-G2MNSPA4.js";
22
- import "./chunk-NCPZYQ4B.js";
23
- import {
24
- GitWorktreeManager
25
- } from "./chunk-LE2NOUTN.js";
27
+ } from "./chunk-772N5WCA.js";
28
+ import "./chunk-K3QGG4O2.js";
26
29
  import {
27
30
  extractIssueNumber
28
- } from "./chunk-3RXYOBME.js";
31
+ } from "./chunk-OPQC4OWM.js";
29
32
  import {
30
33
  SettingsManager
31
- } from "./chunk-ET6A2JR4.js";
32
- import "./chunk-YRCEOQPX.js";
33
- import "./chunk-ZAXRQLK3.js";
34
+ } from "./chunk-653XBU3L.js";
35
+ import "./chunk-4JZEQBWV.js";
36
+ import "./chunk-FTYWGQFM.js";
34
37
  import {
35
38
  logger
36
- } from "./chunk-H2SSF24U.js";
39
+ } from "./chunk-VRPPI6GU.js";
37
40
 
38
41
  // src/commands/open.ts
39
42
  import path from "path";
@@ -180,7 +183,7 @@ var OpenCommand = class {
180
183
  * Auto-starts dev server if not already running
181
184
  */
182
185
  async openWebBrowser(worktree) {
183
- var _a, _b;
186
+ var _a, _b, _c;
184
187
  const cliOverrides = extractSettingsOverrides();
185
188
  const settings = await this.settingsManager.loadSettings(void 0, cliOverrides);
186
189
  const port = await getWorkspacePort({
@@ -189,9 +192,21 @@ var OpenCommand = class {
189
192
  basePort: (_b = (_a = settings.capabilities) == null ? void 0 : _a.web) == null ? void 0 : _b.basePort,
190
193
  checkEnvFile: true
191
194
  });
195
+ const issueNumber = extractIssueNumber(worktree.branch);
196
+ const dockerIdentifier = (issueNumber == null ? void 0 : issueNumber.toString()) ?? worktree.branch;
197
+ const dockerConfig = DockerManager.buildDockerConfigFromSettings(
198
+ (_c = settings.capabilities) == null ? void 0 : _c.web,
199
+ dockerIdentifier
200
+ );
201
+ if (dockerConfig) {
202
+ await DockerManager.assertAvailable();
203
+ const { dockerFile, containerPort, identifier } = dockerConfig;
204
+ logger.debug(`Docker mode enabled with config: ${JSON.stringify({ dockerFile, containerPort, identifier })}`);
205
+ }
192
206
  const serverReady = await this.devServerManager.ensureServerRunning(
193
207
  worktree.path,
194
- port
208
+ port,
209
+ dockerConfig
195
210
  );
196
211
  if (!serverReady) {
197
212
  logger.warn(
@@ -238,4 +253,4 @@ Make sure the project is built (run 'il start' first)`
238
253
  export {
239
254
  OpenCommand
240
255
  };
241
- //# sourceMappingURL=open-2Y7GSUTJ.js.map
256
+ //# sourceMappingURL=open-US4XACLW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/open.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport { execa } from 'execa'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { ProjectCapabilityDetector } from '../lib/ProjectCapabilityDetector.js'\nimport { DevServerManager } from '../lib/DevServerManager.js'\nimport { DockerManager } from '../lib/DockerManager.js'\nimport { SettingsManager } from '../lib/SettingsManager.js'\nimport { IdentifierParser } from '../utils/IdentifierParser.js'\nimport { openBrowser } from '../utils/browser.js'\nimport { getWorkspacePort } from '../utils/port.js'\nimport { extractIssueNumber } from '../utils/git.js'\nimport { logger } from '../utils/logger.js'\nimport { extractSettingsOverrides } from '../utils/cli-overrides.js'\nimport type { GitWorktree } from '../types/worktree.js'\n\nexport interface OpenCommandInput {\n\tidentifier?: string\n\targs?: string[]\n}\n\ninterface ParsedOpenInput {\n\ttype: 'issue' | 'pr' | 'branch' | 'epic'\n\tnumber?: string | number // For issues and PRs\n\tbranchName?: string // For branches\n\toriginalInput: string\n\tautoDetected: boolean\n}\n\n/**\n * OpenCommand - Opens workspace in browser or runs CLI tool\n * Priority: Web first, CLI fallback\n */\nexport class OpenCommand {\n\tconstructor(\n\t\tprivate gitWorktreeManager = new GitWorktreeManager(),\n\t\tprivate capabilityDetector = new ProjectCapabilityDetector(),\n\t\tprivate identifierParser = new IdentifierParser(new GitWorktreeManager()),\n\t\tprivate devServerManager = new DevServerManager(),\n\t\tprivate settingsManager = new SettingsManager()\n\t) {}\n\n\tasync execute(input: OpenCommandInput): Promise<void> {\n\t\t// 1. Parse or auto-detect identifier\n\t\tconst parsed = input.identifier\n\t\t\t? await this.parseExplicitInput(input.identifier)\n\t\t\t: await this.autoDetectFromCurrentDirectory()\n\n\t\tlogger.debug(`Parsed input: ${JSON.stringify(parsed)}`)\n\n\t\t// 2. Find worktree path based on identifier\n\t\tconst worktree = await this.findWorktreeForIdentifier(parsed)\n\n\t\tlogger.info(`Found worktree at: ${worktree.path}`)\n\n\t\t// 3. Detect project capabilities\n\t\tconst { capabilities, binEntries } =\n\t\t\tawait this.capabilityDetector.detectCapabilities(worktree.path)\n\n\t\tlogger.debug(`Detected capabilities: ${capabilities.join(', ')}`)\n\n\t\t// 4. Execute based on capabilities (web first, CLI fallback)\n\t\tif (capabilities.includes('web')) {\n\t\t\tawait this.openWebBrowser(worktree)\n\t\t} else if (capabilities.includes('cli')) {\n\t\t\tawait this.runCLITool(worktree.path, binEntries, input.args ?? [])\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`No web or CLI capabilities detected for workspace at ${worktree.path}`\n\t\t\t)\n\t\t}\n\t}\n\n\t/**\n\t * Parse explicit identifier input\n\t */\n\tprivate async parseExplicitInput(identifier: string): Promise<ParsedOpenInput> {\n\t\tconst parsed = await this.identifierParser.parseForPatternDetection(identifier)\n\n\t\t// Description type should never reach open command (converted in start)\n\t\tif (parsed.type === 'description') {\n\t\t\tthrow new Error('Description input type is not supported in open command')\n\t\t}\n\n\t\tconst result: ParsedOpenInput = {\n\t\t\ttype: parsed.type,\n\t\t\toriginalInput: parsed.originalInput,\n\t\t\tautoDetected: false,\n\t\t}\n\n\t\tif (parsed.number !== undefined) {\n\t\t\tresult.number = parsed.number\n\t\t}\n\t\tif (parsed.branchName !== undefined) {\n\t\t\tresult.branchName = parsed.branchName\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * Auto-detect identifier from current directory\n\t * Same logic as FinishCommand.autoDetectFromCurrentDirectory()\n\t */\n\tprivate async autoDetectFromCurrentDirectory(): Promise<ParsedOpenInput> {\n\t\tconst currentDir = path.basename(process.cwd())\n\n\t\t// Check for PR worktree pattern: _pr_N suffix\n\t\tconst prPattern = /_pr_(\\d+)$/\n\t\tconst prMatch = currentDir.match(prPattern)\n\n\t\tif (prMatch?.[1]) {\n\t\t\tconst prNumber = parseInt(prMatch[1], 10)\n\t\t\tlogger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`)\n\t\t\treturn {\n\t\t\t\ttype: 'pr',\n\t\t\t\tnumber: prNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Check for issue pattern in directory\n\t\tconst issueNumber = extractIssueNumber(currentDir)\n\n\t\tif (issueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`)\n\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: issueNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: get current branch name\n\t\tconst repoInfo = await this.gitWorktreeManager.getRepoInfo()\n\t\tconst currentBranch = repoInfo.currentBranch\n\n\t\tif (!currentBranch) {\n\t\t\tthrow new Error(\n\t\t\t\t'Could not auto-detect identifier. Please provide an issue number, PR number, or branch name.\\n' +\n\t\t\t\t\t'Expected directory pattern: feat/issue-XX-description OR worktree with _pr_N suffix'\n\t\t\t)\n\t\t}\n\n\t\t// Try to extract issue from branch name\n\t\tconst branchIssueNumber = extractIssueNumber(currentBranch)\n\t\tif (branchIssueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`)\n\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: branchIssueNumber,\n\t\t\t\toriginalInput: currentBranch,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Last resort: use branch name\n\t\treturn {\n\t\t\ttype: 'branch',\n\t\t\tbranchName: currentBranch,\n\t\t\toriginalInput: currentBranch,\n\t\t\tautoDetected: true,\n\t\t}\n\t}\n\n\t/**\n\t * Find worktree for the given identifier\n\t */\n\tprivate async findWorktreeForIdentifier(parsed: ParsedOpenInput): Promise<GitWorktree> {\n\t\tlet worktree: GitWorktree | null = null\n\n\t\tif (parsed.type === 'issue' && parsed.number !== undefined) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForIssue(parsed.number)\n\t\t} else if (parsed.type === 'pr' && parsed.number !== undefined) {\n\t\t\t// For PRs, ensure the number is numeric (PRs are always numeric per GitHub)\n\t\t\tconst prNumber = typeof parsed.number === 'number' ? parsed.number : Number(parsed.number)\n\t\t\tif (isNaN(prNumber) || !isFinite(prNumber)) {\n\t\t\t\tthrow new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`)\n\t\t\t}\n\t\t\t// Pass empty string for branch name since we don't know it yet\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForPR(prNumber, '')\n\t\t} else if (parsed.type === 'branch' && parsed.branchName) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForBranch(\n\t\t\t\tparsed.branchName\n\t\t\t)\n\t\t}\n\n\t\tif (!worktree) {\n\t\t\tthrow new Error(\n\t\t\t\t`No worktree found for ${this.formatParsedInput(parsed)}. ` +\n\t\t\t\t\t`Run 'il start ${parsed.originalInput}' to create one.`\n\t\t\t)\n\t\t}\n\n\t\treturn worktree\n\t}\n\n\t/**\n\t * Format parsed input for display\n\t */\n\tprivate formatParsedInput(parsed: ParsedOpenInput): string {\n\t\tconst autoLabel = parsed.autoDetected ? ' (auto-detected)' : ''\n\n\t\tif (parsed.type === 'issue') {\n\t\t\treturn `issue #${parsed.number}${autoLabel}`\n\t\t}\n\t\tif (parsed.type === 'pr') {\n\t\t\treturn `PR #${parsed.number}${autoLabel}`\n\t\t}\n\t\treturn `branch \"${parsed.branchName}\"${autoLabel}`\n\t}\n\n\t/**\n\t * Open web browser with workspace URL\n\t * Auto-starts dev server if not already running\n\t */\n\tprivate async openWebBrowser(worktree: GitWorktree): Promise<void> {\n\t\tconst cliOverrides = extractSettingsOverrides()\n\t\tconst settings = await this.settingsManager.loadSettings(undefined, cliOverrides)\n\t\tconst port = await getWorkspacePort({\n\t\t\tworktreePath: worktree.path,\n\t\t\tworktreeBranch: worktree.branch,\n\t\t\tbasePort: settings.capabilities?.web?.basePort,\n\t\t\tcheckEnvFile: true,\n\t\t})\n\n\t\t// Extract Docker configuration if Docker mode is enabled\n\t\tconst issueNumber = extractIssueNumber(worktree.branch)\n\t\tconst dockerIdentifier = issueNumber?.toString() ?? worktree.branch\n\t\tconst dockerConfig = DockerManager.buildDockerConfigFromSettings(\n\t\t\tsettings.capabilities?.web,\n\t\t\tdockerIdentifier\n\t\t)\n\n\t\tif (dockerConfig) {\n\t\t\tawait DockerManager.assertAvailable()\n\t\t\tconst { dockerFile, containerPort, identifier } = dockerConfig\n\t\t\tlogger.debug(`Docker mode enabled with config: ${JSON.stringify({ dockerFile, containerPort, identifier })}`)\n\t\t}\n\n\t\t// Ensure dev server is running on the port\n\t\tconst serverReady = await this.devServerManager.ensureServerRunning(\n\t\t\tworktree.path,\n\t\t\tport,\n\t\t\tdockerConfig\n\t\t)\n\n\t\tif (!serverReady) {\n\t\t\tlogger.warn(\n\t\t\t\t`Dev server failed to start on port ${port}. Opening browser anyway...`\n\t\t\t)\n\t\t}\n\n\t\t// Construct URL and open browser\n\t\tconst url = `http://localhost:${port}`\n\t\tlogger.info(`Opening browser: ${url}`)\n\t\tawait openBrowser(url)\n\t\tlogger.success('Browser opened')\n\t}\n\n\t/**\n\t * Run CLI tool directly from worktree bin path (NO SYMLINKS!)\n\t */\n\tprivate async runCLITool(\n\t\tworktreePath: string,\n\t\tbinEntries: Record<string, string>,\n\t\targs: string[]\n\t): Promise<void> {\n\t\t// Validate binEntries exist\n\t\tif (Object.keys(binEntries).length === 0) {\n\t\t\tthrow new Error('No bin entries found in package.json')\n\t\t}\n\n\t\t// Get first bin entry (deterministic)\n\t\tconst firstEntry = Object.entries(binEntries)[0]\n\t\tif (!firstEntry) {\n\t\t\tthrow new Error('No bin entries found in package.json')\n\t\t}\n\t\tconst [binName, binPath] = firstEntry\n\t\tlogger.debug(`Using bin entry: ${binName} -> ${binPath}`)\n\n\t\t// CRITICAL: Construct absolute path (NO SYMLINKS!)\n\t\tconst binFilePath = path.resolve(worktreePath, binPath)\n\t\tlogger.debug(`Resolved bin file path: ${binFilePath}`)\n\n\t\t// Verify file exists\n\t\tif (!(await fs.pathExists(binFilePath))) {\n\t\t\tthrow new Error(\n\t\t\t\t`CLI executable not found: ${binFilePath}\\n` +\n\t\t\t\t\t`Make sure the project is built (run 'il start' first)`\n\t\t\t)\n\t\t}\n\n\t\t// Execute with Node.js\n\t\tlogger.info(`Running CLI: node ${binFilePath} ${args.join(' ')}`)\n\t\tawait execa('node', [binFilePath, ...args], {\n\t\t\tstdio: 'inherit', // Allow interactive CLIs (prompts, colors, etc.)\n\t\t\tcwd: worktreePath, // Execute in worktree context\n\t\t\tenv: process.env, // Inherit environment\n\t\t})\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,76 +1,82 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  IgniteCommand
4
- } from "./chunk-IR74O2F6.js";
4
+ } from "./chunk-UVXB6O24.js";
5
5
  import {
6
6
  StartCommand,
7
7
  launchFirstRunSetup,
8
8
  needsFirstRunSetup
9
- } from "./chunk-TEJAGQX2.js";
10
- import "./chunk-XFQGI2E3.js";
11
- import "./chunk-ABVMUNCD.js";
9
+ } from "./chunk-DY6MUWQW.js";
10
+ import "./chunk-GWJWECZB.js";
11
+ import "./chunk-M3FBM4T3.js";
12
+ import "./chunk-PMB6TYV4.js";
13
+ import {
14
+ preAcceptClaudeTrust
15
+ } from "./chunk-7UBEHQTP.js";
16
+ import "./chunk-BFF27W3S.js";
17
+ import {
18
+ matchIssueIdentifier
19
+ } from "./chunk-ZM2AYHMO.js";
20
+ import "./chunk-HKEXRZMU.js";
21
+ import {
22
+ TelemetryService
23
+ } from "./chunk-MY2Q3FJ3.js";
24
+ import "./chunk-EGNUOALL.js";
12
25
  import "./chunk-4E7LCFUG.js";
13
- import "./chunk-TZNNJLGT.js";
14
- import "./chunk-NOMQ5RFG.js";
15
26
  import {
16
27
  generateHarnessMcpConfig,
17
28
  generateIssueManagementMcpConfig
18
- } from "./chunk-5UFGO4ZT.js";
29
+ } from "./chunk-CQHHEW2M.js";
30
+ import {
31
+ AgentManager
32
+ } from "./chunk-Y2MVSEJK.js";
19
33
  import {
20
34
  IssueManagementProviderFactory
21
- } from "./chunk-RMLADZRY.js";
35
+ } from "./chunk-R7DGN73N.js";
22
36
  import "./chunk-4232AHNQ.js";
37
+ import "./chunk-VIQOQ463.js";
38
+ import "./chunk-FV4KXBGO.js";
39
+ import "./chunk-WEBMMJKL.js";
40
+ import "./chunk-QF2DROQR.js";
41
+ import "./chunk-VA6CWUAE.js";
23
42
  import {
24
- matchIssueIdentifier
25
- } from "./chunk-UDCI3QTS.js";
26
- import "./chunk-YETJNRQM.js";
27
- import "./chunk-HLDY5S4C.js";
28
- import "./chunk-3GTUXW26.js";
29
- import "./chunk-6YVJVUR4.js";
43
+ PromptTemplateManager
44
+ } from "./chunk-7RCUWU3I.js";
30
45
  import "./chunk-GYCR2LOU.js";
31
- import "./chunk-7NFCGKZT.js";
32
- import "./chunk-G2MNSPA4.js";
33
- import "./chunk-NCPZYQ4B.js";
34
- import "./chunk-VMZG66UV.js";
35
- import {
36
- TelemetryService
37
- } from "./chunk-GMDSYLI6.js";
38
- import "./chunk-SQYHPBFP.js";
39
- import "./chunk-VNYWBHKR.js";
40
- import "./chunk-LE2NOUTN.js";
46
+ import "./chunk-AQUSMNBF.js";
47
+ import "./chunk-772N5WCA.js";
48
+ import "./chunk-K3QGG4O2.js";
41
49
  import {
42
50
  IssueTrackerFactory
43
- } from "./chunk-UHIBKD73.js";
44
- import "./chunk-5LTID2AF.js";
45
- import "./chunk-LHDD4JHC.js";
46
- import "./chunk-NH3QZYE5.js";
51
+ } from "./chunk-35CBWAJL.js";
52
+ import "./chunk-DMSL5BAP.js";
53
+ import "./chunk-D4Q7T5KD.js";
54
+ import "./chunk-KV4NU3RP.js";
47
55
  import {
48
56
  isInteractiveEnvironment,
49
57
  promptConfirmation
50
- } from "./chunk-CV47VCMQ.js";
51
- import "./chunk-7OCGBJLR.js";
52
- import "./chunk-QVAA5KHK.js";
53
- import "./chunk-KQFIGI37.js";
58
+ } from "./chunk-NPVA65KS.js";
59
+ import "./chunk-QC65IOV3.js";
60
+ import "./chunk-P5MXXHXQ.js";
61
+ import "./chunk-BZ7KTXPB.js";
62
+ import "./chunk-OIVFHJOA.js";
54
63
  import {
55
64
  detectClaudeCli,
56
65
  launchClaude
57
- } from "./chunk-Y3RX7LZT.js";
58
- import {
59
- PromptTemplateManager
60
- } from "./chunk-WG4MLJ6J.js";
61
- import "./chunk-3RXYOBME.js";
66
+ } from "./chunk-DDHWZNGL.js";
67
+ import "./chunk-OPQC4OWM.js";
62
68
  import {
63
69
  PlanCommandSettingsSchema,
64
70
  SettingsManager
65
- } from "./chunk-ET6A2JR4.js";
66
- import "./chunk-YRCEOQPX.js";
71
+ } from "./chunk-653XBU3L.js";
72
+ import "./chunk-4JZEQBWV.js";
67
73
  import {
68
74
  withLogger
69
- } from "./chunk-ZAXRQLK3.js";
75
+ } from "./chunk-FTYWGQFM.js";
70
76
  import {
71
77
  createStderrLogger,
72
78
  logger
73
- } from "./chunk-H2SSF24U.js";
79
+ } from "./chunk-VRPPI6GU.js";
74
80
 
75
81
  // src/commands/plan.ts
76
82
  import chalk from "chalk";
@@ -249,8 +255,9 @@ function formatDependencies(dependencies, issuePrefix) {
249
255
  return lines.length > 0 ? lines.join("\n") : "None";
250
256
  }
251
257
  var PlanCommand = class {
252
- constructor(templateManager) {
258
+ constructor(templateManager, agentManager) {
253
259
  this.templateManager = templateManager ?? new PromptTemplateManager();
260
+ this.agentManager = agentManager ?? new AgentManager();
254
261
  }
255
262
  /**
256
263
  * Main entry point for the plan command
@@ -384,7 +391,7 @@ var PlanCommand = class {
384
391
  );
385
392
  if (shouldRunInit) {
386
393
  logger.info(chalk.bold("Launching iloom init..."));
387
- const { InitCommand } = await import("./init-CI43GJHV.js");
394
+ const { InitCommand } = await import("./init-LWU2M53W.js");
388
395
  const initCommand = new InitCommand();
389
396
  await initCommand.execute(
390
397
  "Help the user set up a GitHub repository or Linear project for this project so they can use issue management features. When complete tell the user they can exit to continue the planning session."
@@ -504,9 +511,11 @@ var PlanCommand = class {
504
511
  ["claude", "gemini", "codex"].forEach((p) => {
505
512
  providerFlags[`USE_${p.toUpperCase()}_REVIEWER`] = effectiveReviewer === p;
506
513
  });
514
+ const waveVerification = settingsManager.getPlanWaveVerification(settings ?? void 0);
507
515
  logger.debug("Loading plan prompt template");
508
516
  const templateVariables = {
509
517
  IS_VSCODE_MODE: isVscodeMode,
518
+ WAVE_VERIFICATION: waveVerification,
510
519
  EXISTING_ISSUE_MODE: !!decompositionContext,
511
520
  FRESH_PLANNING_MODE: !decompositionContext,
512
521
  PARENT_ISSUE_NUMBER: decompositionContext == null ? void 0 : decompositionContext.identifier,
@@ -525,36 +534,15 @@ var PlanCommand = class {
525
534
  promptLength: architectPrompt.length,
526
535
  mode: decompositionContext ? "decomposition" : "fresh"
527
536
  });
528
- const allowedTools = [
529
- // Issue management tools
530
- "mcp__issue_management__create_issue",
531
- "mcp__issue_management__create_child_issue",
532
- "mcp__issue_management__get_issue",
533
- "mcp__issue_management__get_child_issues",
534
- "mcp__issue_management__get_comment",
535
- "mcp__issue_management__create_comment",
536
- // Dependency management tools
537
- "mcp__issue_management__create_dependency",
538
- "mcp__issue_management__get_dependencies",
539
- "mcp__issue_management__remove_dependency",
540
- // Codebase exploration tools (read-only)
541
- "Read",
542
- "Glob",
543
- "Grep",
544
- "Task",
545
- // Web research tools
546
- "WebFetch",
547
- "WebSearch",
548
- // Git commands for understanding repo state
549
- "Bash(git status:*)",
550
- "Bash(git log:*)",
551
- "Bash(git branch:*)",
552
- "Bash(git remote:*)",
553
- "Bash(git diff:*)",
554
- "Bash(git show:*)"
555
- ];
556
- if (autoSwarm) {
557
- allowedTools.push("mcp__harness__signal");
537
+ let agents;
538
+ try {
539
+ agents = await this.agentManager.loadAndPrepare(
540
+ settings ?? void 0,
541
+ templateVariables,
542
+ ["iloom-issue-analyzer.md"]
543
+ );
544
+ } catch (error) {
545
+ logger.warn(`Failed to load agents: ${error instanceof Error ? error.message : "Unknown error"}`);
558
546
  }
559
547
  const isHeadless = (printOptions == null ? void 0 : printOptions.print) ?? false;
560
548
  const claudeOptions = {
@@ -563,7 +551,7 @@ var PlanCommand = class {
563
551
  appendSystemPrompt: architectPrompt,
564
552
  mcpConfig,
565
553
  addDir: process.cwd(),
566
- allowedTools
554
+ ...agents && { agents }
567
555
  };
568
556
  if ((printOptions == null ? void 0 : printOptions.outputFormat) !== void 0) {
569
557
  claudeOptions.outputFormat = printOptions.outputFormat;
@@ -595,6 +583,11 @@ var PlanCommand = class {
595
583
  yolo,
596
584
  print: isHeadless
597
585
  });
586
+ try {
587
+ await preAcceptClaudeTrust(process.cwd());
588
+ } catch (error) {
589
+ logger.warn(`Failed to pre-accept Claude trust: ${error instanceof Error ? error.message : String(error)}`);
590
+ }
598
591
  let initialMessage;
599
592
  if (decompositionContext) {
600
593
  initialMessage = `Break down issue #${decompositionContext.identifier} into child issues.`;
@@ -719,4 +712,4 @@ ${initialMessage}`;
719
712
  export {
720
713
  PlanCommand
721
714
  };
722
- //# sourceMappingURL=plan-SWFPLNJE.js.map
715
+ //# sourceMappingURL=plan-5S6355GF.js.map