@iloom/cli 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +153 -13
  3. package/dist/BitBucketApiClient-J2ZSCS5N.js +10 -0
  4. package/dist/BitBucketVCSProvider-5X64IXXW.js +12 -0
  5. package/dist/{BranchNamingService-XBCO747L.js → BranchNamingService-MEK2WZUD.js} +4 -4
  6. package/dist/ClaudeContextManager-IENAE2CP.js +14 -0
  7. package/dist/ClaudeService-YIJCZUUB.js +13 -0
  8. package/dist/GitHubService-UTAYZXL3.js +12 -0
  9. package/dist/IssueTrackerFactory-2OI7YIN6.js +15 -0
  10. package/dist/{LoomLauncher-5AZU2F5I.js → LoomLauncher-3TSFW7QP.js} +10 -10
  11. package/dist/MetadataManager-V4LSJ2PB.js +10 -0
  12. package/dist/ProjectCapabilityDetector-I4J66WKF.js +11 -0
  13. package/dist/{PromptTemplateManager-T5VTLJP3.js → PromptTemplateManager-I75WKXM4.js} +3 -3
  14. package/dist/README.md +153 -13
  15. package/dist/{SettingsManager-WQ5NSGAH.js → SettingsManager-BMQCAXPP.js} +13 -5
  16. package/dist/SettingsMigrationManager-ZPARZ5KH.js +10 -0
  17. package/dist/agents/iloom-code-reviewer.md +2 -1
  18. package/dist/agents/iloom-framework-detector.md +0 -1
  19. package/dist/agents/iloom-issue-analyze-and-plan.md +4 -1
  20. package/dist/agents/iloom-issue-analyzer.md +4 -1
  21. package/dist/agents/iloom-issue-complexity-evaluator.md +4 -1
  22. package/dist/agents/iloom-issue-enhancer.md +4 -1
  23. package/dist/agents/iloom-issue-implementer.md +8 -3
  24. package/dist/agents/iloom-issue-planner.md +4 -1
  25. package/dist/agents/iloom-wave-verifier.md +186 -0
  26. package/dist/browser-VZY7F2DF.js +10 -0
  27. package/dist/build-DMWSIME6.js +27 -0
  28. package/dist/{chunk-UHIBKD73.js → chunk-35CBWAJL.js} +13 -32
  29. package/dist/{chunk-UHIBKD73.js.map → chunk-35CBWAJL.js.map} +1 -1
  30. package/dist/{chunk-YRCEOQPX.js → chunk-4JZEQBWV.js} +4 -3
  31. package/dist/chunk-4JZEQBWV.js.map +1 -0
  32. package/dist/{chunk-ET6A2JR4.js → chunk-653XBU3L.js} +111 -18
  33. package/dist/chunk-653XBU3L.js.map +1 -0
  34. package/dist/{chunk-G2MNSPA4.js → chunk-772N5WCA.js} +2 -2
  35. package/dist/{chunk-WG4MLJ6J.js → chunk-7RCUWU3I.js} +2 -2
  36. package/dist/chunk-7RCUWU3I.js.map +1 -0
  37. package/dist/{chunk-NOMQ5RFG.js → chunk-7UBEHQTP.js} +2 -2
  38. package/dist/{chunk-7NFCGKZT.js → chunk-AQUSMNBF.js} +3 -3
  39. package/dist/{chunk-IDCE26KD.js → chunk-AUYSAMXV.js} +3 -3
  40. package/dist/chunk-AYLC633W.js +406 -0
  41. package/dist/chunk-AYLC633W.js.map +1 -0
  42. package/dist/{chunk-HLDY5S4C.js → chunk-BFF27W3S.js} +3 -3
  43. package/dist/{chunk-QVAA5KHK.js → chunk-BZ7KTXPB.js} +16 -8
  44. package/dist/chunk-BZ7KTXPB.js.map +1 -0
  45. package/dist/{chunk-K7R5QY6C.js → chunk-CE676WCN.js} +2 -2
  46. package/dist/{chunk-5UFGO4ZT.js → chunk-CQHHEW2M.js} +6 -3
  47. package/dist/chunk-CQHHEW2M.js.map +1 -0
  48. package/dist/{chunk-LHDD4JHC.js → chunk-D4Q7T5KD.js} +4 -4
  49. package/dist/{chunk-RBYTXYGD.js → chunk-D75KSI3V.js} +2 -2
  50. package/dist/{chunk-Y3RX7LZT.js → chunk-DDHWZNGL.js} +18 -12
  51. package/dist/chunk-DDHWZNGL.js.map +1 -0
  52. package/dist/{chunk-5LTID2AF.js → chunk-DMSL5BAP.js} +35 -6
  53. package/dist/{chunk-5LTID2AF.js.map → chunk-DMSL5BAP.js.map} +1 -1
  54. package/dist/{chunk-SQYHPBFP.js → chunk-EGNUOALL.js} +2 -2
  55. package/dist/{chunk-LL6TOX3G.js → chunk-EQIII6GI.js} +10 -10
  56. package/dist/chunk-EQIII6GI.js.map +1 -0
  57. package/dist/{chunk-ZAXRQLK3.js → chunk-FTYWGQFM.js} +2 -2
  58. package/dist/{chunk-LE2NOUTN.js → chunk-FV4KXBGO.js} +3 -3
  59. package/dist/{chunk-XFQGI2E3.js → chunk-GWJWECZB.js} +51 -45
  60. package/dist/chunk-GWJWECZB.js.map +1 -0
  61. package/dist/{chunk-QNHZM5ZV.js → chunk-HIGWKLQR.js} +3 -3
  62. package/dist/{chunk-VMZG66UV.js → chunk-HKEXRZMU.js} +3 -3
  63. package/dist/{chunk-V4STTBQD.js → chunk-IHSA7VGI.js} +9 -9
  64. package/dist/{chunk-TEJAGQX2.js → chunk-IS46GQRA.js} +33 -33
  65. package/dist/{chunk-VNYWBHKR.js → chunk-JD3K2344.js} +3 -3
  66. package/dist/{chunk-NCPZYQ4B.js → chunk-K3QGG4O2.js} +2 -2
  67. package/dist/{chunk-QR4FU53I.js → chunk-KCZSUJUR.js} +22 -12
  68. package/dist/chunk-KCZSUJUR.js.map +1 -0
  69. package/dist/{chunk-NH3QZYE5.js → chunk-KV4NU3RP.js} +2 -2
  70. package/dist/{chunk-NDSGJZI2.js → chunk-LOAYWTJJ.js} +2 -2
  71. package/dist/{chunk-ABVMUNCD.js → chunk-M3FBM4T3.js} +64 -10
  72. package/dist/chunk-M3FBM4T3.js.map +1 -0
  73. package/dist/{chunk-GMDSYLI6.js → chunk-MY2Q3FJ3.js} +2 -2
  74. package/dist/{chunk-CV47VCMQ.js → chunk-NPVA65KS.js} +2 -2
  75. package/dist/{chunk-7OCGBJLR.js → chunk-OIVFHJOA.js} +2 -2
  76. package/dist/{chunk-7FIXNAUO.js → chunk-OKB2NEDQ.js} +66 -43
  77. package/dist/chunk-OKB2NEDQ.js.map +1 -0
  78. package/dist/{chunk-3RXYOBME.js → chunk-OPQC4OWM.js} +5 -5
  79. package/dist/{chunk-3RXYOBME.js.map → chunk-OPQC4OWM.js.map} +1 -1
  80. package/dist/chunk-P5MXXHXQ.js +284 -0
  81. package/dist/chunk-P5MXXHXQ.js.map +1 -0
  82. package/dist/{chunk-IR74O2F6.js → chunk-PDG74IJT.js} +239 -162
  83. package/dist/chunk-PDG74IJT.js.map +1 -0
  84. package/dist/{chunk-NN5RYWXA.js → chunk-PH65MFQM.js} +6 -6
  85. package/dist/{chunk-TZNNJLGT.js → chunk-PMB6TYV4.js} +6 -6
  86. package/dist/chunk-QC65IOV3.js +304 -0
  87. package/dist/chunk-QC65IOV3.js.map +1 -0
  88. package/dist/{chunk-6YVJVUR4.js → chunk-QF2DROQR.js} +3 -3
  89. package/dist/{chunk-XXFSOVL3.js → chunk-QFDM23CO.js} +4 -4
  90. package/dist/{chunk-RMLADZRY.js → chunk-R7DGN73N.js} +5 -5
  91. package/dist/{chunk-5PNZBH6V.js → chunk-V5IYLWRA.js} +2 -2
  92. package/dist/{chunk-KQFIGI37.js → chunk-VA6CWUAE.js} +7 -7
  93. package/dist/{chunk-3GTUXW26.js → chunk-VIQOQ463.js} +19 -3
  94. package/dist/chunk-VIQOQ463.js.map +1 -0
  95. package/dist/{chunk-H2SSF24U.js → chunk-VRPPI6GU.js} +17 -6
  96. package/dist/{chunk-H2SSF24U.js.map → chunk-VRPPI6GU.js.map} +1 -1
  97. package/dist/{chunk-YETJNRQM.js → chunk-WEBMMJKL.js} +2 -1
  98. package/dist/{chunk-VUUN3KE4.js → chunk-XVCGPTEQ.js} +8 -8
  99. package/dist/chunk-XVCGPTEQ.js.map +1 -0
  100. package/dist/chunk-YWNF5755.js +696 -0
  101. package/dist/chunk-YWNF5755.js.map +1 -0
  102. package/dist/{chunk-UDCI3QTS.js → chunk-ZM2AYHMO.js} +2 -2
  103. package/dist/{claude-ONQTDWV3.js → claude-ACL7G4CF.js} +4 -4
  104. package/dist/{cleanup-YOM6PQCN.js → cleanup-RLBLNQZN.js} +37 -34
  105. package/dist/{cleanup-YOM6PQCN.js.map → cleanup-RLBLNQZN.js.map} +1 -1
  106. package/dist/cli.js +290 -141
  107. package/dist/cli.js.map +1 -1
  108. package/dist/{color-VQD52LOI.js → color-AC6F2QE7.js} +3 -3
  109. package/dist/{commit-DC2Q5CDY.js → commit-RILBXFWO.js} +15 -15
  110. package/dist/{compile-4NCQECKE.js → compile-QEL5724K.js} +11 -11
  111. package/dist/{contribute-M5UWXCAV.js → contribute-EHWLYOMZ.js} +11 -11
  112. package/dist/{contribute-M5UWXCAV.js.map → contribute-EHWLYOMZ.js.map} +1 -1
  113. package/dist/{mcp/darwin-3JFFE3W2.js → darwin-5K3I4FTH.js} +2 -2
  114. package/dist/{dev-server-CYRP6M73.js → dev-server-2WSWZXJG.js} +35 -21
  115. package/dist/dev-server-2WSWZXJG.js.map +1 -0
  116. package/dist/{feedback-BMAZGKRW.js → feedback-I6ZEHEUB.js} +17 -17
  117. package/dist/{git-BXUD6CL5.js → git-I3PO6FY7.js} +6 -6
  118. package/dist/ignite-XZFYRVRJ.js +35 -0
  119. package/dist/index.d.ts +200 -16
  120. package/dist/index.js +164 -55
  121. package/dist/index.js.map +1 -1
  122. package/dist/{init-CI43GJHV.js → init-A6WRP77L.js} +18 -18
  123. package/dist/{install-deps-SRTM5U7D.js → install-deps-HXP2TM7G.js} +11 -11
  124. package/dist/{installation-detector-HF6QN7KP.js → installation-detector-PYAZ2O6U.js} +3 -3
  125. package/dist/{issues-DMRQJH7E.js → issues-SUFQJY6O.js} +69 -56
  126. package/dist/issues-SUFQJY6O.js.map +1 -0
  127. package/dist/lint-FDZC77GL.js +27 -0
  128. package/dist/{linux-RYLOP2LY.js → linux-WUGRYCJY.js} +2 -2
  129. package/dist/mcp/{chunk-PIIRD4LO.js → chunk-4HZMW2V3.js} +1 -1
  130. package/dist/mcp/{chunk-PIIRD4LO.js.map → chunk-4HZMW2V3.js.map} +1 -1
  131. package/dist/{darwin-5BHWRJ7D.js → mcp/darwin-U25WIGH6.js} +2 -2
  132. package/dist/mcp/issue-management-server.js +900 -20
  133. package/dist/mcp/issue-management-server.js.map +1 -1
  134. package/dist/mcp/{linux-JBVS4R3A.js → linux-5BXVBGSY.js} +2 -2
  135. package/dist/mcp/recap-server.js +24 -22
  136. package/dist/mcp/recap-server.js.map +1 -1
  137. package/dist/mcp/{tmux-RYBLEHUZ.js → tmux-CU26ZTNM.js} +2 -2
  138. package/dist/mcp/{wsl-4QZIQLLE.js → wsl-KI25UDOF.js} +2 -2
  139. package/dist/neon-helpers-LCZAN4U4.js +11 -0
  140. package/dist/{open-2Y7GSUTJ.js → open-US4XACLW.js} +36 -21
  141. package/dist/open-US4XACLW.js.map +1 -0
  142. package/dist/{plan-SWFPLNJE.js → plan-PL3ZB32J.js} +47 -43
  143. package/dist/{plan-SWFPLNJE.js.map → plan-PL3ZB32J.js.map} +1 -1
  144. package/dist/{projects-IUSUXD5D.js → projects-L5AHUBGA.js} +6 -6
  145. package/dist/{prompt-7LZB4PAT.js → prompt-FUU5NMJQ.js} +3 -3
  146. package/dist/prompt-FUU5NMJQ.js.map +1 -0
  147. package/dist/prompts/init-prompt.txt +160 -23
  148. package/dist/prompts/issue-prompt.txt +93 -157
  149. package/dist/prompts/plan-prompt.txt +55 -0
  150. package/dist/prompts/swarm-orchestrator-prompt.txt +78 -21
  151. package/dist/{rebase-S6OHAOOF.js → rebase-JA3RW2XO.js} +12 -12
  152. package/dist/{recap-GGVCG5VH.js → recap-5TO42HN2.js} +9 -9
  153. package/dist/{remote-MZTFHHTU.js → remote-RO4LZKT2.js} +3 -3
  154. package/dist/remote-RO4LZKT2.js.map +1 -0
  155. package/dist/{run-ST3FR75O.js → run-KKCRBRLW.js} +36 -21
  156. package/dist/run-KKCRBRLW.js.map +1 -0
  157. package/dist/schema/settings.schema.json +147 -11
  158. package/dist/{shell-W4SBQPTE.js → shell-GAB2FCXH.js} +8 -8
  159. package/dist/{summary-P2JCIIJO.js → summary-P7QE3TNW.js} +21 -19
  160. package/dist/summary-P7QE3TNW.js.map +1 -0
  161. package/dist/test-6LFB5WOO.js +27 -0
  162. package/dist/{test-git-2KFFAQ6B.js → test-git-PYJOYSED.js} +6 -6
  163. package/dist/{test-jira-FKDKG6CD.js → test-jira-SM7IU5HW.js} +8 -8
  164. package/dist/{test-prefix-GP2DAX37.js → test-prefix-HIRZBXTM.js} +6 -6
  165. package/dist/{test-tabs-YDWMWTVA.js → test-tabs-NGPTFD5T.js} +2 -2
  166. package/dist/{test-webserver-QI3QQFZ3.js → test-webserver-43PVP2JL.js} +8 -8
  167. package/dist/{tmux-7ZTA3BDI.js → tmux-6LRFH3DM.js} +2 -2
  168. package/dist/{update-XLW7R7FL.js → update-AD3GE5C4.js} +4 -4
  169. package/dist/{update-notifier-EYLAXZAA.js → update-notifier-VYDTDMSJ.js} +3 -3
  170. package/dist/update-notifier-VYDTDMSJ.js.map +1 -0
  171. package/dist/{vscode-TOGE5N67.js → vscode-HXIXRZ3A.js} +12 -12
  172. package/dist/{vscode-announcement-NIX7O2MG.js → vscode-announcement-AL3EHORH.js} +3 -3
  173. package/dist/{wsl-Y4GUTOQ7.js → wsl-4VMVT2PO.js} +2 -2
  174. package/package.json +1 -1
  175. package/dist/ClaudeContextManager-SXDCWDJA.js +0 -14
  176. package/dist/ClaudeService-6E6MCGJE.js +0 -13
  177. package/dist/GitHubService-2R5GQG4K.js +0 -12
  178. package/dist/IssueTrackerFactory-XN6MQ4UN.js +0 -14
  179. package/dist/MetadataManager-CMQQTFLQ.js +0 -10
  180. package/dist/ProjectCapabilityDetector-IC6NAFGY.js +0 -11
  181. package/dist/SettingsMigrationManager-S6J7OHUH.js +0 -10
  182. package/dist/build-OLS6J5KZ.js +0 -27
  183. package/dist/chunk-3GTUXW26.js.map +0 -1
  184. package/dist/chunk-5UFGO4ZT.js.map +0 -1
  185. package/dist/chunk-7FIXNAUO.js.map +0 -1
  186. package/dist/chunk-ABVMUNCD.js.map +0 -1
  187. package/dist/chunk-ET6A2JR4.js.map +0 -1
  188. package/dist/chunk-IR74O2F6.js.map +0 -1
  189. package/dist/chunk-LL6TOX3G.js.map +0 -1
  190. package/dist/chunk-QR4FU53I.js.map +0 -1
  191. package/dist/chunk-QVAA5KHK.js.map +0 -1
  192. package/dist/chunk-RVI6C2H5.js +0 -220
  193. package/dist/chunk-RVI6C2H5.js.map +0 -1
  194. package/dist/chunk-VUUN3KE4.js.map +0 -1
  195. package/dist/chunk-WG4MLJ6J.js.map +0 -1
  196. package/dist/chunk-XFQGI2E3.js.map +0 -1
  197. package/dist/chunk-Y3RX7LZT.js.map +0 -1
  198. package/dist/chunk-YRCEOQPX.js.map +0 -1
  199. package/dist/dev-server-CYRP6M73.js.map +0 -1
  200. package/dist/ignite-IO4LXVXJ.js +0 -35
  201. package/dist/issues-DMRQJH7E.js.map +0 -1
  202. package/dist/lint-BSWRMGPZ.js +0 -27
  203. package/dist/neon-helpers-HWIYRKOW.js +0 -11
  204. package/dist/open-2Y7GSUTJ.js.map +0 -1
  205. package/dist/run-ST3FR75O.js.map +0 -1
  206. package/dist/summary-P2JCIIJO.js.map +0 -1
  207. package/dist/test-6JH4FE2X.js +0 -27
  208. /package/dist/{BranchNamingService-XBCO747L.js.map → BitBucketApiClient-J2ZSCS5N.js.map} +0 -0
  209. /package/dist/{ClaudeContextManager-SXDCWDJA.js.map → BitBucketVCSProvider-5X64IXXW.js.map} +0 -0
  210. /package/dist/{ClaudeService-6E6MCGJE.js.map → BranchNamingService-MEK2WZUD.js.map} +0 -0
  211. /package/dist/{GitHubService-2R5GQG4K.js.map → ClaudeContextManager-IENAE2CP.js.map} +0 -0
  212. /package/dist/{IssueTrackerFactory-XN6MQ4UN.js.map → ClaudeService-YIJCZUUB.js.map} +0 -0
  213. /package/dist/{MetadataManager-CMQQTFLQ.js.map → GitHubService-UTAYZXL3.js.map} +0 -0
  214. /package/dist/{ProjectCapabilityDetector-IC6NAFGY.js.map → IssueTrackerFactory-2OI7YIN6.js.map} +0 -0
  215. /package/dist/{LoomLauncher-5AZU2F5I.js.map → LoomLauncher-3TSFW7QP.js.map} +0 -0
  216. /package/dist/{PromptTemplateManager-T5VTLJP3.js.map → MetadataManager-V4LSJ2PB.js.map} +0 -0
  217. /package/dist/{SettingsManager-WQ5NSGAH.js.map → ProjectCapabilityDetector-I4J66WKF.js.map} +0 -0
  218. /package/dist/{SettingsMigrationManager-S6J7OHUH.js.map → PromptTemplateManager-I75WKXM4.js.map} +0 -0
  219. /package/dist/{claude-ONQTDWV3.js.map → SettingsManager-BMQCAXPP.js.map} +0 -0
  220. /package/dist/{color-VQD52LOI.js.map → SettingsMigrationManager-ZPARZ5KH.js.map} +0 -0
  221. /package/dist/{darwin-5BHWRJ7D.js.map → browser-VZY7F2DF.js.map} +0 -0
  222. /package/dist/{build-OLS6J5KZ.js.map → build-DMWSIME6.js.map} +0 -0
  223. /package/dist/{chunk-G2MNSPA4.js.map → chunk-772N5WCA.js.map} +0 -0
  224. /package/dist/{chunk-NOMQ5RFG.js.map → chunk-7UBEHQTP.js.map} +0 -0
  225. /package/dist/{chunk-7NFCGKZT.js.map → chunk-AQUSMNBF.js.map} +0 -0
  226. /package/dist/{chunk-IDCE26KD.js.map → chunk-AUYSAMXV.js.map} +0 -0
  227. /package/dist/{chunk-HLDY5S4C.js.map → chunk-BFF27W3S.js.map} +0 -0
  228. /package/dist/{chunk-K7R5QY6C.js.map → chunk-CE676WCN.js.map} +0 -0
  229. /package/dist/{chunk-LHDD4JHC.js.map → chunk-D4Q7T5KD.js.map} +0 -0
  230. /package/dist/{chunk-RBYTXYGD.js.map → chunk-D75KSI3V.js.map} +0 -0
  231. /package/dist/{chunk-SQYHPBFP.js.map → chunk-EGNUOALL.js.map} +0 -0
  232. /package/dist/{chunk-ZAXRQLK3.js.map → chunk-FTYWGQFM.js.map} +0 -0
  233. /package/dist/{chunk-LE2NOUTN.js.map → chunk-FV4KXBGO.js.map} +0 -0
  234. /package/dist/{chunk-QNHZM5ZV.js.map → chunk-HIGWKLQR.js.map} +0 -0
  235. /package/dist/{chunk-VMZG66UV.js.map → chunk-HKEXRZMU.js.map} +0 -0
  236. /package/dist/{chunk-V4STTBQD.js.map → chunk-IHSA7VGI.js.map} +0 -0
  237. /package/dist/{chunk-TEJAGQX2.js.map → chunk-IS46GQRA.js.map} +0 -0
  238. /package/dist/{chunk-VNYWBHKR.js.map → chunk-JD3K2344.js.map} +0 -0
  239. /package/dist/{chunk-NCPZYQ4B.js.map → chunk-K3QGG4O2.js.map} +0 -0
  240. /package/dist/{chunk-NH3QZYE5.js.map → chunk-KV4NU3RP.js.map} +0 -0
  241. /package/dist/{chunk-NDSGJZI2.js.map → chunk-LOAYWTJJ.js.map} +0 -0
  242. /package/dist/{chunk-GMDSYLI6.js.map → chunk-MY2Q3FJ3.js.map} +0 -0
  243. /package/dist/{chunk-CV47VCMQ.js.map → chunk-NPVA65KS.js.map} +0 -0
  244. /package/dist/{chunk-7OCGBJLR.js.map → chunk-OIVFHJOA.js.map} +0 -0
  245. /package/dist/{chunk-NN5RYWXA.js.map → chunk-PH65MFQM.js.map} +0 -0
  246. /package/dist/{chunk-TZNNJLGT.js.map → chunk-PMB6TYV4.js.map} +0 -0
  247. /package/dist/{chunk-6YVJVUR4.js.map → chunk-QF2DROQR.js.map} +0 -0
  248. /package/dist/{chunk-XXFSOVL3.js.map → chunk-QFDM23CO.js.map} +0 -0
  249. /package/dist/{chunk-RMLADZRY.js.map → chunk-R7DGN73N.js.map} +0 -0
  250. /package/dist/{chunk-5PNZBH6V.js.map → chunk-V5IYLWRA.js.map} +0 -0
  251. /package/dist/{chunk-KQFIGI37.js.map → chunk-VA6CWUAE.js.map} +0 -0
  252. /package/dist/{chunk-YETJNRQM.js.map → chunk-WEBMMJKL.js.map} +0 -0
  253. /package/dist/{chunk-UDCI3QTS.js.map → chunk-ZM2AYHMO.js.map} +0 -0
  254. /package/dist/{git-BXUD6CL5.js.map → claude-ACL7G4CF.js.map} +0 -0
  255. /package/dist/{ignite-IO4LXVXJ.js.map → color-AC6F2QE7.js.map} +0 -0
  256. /package/dist/{commit-DC2Q5CDY.js.map → commit-RILBXFWO.js.map} +0 -0
  257. /package/dist/{compile-4NCQECKE.js.map → compile-QEL5724K.js.map} +0 -0
  258. /package/dist/{installation-detector-HF6QN7KP.js.map → darwin-5K3I4FTH.js.map} +0 -0
  259. /package/dist/{feedback-BMAZGKRW.js.map → feedback-I6ZEHEUB.js.map} +0 -0
  260. /package/dist/{mcp/darwin-3JFFE3W2.js.map → git-I3PO6FY7.js.map} +0 -0
  261. /package/dist/{neon-helpers-HWIYRKOW.js.map → ignite-XZFYRVRJ.js.map} +0 -0
  262. /package/dist/{init-CI43GJHV.js.map → init-A6WRP77L.js.map} +0 -0
  263. /package/dist/{install-deps-SRTM5U7D.js.map → install-deps-HXP2TM7G.js.map} +0 -0
  264. /package/dist/{prompt-7LZB4PAT.js.map → installation-detector-PYAZ2O6U.js.map} +0 -0
  265. /package/dist/{lint-BSWRMGPZ.js.map → lint-FDZC77GL.js.map} +0 -0
  266. /package/dist/{linux-RYLOP2LY.js.map → linux-WUGRYCJY.js.map} +0 -0
  267. /package/dist/{remote-MZTFHHTU.js.map → mcp/darwin-U25WIGH6.js.map} +0 -0
  268. /package/dist/mcp/{linux-JBVS4R3A.js.map → linux-5BXVBGSY.js.map} +0 -0
  269. /package/dist/mcp/{tmux-RYBLEHUZ.js.map → tmux-CU26ZTNM.js.map} +0 -0
  270. /package/dist/mcp/{wsl-4QZIQLLE.js.map → wsl-KI25UDOF.js.map} +0 -0
  271. /package/dist/{update-notifier-EYLAXZAA.js.map → neon-helpers-LCZAN4U4.js.map} +0 -0
  272. /package/dist/{projects-IUSUXD5D.js.map → projects-L5AHUBGA.js.map} +0 -0
  273. /package/dist/{rebase-S6OHAOOF.js.map → rebase-JA3RW2XO.js.map} +0 -0
  274. /package/dist/{recap-GGVCG5VH.js.map → recap-5TO42HN2.js.map} +0 -0
  275. /package/dist/{shell-W4SBQPTE.js.map → shell-GAB2FCXH.js.map} +0 -0
  276. /package/dist/{test-6JH4FE2X.js.map → test-6LFB5WOO.js.map} +0 -0
  277. /package/dist/{test-git-2KFFAQ6B.js.map → test-git-PYJOYSED.js.map} +0 -0
  278. /package/dist/{test-jira-FKDKG6CD.js.map → test-jira-SM7IU5HW.js.map} +0 -0
  279. /package/dist/{test-prefix-GP2DAX37.js.map → test-prefix-HIRZBXTM.js.map} +0 -0
  280. /package/dist/{test-tabs-YDWMWTVA.js.map → test-tabs-NGPTFD5T.js.map} +0 -0
  281. /package/dist/{test-webserver-QI3QQFZ3.js.map → test-webserver-43PVP2JL.js.map} +0 -0
  282. /package/dist/{tmux-7ZTA3BDI.js.map → tmux-6LRFH3DM.js.map} +0 -0
  283. /package/dist/{update-XLW7R7FL.js.map → update-AD3GE5C4.js.map} +0 -0
  284. /package/dist/{vscode-TOGE5N67.js.map → vscode-HXIXRZ3A.js.map} +0 -0
  285. /package/dist/{vscode-announcement-NIX7O2MG.js.map → vscode-announcement-AL3EHORH.js.map} +0 -0
  286. /package/dist/{wsl-Y4GUTOQ7.js.map → wsl-4VMVT2PO.js.map} +0 -0
@@ -2,10 +2,19 @@
2
2
  import {
3
3
  buildDependencyMap,
4
4
  fetchChildIssueDetails
5
- } from "./chunk-TZNNJLGT.js";
5
+ } from "./chunk-PMB6TYV4.js";
6
6
  import {
7
7
  preAcceptClaudeTrust
8
- } from "./chunk-NOMQ5RFG.js";
8
+ } from "./chunk-7UBEHQTP.js";
9
+ import {
10
+ getWorkspacePort
11
+ } from "./chunk-BFF27W3S.js";
12
+ import {
13
+ TelemetryService
14
+ } from "./chunk-MY2Q3FJ3.js";
15
+ import {
16
+ FirstRunManager
17
+ } from "./chunk-EGNUOALL.js";
9
18
  import {
10
19
  generateAndWriteMcpConfigFile,
11
20
  generateIssueManagementMcpConfig,
@@ -13,62 +22,53 @@ import {
13
22
  readRecapFile,
14
23
  resolveRecapFilePath,
15
24
  writeRecapFile
16
- } from "./chunk-5UFGO4ZT.js";
25
+ } from "./chunk-CQHHEW2M.js";
17
26
  import {
18
- IssueManagementProviderFactory
19
- } from "./chunk-RMLADZRY.js";
27
+ AgentManager
28
+ } from "./chunk-JD3K2344.js";
20
29
  import {
21
- getWorkspacePort
22
- } from "./chunk-HLDY5S4C.js";
30
+ IssueManagementProviderFactory
31
+ } from "./chunk-R7DGN73N.js";
23
32
  import {
24
33
  installDependencies
25
- } from "./chunk-3GTUXW26.js";
26
- import {
27
- extractSettingsOverrides
28
- } from "./chunk-GYCR2LOU.js";
29
- import {
30
- TelemetryService
31
- } from "./chunk-GMDSYLI6.js";
34
+ } from "./chunk-VIQOQ463.js";
32
35
  import {
33
- FirstRunManager
34
- } from "./chunk-SQYHPBFP.js";
36
+ GitWorktreeManager
37
+ } from "./chunk-FV4KXBGO.js";
35
38
  import {
36
- AgentManager
37
- } from "./chunk-VNYWBHKR.js";
39
+ PromptTemplateManager,
40
+ buildReviewTemplateVariables
41
+ } from "./chunk-7RCUWU3I.js";
38
42
  import {
39
- GitWorktreeManager
40
- } from "./chunk-LE2NOUTN.js";
43
+ extractSettingsOverrides
44
+ } from "./chunk-GYCR2LOU.js";
41
45
  import {
42
46
  IssueTrackerFactory
43
- } from "./chunk-UHIBKD73.js";
47
+ } from "./chunk-35CBWAJL.js";
44
48
  import {
45
49
  launchClaude
46
- } from "./chunk-Y3RX7LZT.js";
47
- import {
48
- PromptTemplateManager,
49
- buildReviewTemplateVariables
50
- } from "./chunk-WG4MLJ6J.js";
50
+ } from "./chunk-DDHWZNGL.js";
51
51
  import {
52
52
  extractIssueNumber,
53
53
  findMainWorktreePathWithSettings,
54
54
  generateWorktreePath,
55
55
  getWorktreeRoot,
56
56
  isValidGitRepo
57
- } from "./chunk-3RXYOBME.js";
57
+ } from "./chunk-OPQC4OWM.js";
58
58
  import {
59
59
  SettingsManager
60
- } from "./chunk-ET6A2JR4.js";
60
+ } from "./chunk-653XBU3L.js";
61
61
  import {
62
62
  MetadataManager
63
- } from "./chunk-YRCEOQPX.js";
63
+ } from "./chunk-4JZEQBWV.js";
64
64
  import {
65
65
  getLogger,
66
66
  withLogger
67
- } from "./chunk-ZAXRQLK3.js";
67
+ } from "./chunk-FTYWGQFM.js";
68
68
  import {
69
69
  createStderrLogger,
70
70
  logger
71
- } from "./chunk-H2SSF24U.js";
71
+ } from "./chunk-VRPPI6GU.js";
72
72
 
73
73
  // src/commands/ignite.ts
74
74
  import path5 from "path";
@@ -419,20 +419,27 @@ var SwarmSetupService = class {
419
419
  }));
420
420
  }
421
421
  /**
422
- * Render swarm-mode agent templates to the epic worktree's .claude/agents/ directory.
422
+ * Render swarm-mode agent templates as custom agent files AND thin skill wrappers.
423
+ *
424
+ * For each phase agent, two files are written:
425
+ * 1. Agent file at `.claude/agents/iloom-swarm-<phase>.md` - contains frontmatter
426
+ * (name, description, model) and the full agent prompt as body.
427
+ * 2. Thin skill wrapper at `.claude/skills/iloom-swarm-<phase>/SKILL.md` - contains
428
+ * frontmatter with `agent: iloom-swarm-<phase>` and a minimal body.
423
429
  *
424
- * Phase agent files are written WITHOUT frontmatter (prompt body only) because they are
425
- * loaded via `--append-system-prompt-file` which does not parse YAML frontmatter.
426
- * Model and tools metadata is extracted from the agent config and returned separately
427
- * for use as CLI flags in `claude -p` commands.
430
+ * Skills are auto-discovered by Claude Code and invoked via /skill-name syntax.
431
+ * The agent file carries the real prompt; the skill just delegates to it.
428
432
  */
429
433
  async renderSwarmAgents(epicWorktreePath) {
430
434
  var _a, _b;
435
+ const claudeSkillsDir = path2.join(epicWorktreePath, ".claude", "skills");
431
436
  const claudeAgentsDir = path2.join(epicWorktreePath, ".claude", "agents");
437
+ await fs2.ensureDir(claudeSkillsDir);
432
438
  await fs2.ensureDir(claudeAgentsDir);
433
439
  const settings = await this.settingsManager.loadSettings();
434
440
  const templateVariables = {
435
- SWARM_MODE: true
441
+ SWARM_MODE: true,
442
+ EPIC_WORKTREE_PATH: epicWorktreePath
436
443
  };
437
444
  const agents = await this.agentManager.loadAgents(settings, templateVariables);
438
445
  const defaultSwarmModels = {
@@ -452,22 +459,49 @@ var SwarmSetupService = class {
452
459
  agents[agentName] = { ...agentConfig, model: defaultSwarmModels[agentName] };
453
460
  }
454
461
  }
455
- const renderedFiles = [];
456
- const metadata = {};
462
+ const renderedSkills = [];
463
+ const renderedAgents = [];
464
+ const standaloneAgents = /* @__PURE__ */ new Set(["iloom-wave-verifier"]);
457
465
  for (const [agentName, agentConfig] of Object.entries(agents)) {
458
- const swarmFileName = agentName.startsWith("iloom-") ? `iloom-swarm-${agentName.slice("iloom-".length)}.md` : `iloom-swarm-${agentName}.md`;
459
- const agentKey = swarmFileName.replace(".md", "");
460
- metadata[agentKey] = {
461
- model: agentConfig.model,
462
- ...agentConfig.tools && { tools: agentConfig.tools }
463
- };
464
- const outputPath = path2.join(claudeAgentsDir, swarmFileName);
465
- await fs2.writeFile(outputPath, agentConfig.prompt + "\n", "utf-8");
466
- renderedFiles.push(swarmFileName);
467
- getLogger().debug(`Rendered swarm agent: ${swarmFileName}`);
466
+ if (standaloneAgents.has(agentName)) {
467
+ continue;
468
+ }
469
+ const swarmName = agentName.startsWith("iloom-") ? `iloom-swarm-${agentName.slice("iloom-".length)}` : `iloom-swarm-${agentName}`;
470
+ const agentFrontmatter = [
471
+ "---",
472
+ `name: ${swarmName}`,
473
+ `description: ${agentConfig.description}`,
474
+ `model: ${agentConfig.model}`,
475
+ "---"
476
+ ].join("\n");
477
+ const agentContent = `${agentFrontmatter}
478
+
479
+ ${agentConfig.prompt}
480
+ `;
481
+ await fs2.writeFile(path2.join(claudeAgentsDir, `${swarmName}.md`), agentContent, "utf-8");
482
+ renderedAgents.push(swarmName);
483
+ getLogger().debug(`Rendered swarm agent: ${swarmName}`);
484
+ const skillDir = path2.join(claudeSkillsDir, swarmName);
485
+ await fs2.ensureDir(skillDir);
486
+ const skillFrontmatter = [
487
+ "---",
488
+ `name: ${swarmName}`,
489
+ `description: ${agentConfig.description}`,
490
+ `model: ${agentConfig.model}`,
491
+ "context: fork",
492
+ `agent: ${swarmName}`,
493
+ "---"
494
+ ].join("\n");
495
+ const skillContent = `${skillFrontmatter}
496
+
497
+ Proceed via your system prompt.
498
+ `;
499
+ await fs2.writeFile(path2.join(skillDir, "SKILL.md"), skillContent, "utf-8");
500
+ renderedSkills.push(swarmName);
501
+ getLogger().debug(`Rendered swarm skill wrapper: ${swarmName}`);
468
502
  }
469
- getLogger().success(`Rendered ${renderedFiles.length} swarm agents to ${claudeAgentsDir}`);
470
- return { renderedFiles, metadata };
503
+ getLogger().success(`Rendered ${renderedAgents.length} swarm agents and ${renderedSkills.length} skill wrappers`);
504
+ return { renderedSkills, renderedAgents };
471
505
  }
472
506
  /**
473
507
  * Render the swarm worker agent file to the epic worktree's .claude/agents/ directory.
@@ -481,8 +515,8 @@ var SwarmSetupService = class {
481
515
  * The agent file is shared across all children. Issue-specific context (number, title,
482
516
  * worktree path, body) is provided per-child via the Task prompt from the orchestrator.
483
517
  */
484
- async renderSwarmWorkerAgent(epicWorktreePath, agentMetadata) {
485
- var _a, _b, _c, _d, _e;
518
+ async renderSwarmWorkerAgent(epicWorktreePath) {
519
+ var _a, _b, _c;
486
520
  const agentsDir = path2.join(epicWorktreePath, ".claude", "agents");
487
521
  const agentOutputPath = path2.join(agentsDir, "iloom-swarm-worker.md");
488
522
  await fs2.ensureDir(agentsDir);
@@ -490,20 +524,16 @@ var SwarmSetupService = class {
490
524
  const settings = await this.settingsManager.loadSettings();
491
525
  const providerType = ((_a = settings == null ? void 0 : settings.issueManagement) == null ? void 0 : _a.provider) ?? "github";
492
526
  const issuePrefix = IssueManagementProviderFactory.create(providerType, settings ?? void 0).issuePrefix;
493
- const subAgentTimeoutMinutes = ((_c = (_b = settings == null ? void 0 : settings.agents) == null ? void 0 : _b["iloom-swarm-worker"]) == null ? void 0 : _c.subAgentTimeout) ?? 10;
494
- const subAgentTimeoutMs = subAgentTimeoutMinutes * 60 * 1e3;
495
527
  const variables = {
496
528
  SWARM_MODE: true,
497
529
  ONE_SHOT_MODE: true,
498
530
  COMPLEXITY_OVERRIDE: "simple",
499
531
  EPIC_WORKTREE_PATH: epicWorktreePath,
500
532
  ISSUE_PREFIX: issuePrefix,
501
- SWARM_SUB_AGENT_TIMEOUT_MS: subAgentTimeoutMs,
502
- ...agentMetadata && { SWARM_AGENT_METADATA: JSON.stringify(agentMetadata) },
503
533
  ...buildReviewTemplateVariables(true, settings == null ? void 0 : settings.agents)
504
534
  };
505
535
  const agentBody = await this.templateManager.getPrompt("issue", variables);
506
- const workerModel = ((_e = (_d = settings == null ? void 0 : settings.agents) == null ? void 0 : _d["iloom-swarm-worker"]) == null ? void 0 : _e.model) ?? "opus";
536
+ const workerModel = ((_c = (_b = settings == null ? void 0 : settings.agents) == null ? void 0 : _b["iloom-swarm-worker"]) == null ? void 0 : _c.model) ?? "sonnet";
507
537
  const frontmatter = [
508
538
  "---",
509
539
  "name: iloom-swarm-worker",
@@ -526,64 +556,108 @@ ${agentBody}
526
556
  }
527
557
  }
528
558
  /**
529
- * Copy .claude/agents/ from the epic worktree to each child worktree.
559
+ * Render the wave verifier agent file to the epic worktree's .claude/agents/ directory.
530
560
  *
531
- * Child workers need local access to agent files (used via --append-system-prompt-file).
532
- * Without this copy, child worktrees lack the rendered agent files since they only
533
- * exist in the epic worktree after renderSwarmAgents/renderSwarmWorkerAgent.
561
+ * This creates an agent file at `.claude/agents/iloom-swarm-wave-verifier.md` WITH frontmatter,
562
+ * making it available as a custom agent type via `subagent_type: "iloom-swarm-wave-verifier"`.
563
+ * Unlike phase agents (which are appended as system prompts), the wave verifier is a standalone
564
+ * agent that the orchestrator spawns directly for verification child issues.
534
565
  */
535
- async copyAgentsToChildWorktrees(epicWorktreePath, childWorktrees) {
536
- const sourceDir = path2.join(epicWorktreePath, ".claude", "agents");
537
- if (!await fs2.pathExists(sourceDir)) {
538
- getLogger().warn("No .claude/agents/ directory in epic worktree to copy");
566
+ async renderSwarmWaveVerifierAgent(epicWorktreePath) {
567
+ var _a, _b;
568
+ const agentsDir = path2.join(epicWorktreePath, ".claude", "agents");
569
+ const agentOutputPath = path2.join(agentsDir, "iloom-swarm-wave-verifier.md");
570
+ await fs2.ensureDir(agentsDir);
571
+ try {
572
+ const settings = await this.settingsManager.loadSettings();
573
+ const templateVariables = {
574
+ SWARM_MODE: true,
575
+ EPIC_WORKTREE_PATH: epicWorktreePath
576
+ };
577
+ const agents = await this.agentManager.loadAgents(settings, templateVariables, ["iloom-wave-verifier.md"]);
578
+ const verifierConfig = agents["iloom-wave-verifier"];
579
+ if (!verifierConfig) {
580
+ getLogger().debug("No wave verifier agent template found \u2014 skipping");
581
+ return false;
582
+ }
583
+ const verifierModel = ((_b = (_a = settings == null ? void 0 : settings.agents) == null ? void 0 : _a["iloom-wave-verifier"]) == null ? void 0 : _b.model) ?? verifierConfig.model ?? "sonnet";
584
+ const frontmatter = [
585
+ "---",
586
+ "name: iloom-swarm-wave-verifier",
587
+ `description: ${verifierConfig.description ?? "Wave verification agent that checks must-have criteria after each swarm wave."}`,
588
+ `model: ${verifierModel}`,
589
+ ...verifierConfig.tools ? [`tools: ${verifierConfig.tools.join(", ")}`] : [],
590
+ "---"
591
+ ].join("\n");
592
+ const content = `${frontmatter}
593
+
594
+ ${verifierConfig.prompt}
595
+ `;
596
+ await fs2.writeFile(agentOutputPath, content, "utf-8");
597
+ getLogger().success(`Rendered wave verifier agent to ${agentOutputPath}`);
598
+ return true;
599
+ } catch (error) {
600
+ getLogger().warn(
601
+ `Failed to render wave verifier agent: ${error instanceof Error ? error.message : "Unknown error"}`
602
+ );
603
+ return false;
604
+ }
605
+ }
606
+ /**
607
+ * Copy .claude/agents/ and .claude/skills/ from the epic worktree to each child worktree.
608
+ *
609
+ * Child workers need local access to agent files (used as custom agent types) and
610
+ * skill files (invoked via /skill-name). Without this copy, child worktrees lack
611
+ * the rendered files since they only exist in the epic worktree after rendering.
612
+ */
613
+ async copyAgentsAndSkillsToChildWorktrees(epicWorktreePath, childWorktrees) {
614
+ const agentsSourceDir = path2.join(epicWorktreePath, ".claude", "agents");
615
+ const skillsSourceDir = path2.join(epicWorktreePath, ".claude", "skills");
616
+ const agentsExist = await fs2.pathExists(agentsSourceDir);
617
+ const skillsExist = await fs2.pathExists(skillsSourceDir);
618
+ if (!agentsExist && !skillsExist) {
619
+ getLogger().warn("No .claude/agents/ or .claude/skills/ directory in epic worktree to copy");
539
620
  return;
540
621
  }
541
622
  const successfulChildren = childWorktrees.filter((c) => c.success);
542
623
  await Promise.all(successfulChildren.map(async (child) => {
543
624
  try {
544
- const targetDir = path2.join(child.worktreePath, ".claude", "agents");
545
- await fs2.copy(sourceDir, targetDir, { overwrite: true });
546
- getLogger().debug(`Copied .claude/agents/ to ${child.worktreePath}`);
625
+ if (agentsExist) {
626
+ const targetAgentsDir = path2.join(child.worktreePath, ".claude", "agents");
627
+ await fs2.copy(agentsSourceDir, targetAgentsDir, { overwrite: true });
628
+ getLogger().debug(`Copied .claude/agents/ to ${child.worktreePath}`);
629
+ }
630
+ if (skillsExist) {
631
+ const targetSkillsDir = path2.join(child.worktreePath, ".claude", "skills");
632
+ await fs2.copy(skillsSourceDir, targetSkillsDir, { overwrite: true });
633
+ getLogger().debug(`Copied .claude/skills/ to ${child.worktreePath}`);
634
+ }
547
635
  } catch (error) {
548
636
  getLogger().warn(
549
- `Failed to copy agents to child worktree ${child.issueId}: ${error instanceof Error ? error.message : "Unknown error"}`
637
+ `Failed to copy agents/skills to child worktree ${child.issueId}: ${error instanceof Error ? error.message : "Unknown error"}`
550
638
  );
551
639
  }
552
640
  }));
553
- getLogger().success(`Copied agents to ${successfulChildren.length} child worktrees`);
641
+ getLogger().success(`Copied agents and skills to ${successfulChildren.length} child worktrees`);
554
642
  }
555
643
  /**
556
- * Run the full swarm setup: child worktrees, agents, and worker agent.
644
+ * Run the full swarm setup: render agents, worker agent, and wave verifier.
557
645
  *
558
646
  * The epic worktree already exists (created by `il start`).
647
+ * Child worktrees are created on-the-fly by the orchestrator as issues become unblocked.
559
648
  */
560
- async setupSwarm(epicIssueNumber, epicBranch, epicWorktreePath, childIssues, mainWorktreePath, issueTrackerName, settings) {
561
- const childWorktrees = await this.createChildWorktrees(
562
- childIssues,
563
- epicBranch,
564
- epicWorktreePath,
565
- mainWorktreePath,
566
- epicIssueNumber,
567
- issueTrackerName,
568
- settings
569
- );
570
- const { renderedFiles: agentsRendered, metadata: agentMetadata } = await this.renderSwarmAgents(epicWorktreePath);
571
- const workerAgentRendered = await this.renderSwarmWorkerAgent(
572
- epicWorktreePath,
573
- agentMetadata
574
- );
575
- await this.copyAgentsToChildWorktrees(epicWorktreePath, childWorktrees);
576
- const successCount = childWorktrees.filter((c) => c.success).length;
577
- const failCount = childWorktrees.filter((c) => !c.success).length;
578
- getLogger().success(
579
- `Swarm setup complete: ${successCount} child worktrees` + (failCount > 0 ? ` (${failCount} failed)` : "")
580
- );
649
+ async setupSwarm(epicBranch, epicWorktreePath) {
650
+ const { renderedSkills: skillsRendered, renderedAgents } = await this.renderSwarmAgents(epicWorktreePath);
651
+ const workerAgentRendered = await this.renderSwarmWorkerAgent(epicWorktreePath);
652
+ const verifierAgentRendered = await this.renderSwarmWaveVerifierAgent(epicWorktreePath);
653
+ getLogger().success("Swarm setup complete: agents and skills rendered");
581
654
  return {
582
655
  epicWorktreePath,
583
656
  epicBranch,
584
- childWorktrees,
585
- agentsRendered,
586
- workerAgentRendered
657
+ skillsRendered,
658
+ renderedAgents,
659
+ workerAgentRendered,
660
+ verifierAgentRendered
587
661
  };
588
662
  }
589
663
  };
@@ -635,47 +709,14 @@ async function detectProjectLanguage(projectPath) {
635
709
 
636
710
  // src/utils/system-prompt-writer.ts
637
711
  import path4 from "path";
712
+ import os2 from "os";
713
+ import crypto from "crypto";
638
714
  import fs4 from "fs-extra";
639
- async function prepareSystemPromptForPlatform(systemPrompt, workspacePath, platform = process.platform) {
640
- if (platform === "darwin" || platform === "linux") {
641
- return { appendSystemPrompt: systemPrompt };
642
- }
643
- const claudeDir = path4.join(workspacePath, ".claude");
644
- const promptFilePath = path4.join(claudeDir, "iloom-system-prompt.md");
645
- const pluginDir = path4.join(claudeDir, "iloom-plugin");
646
- await fs4.ensureDir(claudeDir);
715
+ async function prepareSystemPromptForPlatform(systemPrompt, workspacePath) {
716
+ const hash = crypto.createHash("sha256").update(workspacePath).digest("hex").slice(0, 12);
717
+ const promptFilePath = path4.join(os2.tmpdir(), `iloom-system-prompt-${hash}.md`);
647
718
  await fs4.writeFile(promptFilePath, systemPrompt, "utf-8");
648
- await createSessionStartPlugin(pluginDir, promptFilePath);
649
- return {
650
- pluginDir,
651
- initialPromptOverride: "/clear"
652
- };
653
- }
654
- async function createSessionStartPlugin(pluginDir, promptFilePath) {
655
- await fs4.ensureDir(pluginDir);
656
- const runnerScript = `process.stdout.write(require('fs').readFileSync(${JSON.stringify(promptFilePath)}, 'utf-8'));`;
657
- await fs4.writeFile(path4.join(pluginDir, "runner.js"), runnerScript, "utf-8");
658
- const portableRunnerPath = path4.join(pluginDir, "runner.js").replace(/\\/g, "/");
659
- const hooksConfig = {
660
- hooks: {
661
- SessionStart: [
662
- {
663
- matcher: "*",
664
- hooks: [
665
- {
666
- type: "command",
667
- command: `node "${portableRunnerPath}"`
668
- }
669
- ]
670
- }
671
- ]
672
- }
673
- };
674
- await fs4.writeFile(
675
- path4.join(pluginDir, "hooks.json"),
676
- JSON.stringify(hooksConfig, null, 2),
677
- "utf-8"
678
- );
719
+ return { appendSystemPromptFile: promptFilePath };
679
720
  }
680
721
 
681
722
  // src/commands/ignite.ts
@@ -991,11 +1032,9 @@ var IgniteCommand = class {
991
1032
  systemInstructions,
992
1033
  context.workspacePath
993
1034
  );
994
- const effectiveUserPrompt = systemPromptConfig.initialPromptOverride ?? userPrompt;
995
- const claudeResult = await launchClaude(effectiveUserPrompt, {
1035
+ const claudeResult = await launchClaude(userPrompt, {
996
1036
  ...claudeOptions,
997
- ...systemPromptConfig.appendSystemPrompt && { appendSystemPrompt: systemPromptConfig.appendSystemPrompt },
998
- ...systemPromptConfig.pluginDir && { pluginDir: systemPromptConfig.pluginDir },
1037
+ appendSystemPromptFile: systemPromptConfig.appendSystemPromptFile,
999
1038
  ...mcpConfig && { mcpConfig },
1000
1039
  ...allowedTools && { allowedTools },
1001
1040
  ...disallowedTools && { disallowedTools },
@@ -1316,6 +1355,9 @@ var IgniteCommand = class {
1316
1355
  const finishedMetadata = await metadataManager.listFinishedMetadata();
1317
1356
  const finishedByIssueNumber = /* @__PURE__ */ new Map();
1318
1357
  for (const meta of finishedMetadata) {
1358
+ if (meta.projectPath && meta.projectPath !== mainWorktreePath) {
1359
+ continue;
1360
+ }
1319
1361
  for (const issueNum of meta.issue_numbers) {
1320
1362
  if (!finishedByIssueNumber.has(issueNum)) {
1321
1363
  finishedByIssueNumber.set(issueNum, meta);
@@ -1341,33 +1383,65 @@ var IgniteCommand = class {
1341
1383
  logger.info(`Skipping child ${skipped.number} (state: ${skipped.state})`);
1342
1384
  }
1343
1385
  }
1344
- const swarmResult = await swarmSetup.setupSwarm(
1345
- epicIssueNumber,
1386
+ await swarmSetup.setupSwarm(
1346
1387
  epicBranch,
1347
- epicWorktreePath,
1348
- pendingChildIssues,
1349
- mainWorktreePath,
1350
- providerName,
1351
- settings
1388
+ epicWorktreePath
1352
1389
  );
1353
- const successfulWorktrees = swarmResult.childWorktrees.filter((c) => c.success);
1354
- const worktreeMap = new Map(successfulWorktrees.map((cw) => [cw.issueId, cw]));
1355
- const childIssuesData = pendingChildIssues.filter((ci) => worktreeMap.has(ci.number.replace(/^#/, ""))).map((ci) => {
1390
+ const childIssuesData = pendingChildIssues.map((ci) => {
1356
1391
  const rawId = ci.number.replace(/^#/, "");
1357
- const wt = worktreeMap.get(rawId);
1392
+ const safeId = rawId.replace(/[^a-zA-Z0-9-_]/g, "-");
1393
+ const branchName = `issue/${safeId}`;
1394
+ const worktreePath = generateWorktreePath(branchName, mainWorktreePath);
1358
1395
  return {
1359
1396
  number: rawId,
1360
1397
  title: ci.title,
1361
1398
  body: ci.body,
1362
- worktreePath: (wt == null ? void 0 : wt.worktreePath) ?? "",
1363
- branchName: (wt == null ? void 0 : wt.branch) ?? ""
1399
+ worktreePath,
1400
+ branchName
1364
1401
  };
1365
1402
  });
1403
+ for (const child of childIssuesData) {
1404
+ try {
1405
+ await metadataManager.writeMetadata(child.worktreePath, {
1406
+ description: child.title,
1407
+ branchName: child.branchName,
1408
+ worktreePath: child.worktreePath,
1409
+ issueType: "issue",
1410
+ issue_numbers: [child.number],
1411
+ pr_numbers: [],
1412
+ issueTracker: metadata.issueTracker ?? "github",
1413
+ colorHex: "#808080",
1414
+ sessionId: "",
1415
+ projectPath: mainWorktreePath,
1416
+ issueUrls: {},
1417
+ prUrls: {},
1418
+ capabilities: [],
1419
+ state: "pending",
1420
+ parentLoom: {
1421
+ type: "epic",
1422
+ identifier: epicIssueNumber,
1423
+ branchName: epicBranch,
1424
+ worktreePath: epicWorktreePath
1425
+ }
1426
+ });
1427
+ const recapFilePath = resolveRecapFilePath(child.worktreePath);
1428
+ await writeRecapFile(recapFilePath, { goal: child.title });
1429
+ } catch (error) {
1430
+ logger.warn(`Failed to pre-create metadata/recap for child #${child.number}: ${error instanceof Error ? error.message : "Unknown error"}`);
1431
+ }
1432
+ }
1366
1433
  const epicMetadataPath = metadataManager.getMetadataFilePath(epicWorktreePath);
1367
1434
  const issuePrefix = providerName === "github" ? "#" : "";
1368
1435
  const postSwarmReview = ((_a = settings.spin) == null ? void 0 : _a.postSwarmReview) !== false;
1436
+ let swarmTeamName = metadata.swarmTeamName;
1437
+ if (!swarmTeamName) {
1438
+ const projectSlug = path5.basename(mainWorktreePath).replace(/[^a-zA-Z0-9_-]/g, "-");
1439
+ swarmTeamName = `swarm-${projectSlug}-${epicIssueNumber}-${Date.now()}`;
1440
+ await metadataManager.updateMetadata(epicWorktreePath, { swarmTeamName });
1441
+ }
1369
1442
  const variables = {
1370
1443
  EPIC_ISSUE_NUMBER: epicIssueNumber,
1444
+ SWARM_TEAM_NAME: swarmTeamName,
1371
1445
  EPIC_WORKTREE_PATH: epicWorktreePath,
1372
1446
  EPIC_METADATA_PATH: epicMetadataPath,
1373
1447
  CHILD_ISSUES: JSON.stringify(childIssuesData, null, 2),
@@ -1414,7 +1488,7 @@ var IgniteCommand = class {
1414
1488
  logger.info(` Model: ${model ?? "default"}`);
1415
1489
  logger.info(` Permission mode: bypassPermissions`);
1416
1490
  logger.info(` Agent teams: enabled`);
1417
- logger.info(` Child worktrees: ${successfulWorktrees.length}`);
1491
+ logger.info(` Pending child issues: ${pendingChildIssues.length}`);
1418
1492
  let agents;
1419
1493
  try {
1420
1494
  const loadedAgents = await this.agentManager.loadAgents(
@@ -1434,7 +1508,7 @@ var IgniteCommand = class {
1434
1508
  const swarmStartTime = Date.now();
1435
1509
  try {
1436
1510
  TelemetryService.getInstance().track("swarm.started", {
1437
- child_count: successfulWorktrees.length,
1511
+ child_count: pendingChildIssues.length,
1438
1512
  tracker: providerName
1439
1513
  });
1440
1514
  } catch (error) {
@@ -1444,7 +1518,7 @@ var IgniteCommand = class {
1444
1518
  orchestratorPrompt,
1445
1519
  epicWorktreePath
1446
1520
  );
1447
- const effectiveSwarmPrompt = orchestratorPromptConfig.initialPromptOverride ?? `You are the swarm orchestrator for epic #${epicIssueNumber}. Begin by reading your system prompt instructions and executing the workflow.`;
1521
+ const swarmUserPrompt = `You are the swarm orchestrator for epic #${epicIssueNumber}. Begin by reading your system prompt instructions and executing the workflow.`;
1448
1522
  process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = "1";
1449
1523
  process.env.ILOOM_SWARM = "1";
1450
1524
  process.env.ENABLE_TOOL_SEARCH = "auto:30";
@@ -1452,14 +1526,13 @@ var IgniteCommand = class {
1452
1526
  process.env.CLAUDE_CODE_DISABLE_AUTO_MEMORY = "1";
1453
1527
  process.env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = "1";
1454
1528
  process.env.CLAUDE_CODE_EFFORT_LEVEL = "medium";
1455
- await launchClaude(effectiveSwarmPrompt, {
1529
+ await launchClaude(swarmUserPrompt, {
1456
1530
  model,
1457
1531
  permissionMode: "bypassPermissions",
1458
1532
  addDir: epicWorktreePath,
1459
1533
  headless: false,
1460
1534
  ...metadata.sessionId && { sessionId: metadata.sessionId },
1461
- ...orchestratorPromptConfig.appendSystemPrompt && { appendSystemPrompt: orchestratorPromptConfig.appendSystemPrompt },
1462
- ...orchestratorPromptConfig.pluginDir && { pluginDir: orchestratorPromptConfig.pluginDir },
1535
+ appendSystemPromptFile: orchestratorPromptConfig.appendSystemPromptFile,
1463
1536
  mcpConfig: mcpConfigs,
1464
1537
  allowedTools,
1465
1538
  ...agents && { agents }
@@ -1468,8 +1541,12 @@ var IgniteCommand = class {
1468
1541
  const swarmEndTime = Date.now();
1469
1542
  let succeeded = 0;
1470
1543
  let failed = 0;
1471
- for (const child of successfulWorktrees) {
1472
- const childMeta = await metadataManager.readMetadata(child.worktreePath);
1544
+ for (const child of pendingChildIssues) {
1545
+ const rawId = child.number.replace(/^#/, "");
1546
+ const safeId = rawId.replace(/[^a-zA-Z0-9-_]/g, "-");
1547
+ const childBranch = `issue/${safeId}`;
1548
+ const childWorktreePath = generateWorktreePath(childBranch, mainWorktreePath);
1549
+ const childMeta = await metadataManager.readMetadata(childWorktreePath);
1473
1550
  const isSuccess = (childMeta == null ? void 0 : childMeta.state) === "done";
1474
1551
  if (isSuccess) {
1475
1552
  succeeded++;
@@ -1485,7 +1562,7 @@ var IgniteCommand = class {
1485
1562
  });
1486
1563
  }
1487
1564
  TelemetryService.getInstance().track("swarm.completed", {
1488
- total_children: successfulWorktrees.length,
1565
+ total_children: pendingChildIssues.length,
1489
1566
  succeeded,
1490
1567
  failed,
1491
1568
  duration_minutes: Math.round((swarmEndTime - swarmStartTime) / 6e4)
@@ -1557,4 +1634,4 @@ export {
1557
1634
  WorktreeValidationError,
1558
1635
  IgniteCommand
1559
1636
  };
1560
- //# sourceMappingURL=chunk-IR74O2F6.js.map
1637
+ //# sourceMappingURL=chunk-PDG74IJT.js.map