@iloom/cli 0.12.2 → 0.13.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 (165) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/{ClaudeContextManager-IENAE2CP.js → ClaudeContextManager-ZH6LEA5I.js} +5 -5
  4. package/dist/{ClaudeService-YIJCZUUB.js → ClaudeService-YR66WXZN.js} +4 -4
  5. package/dist/{IssueTrackerFactory-2OI7YIN6.js → IssueTrackerFactory-O2ZBA666.js} +3 -3
  6. package/dist/{LoomLauncher-3TSFW7QP.js → LoomLauncher-V54ENBEF.js} +5 -5
  7. package/dist/{MetadataManager-V4LSJ2PB.js → MetadataManager-HHE6LQF2.js} +2 -2
  8. package/dist/{PromptTemplateManager-I75WKXM4.js → PromptTemplateManager-4RFELNYY.js} +2 -2
  9. package/dist/README.md +1 -1
  10. package/dist/{SettingsManager-BMQCAXPP.js → SettingsManager-SLSYEYDZ.js} +4 -2
  11. package/dist/agents/iloom-artifact-reviewer.md +1 -0
  12. package/dist/agents/iloom-code-reviewer.md +21 -0
  13. package/dist/agents/iloom-issue-analyze-and-plan.md +30 -12
  14. package/dist/agents/iloom-issue-analyzer.md +32 -7
  15. package/dist/agents/iloom-issue-complexity-evaluator.md +32 -12
  16. package/dist/agents/iloom-issue-implementer.md +31 -12
  17. package/dist/agents/iloom-issue-planner.md +30 -12
  18. package/dist/agents/iloom-wave-verifier.md +126 -5
  19. package/dist/{build-PKHPE34Y.js → build-ZTGWDHWU.js} +8 -8
  20. package/dist/{chunk-GWJWECZB.js → chunk-55NTREIU.js} +25 -23
  21. package/dist/chunk-55NTREIU.js.map +1 -0
  22. package/dist/{chunk-AYLC633W.js → chunk-7TN5VW4I.js} +65 -7
  23. package/dist/chunk-7TN5VW4I.js.map +1 -0
  24. package/dist/{chunk-PMB6TYV4.js → chunk-C2BVNJW5.js} +2 -2
  25. package/dist/{chunk-QFDM23CO.js → chunk-E5OM25WK.js} +3 -3
  26. package/dist/{chunk-BFF27W3S.js → chunk-ERMEYFT6.js} +7 -2
  27. package/dist/chunk-ERMEYFT6.js.map +1 -0
  28. package/dist/{chunk-653XBU3L.js → chunk-F5NKWLMQ.js} +21 -15
  29. package/dist/chunk-F5NKWLMQ.js.map +1 -0
  30. package/dist/{chunk-H2M62IKR.js → chunk-G2DGDCDP.js} +15 -185
  31. package/dist/chunk-G2DGDCDP.js.map +1 -0
  32. package/dist/{chunk-35CBWAJL.js → chunk-GPBX2BY2.js} +2 -2
  33. package/dist/{chunk-ZM2AYHMO.js → chunk-GQDVH6FA.js} +2 -2
  34. package/dist/{chunk-GDDRANOZ.js → chunk-HWDQRW3O.js} +3 -3
  35. package/dist/chunk-HWDQRW3O.js.map +1 -0
  36. package/dist/{chunk-M3FBM4T3.js → chunk-J5JOJPK3.js} +2 -2
  37. package/dist/{chunk-UMZ2CIDW.js → chunk-KCAWSZUO.js} +11 -10
  38. package/dist/chunk-KCAWSZUO.js.map +1 -0
  39. package/dist/{chunk-OPQC4OWM.js → chunk-KGOBNC5A.js} +4 -4
  40. package/dist/{chunk-V5IYLWRA.js → chunk-LNY2Y32V.js} +2 -2
  41. package/dist/{chunk-7RCUWU3I.js → chunk-MRPIDNZU.js} +1 -1
  42. package/dist/chunk-MRPIDNZU.js.map +1 -0
  43. package/dist/{chunk-YWNF5755.js → chunk-N6DY47YN.js} +80 -45
  44. package/dist/chunk-N6DY47YN.js.map +1 -0
  45. package/dist/{chunk-VIQOQ463.js → chunk-OLJ54WGW.js} +15 -10
  46. package/dist/chunk-OLJ54WGW.js.map +1 -0
  47. package/dist/{chunk-6RINI7OL.js → chunk-PPQ5LV7U.js} +2 -2
  48. package/dist/{chunk-CTHB7345.js → chunk-PS6K2AOV.js} +5 -5
  49. package/dist/{chunk-Y2MVSEJK.js → chunk-QNRXRSKC.js} +6 -3
  50. package/dist/chunk-QNRXRSKC.js.map +1 -0
  51. package/dist/{chunk-EQIII6GI.js → chunk-SM3BCHYB.js} +5 -5
  52. package/dist/{chunk-OKB2NEDQ.js → chunk-T4KFKKEB.js} +7 -7
  53. package/dist/{chunk-VA6CWUAE.js → chunk-T4NESGYB.js} +3 -3
  54. package/dist/{chunk-VZ55H5X6.js → chunk-TJDKGKQV.js} +2 -2
  55. package/dist/{chunk-KCZSUJUR.js → chunk-UXBVDD7U.js} +6 -6
  56. package/dist/{chunk-QF2DROQR.js → chunk-WYDLOQYO.js} +2 -2
  57. package/dist/{chunk-4JZEQBWV.js → chunk-XIVLGWUX.js} +3 -1
  58. package/dist/chunk-XIVLGWUX.js.map +1 -0
  59. package/dist/{chunk-R7DGN73N.js → chunk-ZEFTWM5Z.js} +2 -2
  60. package/dist/{cleanup-QTZU46OP.js → cleanup-BCVY7PEF.js} +18 -18
  61. package/dist/cli.js +94 -69
  62. package/dist/cli.js.map +1 -1
  63. package/dist/{commit-P3OOQ3JN.js → commit-L5JNBU4U.js} +8 -8
  64. package/dist/{compile-IOXQTCP3.js → compile-GPJOHXH4.js} +8 -8
  65. package/dist/{contribute-EHWLYOMZ.js → contribute-QEGCI4PS.js} +4 -4
  66. package/dist/{dev-server-BLJ7NPKG.js → dev-server-67NPVWUN.js} +247 -31
  67. package/dist/dev-server-67NPVWUN.js.map +1 -0
  68. package/dist/{feedback-RFWGB4I5.js → feedback-2LWXKLQZ.js} +4 -4
  69. package/dist/{git-I3PO6FY7.js → git-IS7AV3ED.js} +4 -4
  70. package/dist/hooks/iloom-hook.js +40 -2
  71. package/dist/{ignite-6XT5BKSF.js → ignite-VQDJQ37S.js} +12 -14
  72. package/dist/index.d.ts +69 -37
  73. package/dist/index.js +23 -15
  74. package/dist/index.js.map +1 -1
  75. package/dist/{init-6FUPISD7.js → init-7SDJUAEZ.js} +8 -8
  76. package/dist/{install-deps-BMRONT2L.js → install-deps-NGSFDNUW.js} +8 -8
  77. package/dist/{issues-SUFQJY6O.js → issues-4HQKEUP7.js} +5 -5
  78. package/dist/{lint-PRD2DO5K.js → lint-C5FOVRXY.js} +8 -8
  79. package/dist/mcp/issue-management-server.js +19 -14
  80. package/dist/mcp/issue-management-server.js.map +1 -1
  81. package/dist/{open-NVFYA5IM.js → open-WUTLRI6S.js} +19 -15
  82. package/dist/open-WUTLRI6S.js.map +1 -0
  83. package/dist/{plan-7M5WB7VT.js → plan-GC3HF73T.js} +70 -39
  84. package/dist/plan-GC3HF73T.js.map +1 -0
  85. package/dist/{projects-L5AHUBGA.js → projects-3F6T3KZL.js} +2 -2
  86. package/dist/prompts/init-prompt.txt +40 -12
  87. package/dist/prompts/issue-prompt.txt +3 -0
  88. package/dist/prompts/plan-prompt.txt +67 -11
  89. package/dist/prompts/swarm-orchestrator-prompt.txt +25 -12
  90. package/dist/{rebase-5B7WQQAY.js → rebase-CSGQICAP.js} +7 -7
  91. package/dist/{recap-7PSTJ3MF.js → recap-CKGKFDJL.js} +7 -7
  92. package/dist/{run-6ZCDG7MX.js → run-3YL2IXXI.js} +19 -15
  93. package/dist/run-3YL2IXXI.js.map +1 -0
  94. package/dist/schema/settings.schema.json +35 -7
  95. package/dist/{shell-MX3WRDQN.js → shell-M2YYPNGV.js} +6 -6
  96. package/dist/{summary-WQ7QOAIQ.js → summary-XR4CBJEG.js} +9 -9
  97. package/dist/{test-LAIG62XM.js → test-ESDAHEVE.js} +8 -8
  98. package/dist/{test-git-PYJOYSED.js → test-git-KWPLHYSI.js} +4 -4
  99. package/dist/{test-jira-SM7IU5HW.js → test-jira-6NK7UHSV.js} +3 -3
  100. package/dist/{test-prefix-HIRZBXTM.js → test-prefix-VVODGHXP.js} +4 -4
  101. package/dist/{test-webserver-43PVP2JL.js → test-webserver-AHXKC6H4.js} +6 -6
  102. package/dist/{vscode-VZCCFQRY.js → vscode-OY7HOVRO.js} +6 -6
  103. package/package.json +1 -1
  104. package/dist/chunk-4JZEQBWV.js.map +0 -1
  105. package/dist/chunk-653XBU3L.js.map +0 -1
  106. package/dist/chunk-7RCUWU3I.js.map +0 -1
  107. package/dist/chunk-AYLC633W.js.map +0 -1
  108. package/dist/chunk-BFF27W3S.js.map +0 -1
  109. package/dist/chunk-GDDRANOZ.js.map +0 -1
  110. package/dist/chunk-GWJWECZB.js.map +0 -1
  111. package/dist/chunk-H2M62IKR.js.map +0 -1
  112. package/dist/chunk-UMZ2CIDW.js.map +0 -1
  113. package/dist/chunk-VIQOQ463.js.map +0 -1
  114. package/dist/chunk-Y2MVSEJK.js.map +0 -1
  115. package/dist/chunk-YWNF5755.js.map +0 -1
  116. package/dist/dev-server-BLJ7NPKG.js.map +0 -1
  117. package/dist/open-NVFYA5IM.js.map +0 -1
  118. package/dist/plan-7M5WB7VT.js.map +0 -1
  119. package/dist/run-6ZCDG7MX.js.map +0 -1
  120. /package/dist/{ClaudeContextManager-IENAE2CP.js.map → ClaudeContextManager-ZH6LEA5I.js.map} +0 -0
  121. /package/dist/{ClaudeService-YIJCZUUB.js.map → ClaudeService-YR66WXZN.js.map} +0 -0
  122. /package/dist/{IssueTrackerFactory-2OI7YIN6.js.map → IssueTrackerFactory-O2ZBA666.js.map} +0 -0
  123. /package/dist/{LoomLauncher-3TSFW7QP.js.map → LoomLauncher-V54ENBEF.js.map} +0 -0
  124. /package/dist/{MetadataManager-V4LSJ2PB.js.map → MetadataManager-HHE6LQF2.js.map} +0 -0
  125. /package/dist/{PromptTemplateManager-I75WKXM4.js.map → PromptTemplateManager-4RFELNYY.js.map} +0 -0
  126. /package/dist/{SettingsManager-BMQCAXPP.js.map → SettingsManager-SLSYEYDZ.js.map} +0 -0
  127. /package/dist/{build-PKHPE34Y.js.map → build-ZTGWDHWU.js.map} +0 -0
  128. /package/dist/{chunk-PMB6TYV4.js.map → chunk-C2BVNJW5.js.map} +0 -0
  129. /package/dist/{chunk-QFDM23CO.js.map → chunk-E5OM25WK.js.map} +0 -0
  130. /package/dist/{chunk-35CBWAJL.js.map → chunk-GPBX2BY2.js.map} +0 -0
  131. /package/dist/{chunk-ZM2AYHMO.js.map → chunk-GQDVH6FA.js.map} +0 -0
  132. /package/dist/{chunk-M3FBM4T3.js.map → chunk-J5JOJPK3.js.map} +0 -0
  133. /package/dist/{chunk-OPQC4OWM.js.map → chunk-KGOBNC5A.js.map} +0 -0
  134. /package/dist/{chunk-V5IYLWRA.js.map → chunk-LNY2Y32V.js.map} +0 -0
  135. /package/dist/{chunk-6RINI7OL.js.map → chunk-PPQ5LV7U.js.map} +0 -0
  136. /package/dist/{chunk-CTHB7345.js.map → chunk-PS6K2AOV.js.map} +0 -0
  137. /package/dist/{chunk-EQIII6GI.js.map → chunk-SM3BCHYB.js.map} +0 -0
  138. /package/dist/{chunk-OKB2NEDQ.js.map → chunk-T4KFKKEB.js.map} +0 -0
  139. /package/dist/{chunk-VA6CWUAE.js.map → chunk-T4NESGYB.js.map} +0 -0
  140. /package/dist/{chunk-VZ55H5X6.js.map → chunk-TJDKGKQV.js.map} +0 -0
  141. /package/dist/{chunk-KCZSUJUR.js.map → chunk-UXBVDD7U.js.map} +0 -0
  142. /package/dist/{chunk-QF2DROQR.js.map → chunk-WYDLOQYO.js.map} +0 -0
  143. /package/dist/{chunk-R7DGN73N.js.map → chunk-ZEFTWM5Z.js.map} +0 -0
  144. /package/dist/{cleanup-QTZU46OP.js.map → cleanup-BCVY7PEF.js.map} +0 -0
  145. /package/dist/{commit-P3OOQ3JN.js.map → commit-L5JNBU4U.js.map} +0 -0
  146. /package/dist/{compile-IOXQTCP3.js.map → compile-GPJOHXH4.js.map} +0 -0
  147. /package/dist/{contribute-EHWLYOMZ.js.map → contribute-QEGCI4PS.js.map} +0 -0
  148. /package/dist/{feedback-RFWGB4I5.js.map → feedback-2LWXKLQZ.js.map} +0 -0
  149. /package/dist/{git-I3PO6FY7.js.map → git-IS7AV3ED.js.map} +0 -0
  150. /package/dist/{ignite-6XT5BKSF.js.map → ignite-VQDJQ37S.js.map} +0 -0
  151. /package/dist/{init-6FUPISD7.js.map → init-7SDJUAEZ.js.map} +0 -0
  152. /package/dist/{install-deps-BMRONT2L.js.map → install-deps-NGSFDNUW.js.map} +0 -0
  153. /package/dist/{issues-SUFQJY6O.js.map → issues-4HQKEUP7.js.map} +0 -0
  154. /package/dist/{lint-PRD2DO5K.js.map → lint-C5FOVRXY.js.map} +0 -0
  155. /package/dist/{projects-L5AHUBGA.js.map → projects-3F6T3KZL.js.map} +0 -0
  156. /package/dist/{rebase-5B7WQQAY.js.map → rebase-CSGQICAP.js.map} +0 -0
  157. /package/dist/{recap-7PSTJ3MF.js.map → recap-CKGKFDJL.js.map} +0 -0
  158. /package/dist/{shell-MX3WRDQN.js.map → shell-M2YYPNGV.js.map} +0 -0
  159. /package/dist/{summary-WQ7QOAIQ.js.map → summary-XR4CBJEG.js.map} +0 -0
  160. /package/dist/{test-LAIG62XM.js.map → test-ESDAHEVE.js.map} +0 -0
  161. /package/dist/{test-git-PYJOYSED.js.map → test-git-KWPLHYSI.js.map} +0 -0
  162. /package/dist/{test-jira-SM7IU5HW.js.map → test-jira-6NK7UHSV.js.map} +0 -0
  163. /package/dist/{test-prefix-HIRZBXTM.js.map → test-prefix-VVODGHXP.js.map} +0 -0
  164. /package/dist/{test-webserver-43PVP2JL.js.map → test-webserver-AHXKC6H4.js.map} +0 -0
  165. /package/dist/{vscode-VZCCFQRY.js.map → vscode-OY7HOVRO.js.map} +0 -0
@@ -15,6 +15,8 @@ model: opus
15
15
  - **No human interaction**: Do NOT pause for user input. Create the plan autonomously.
16
16
  - **Concise output**: Return a structured plan suitable for the orchestrator, including the Execution Plan section.
17
17
  - **No state to done**: Do NOT call `recap.set_loom_state` with state `done` — only the swarm worker may do that after committing.
18
+ - **Efficiency**: Maximize parallel tool calls. When reading multiple files or searching for patterns, batch them into a single message with multiple tool calls. Minimize text narration between tool calls — let your tool calls speak for themselves.
19
+ - **Single comment**: Post ONE comment at the end with your complete plan (Section 1 + Section 2). Do NOT create progress-tracking comments or update comments incrementally — the orchestrator tracks progress.
18
20
  {{else}}
19
21
  {{#if DRAFT_PR_MODE}}
20
22
  ## Comment Routing: Draft PR Mode
@@ -101,6 +103,27 @@ Available Tools:
101
103
  Parameters: { commentId: string, number: string, body: "updated markdown content" }
102
104
  Returns: { id: string, url: string, updated_at: string }
103
105
 
106
+ {{#if SWARM_MODE}}
107
+ Workflow Comment Strategy (Swarm Mode):
108
+ 1. Perform all research and planning FIRST without posting comments.
109
+ 2. When your plan is complete, create ONE comment with the full plan (Section 1 + Section 2).
110
+ 3. Store the returned comment ID and URL. Call `mcp__recap__add_artifact` to log it.
111
+ 4. Return the comment URL and Execution Plan to the calling process.
112
+
113
+ Example Usage:
114
+ ```
115
+ const comment = await mcp__issue_management__create_comment({
116
+ number: "<issue-number-from-invocation-prompt>",
117
+ body: "# Implementation Plan...\n\n[Full Section 1 + Section 2 content]",
118
+ type: "issue"
119
+ })
120
+ await mcp__recap__add_artifact({
121
+ type: "comment",
122
+ primaryUrl: comment.url,
123
+ description: "Implementation plan comment"
124
+ })
125
+ ```
126
+ {{else}}
104
127
  Workflow Comment Strategy:
105
128
  1. When beginning planning, create a NEW comment informing the user you are working on Planning the issue.
106
129
  2. Store the returned comment ID and URL. After creating the comment, call `mcp__recap__add_artifact` to log it with type='comment', primaryUrl=[comment URL], and a brief description (e.g., "Planning progress comment").
@@ -117,11 +140,7 @@ Workflow Comment Strategy:
117
140
  Example Usage:
118
141
  ```
119
142
  // Start
120
- {{#if SWARM_MODE}}const comment = await mcp__issue_management__create_comment({
121
- number: "<issue-number-from-invocation-prompt>",
122
- body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
123
- type: "issue"
124
- }){{else}}{{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
143
+ {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
125
144
  number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
126
145
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
127
146
  type: "pr"
@@ -129,7 +148,7 @@ Example Usage:
129
148
  number: {{ISSUE_NUMBER}},
130
149
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
131
150
  type: "issue"
132
- }){{/if}}{{/if}}
151
+ }){{/if}}
133
152
 
134
153
  // Log the comment as an artifact
135
154
  await mcp__recap__add_artifact({
@@ -139,11 +158,7 @@ await mcp__recap__add_artifact({
139
158
  })
140
159
 
141
160
  // Update as you progress
142
- {{#if SWARM_MODE}}await mcp__issue_management__update_comment({
143
- commentId: comment.id,
144
- number: "<issue-number-from-invocation-prompt>",
145
- body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
146
- }){{else}}{{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
161
+ {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
147
162
  commentId: comment.id,
148
163
  number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
149
164
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -151,8 +166,9 @@ await mcp__recap__add_artifact({
151
166
  commentId: comment.id,
152
167
  number: {{ISSUE_NUMBER}},
153
168
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
154
- }){{/if}}{{/if}}
169
+ }){{/if}}
155
170
  ```
171
+ {{/if}}
156
172
  </comment_tool_info>
157
173
 
158
174
  ## Analysis Approach
@@ -513,10 +529,12 @@ This section tells the orchestrator EXACTLY how to execute the implementation st
513
529
  - **FOR CROSS-COMPONENT VALUES**: Every specific value (scores, thresholds, enums) referenced from other components must have a file:line citation. Any value without a citation must be replaced with intent-based language and have a corresponding `recap.add_entry({ type: 'assumption' })` call.
514
530
 
515
531
 
532
+ {{#unless SWARM_MODE}}
516
533
  ## HOW TO UPDATE THE USER OF YOUR PROGRESS
517
534
  * AS SOON AS YOU CAN, once you have formulated an initial plan/todo list for your task, you should create a comment as described in the <comment_tool_info> section above.
518
535
  * AFTER YOU COMPLETE EACH ITEM ON YOUR TODO LIST - update the same comment with your progress as described in the <comment_tool_info> section above.
519
536
  * When the whole task is complete, update the SAME comment with the results of your work including Section 1 and Section 2 above. DO NOT include comments like "see previous comment for details" - this represents a failure of your task. NEVER ATTEMPT CONCURRENT UPDATES OF THE COMMENT. DATA WILL BE LOST.
537
+ {{/unless}}
520
538
 
521
539
  ## Critical Reminders
522
540
 
@@ -19,11 +19,16 @@ color: red
19
19
 
20
20
  You are a wave verification agent. Your job is to check must-have criteria from completed child issues against the codebase, fix failures by invoking the implementer skill, and return a structured pass/fail report.
21
21
 
22
+ ## Context
23
+
24
+ - **Epic Worktree Path:** `{{EPIC_WORKTREE_PATH}}`
25
+
22
26
  ## MANDATORY FIRST STEP
23
27
 
24
28
  1. `cd` to your assigned worktree path (from your invocation prompt)
25
29
  2. Call `recap.set_loom_state({ state: "in_progress", worktreePath: "<your-worktree-path>" })`
26
30
  3. Parse the child issue numbers from your invocation prompt
31
+ 4. Extract the `Epic Worktree` path and `Pre-wave commit` SHA from your invocation prompt (needed for code review in Steps 5-7)
27
32
 
28
33
  ## Core Workflow
29
34
 
@@ -87,7 +92,7 @@ Record each result as:
87
92
 
88
93
  After verifying all must-haves, post the initial results as a comment on the verifier's own issue:
89
94
 
90
- 1. Construct a markdown report using the same format as Step 5, but with only the "Initial" column populated (no "After Fix" column yet since fixes haven't been attempted):
95
+ 1. Construct a markdown report using the same format as Step 8, but with only the "Initial" column populated (no "After Fix" column yet since fixes haven't been attempted):
91
96
 
92
97
  ```markdown
93
98
  ## Wave Verification Report
@@ -123,7 +128,7 @@ After verifying all must-haves, post the initial results as a comment on the ver
123
128
  - Call `recap.add_artifact` with `type: 'comment'`, `primaryUrl`: the returned comment URL, and `description`: `"Wave verification report"`
124
129
  - If in swarm mode, include `worktreePath` in the recap call
125
130
 
126
- **If all must-haves passed** (no failures), the initial report is already the final report. Skip Steps 3 and 4 entirely and proceed to Step 5. The comment does not need updating.
131
+ **If all must-haves passed** (no failures), the initial report is already the final report. Skip Steps 3 and 4 entirely and proceed to Step 5 (code review). The comment does not need updating.
127
132
 
128
133
  ### Step 3: Fix Failures (if any)
129
134
 
@@ -171,7 +176,7 @@ After ALL fix skill invocations have completed:
171
176
 
172
177
  **Update the verification report comment:**
173
178
 
174
- 5. Construct the full report in the Step 5 format (with "After Fix" column populated for previously-failed criteria)
179
+ 5. Construct the full report in the Step 8 format (with "After Fix" column populated for previously-failed criteria)
175
180
  6. Call `mcp__issue_management__update_comment` with:
176
181
  - `commentId`: the ID saved from Step 2.5
177
182
  - `number`: your own issue number
@@ -179,7 +184,106 @@ After ALL fix skill invocations have completed:
179
184
  - `markupLanguage`: `"GFM"`
180
185
  7. Update the recap artifact by calling `recap.add_artifact` again with the same `primaryUrl` (this replaces the existing entry)
181
186
 
182
- ### Step 5: Return Structured Report
187
+ ### Step 5: Gather Wave Diff for Code Review
188
+
189
+ 1. From the invocation prompt, extract:
190
+ - `Epic Worktree` path
191
+ - `Pre-wave commit` SHA
192
+ 2. Run: `cd <epic-worktree> && git diff <pre-wave-commit>..HEAD`
193
+ 3. Save the diff output
194
+ 4. Also gather CLAUDE.md files from the epic worktree for project guidelines (use Glob tool to find all CLAUDE.md files, read them)
195
+ 5. **IMPORTANT:** `git diff` does NOT show untracked files. Run `git status --short` in the epic worktree and for any new untracked files added since the pre-wave commit, read them directly using the Read tool
196
+ 6. If the diff is empty (no changes since pre-wave commit), skip Steps 6 and 7 entirely — note "No code changes to review" in the report
197
+
198
+ ### Step 6: Run Code Review on Wave Changes
199
+
200
+ {{#if HAS_REVIEW_GEMINI}}{{else}}{{#if HAS_REVIEW_CODEX}}{{else}}
201
+ *No review providers configured — skipping code review. Configure providers in `.iloom/settings.json` under `agents.iloom-code-reviewer.providers` to enable.*
202
+ {{/if}}{{/if}}
203
+
204
+ {{#if HAS_REVIEW_GEMINI}}
205
+ Invoke the code reviewer skill with the pre-gathered diff:
206
+
207
+ /iloom-swarm-code-reviewer "
208
+ ## Pre-gathered Diff
209
+
210
+ The following diff contains all changes made in this wave (from pre-wave commit to current epic branch HEAD). Use this diff directly — do NOT run git commands to gather your own diff.
211
+
212
+ \`\`\`diff
213
+ <insert full diff from Step 5 here>
214
+ \`\`\`
215
+
216
+ ## CLAUDE.md Guidelines
217
+
218
+ <insert CLAUDE.md content from Step 5 here>
219
+
220
+ Run a full code review of these wave changes. You are in swarm mode — do NOT ask the user about findings, return all results directly."
221
+
222
+ Collect the skill output as the code review findings.
223
+ {{else}}
224
+ {{#if HAS_REVIEW_CODEX}}
225
+ Invoke the code reviewer skill with the pre-gathered diff:
226
+
227
+ /iloom-swarm-code-reviewer "
228
+ ## Pre-gathered Diff
229
+
230
+ The following diff contains all changes made in this wave (from pre-wave commit to current epic branch HEAD). Use this diff directly — do NOT run git commands to gather your own diff.
231
+
232
+ \`\`\`diff
233
+ <insert full diff from Step 5 here>
234
+ \`\`\`
235
+
236
+ ## CLAUDE.md Guidelines
237
+
238
+ <insert CLAUDE.md content from Step 5 here>
239
+
240
+ Run a full code review of these wave changes. You are in swarm mode — do NOT ask the user about findings, return all results directly."
241
+
242
+ Collect the skill output as the code review findings.
243
+ {{/if}}
244
+ {{/if}}
245
+
246
+ ### Step 7: Fix Critical Code Review Issues
247
+
248
+ **CRITICAL: You MUST execute this step after Step 6. Do NOT skip to Step 8 without processing code review results.**
249
+
250
+ After the code reviewer skill returns its output:
251
+
252
+ 1. **Parse the findings**: Scan the code reviewer's output for findings under the "Critical Issues (95-100 confidence)" heading. Each finding follows the format: `[FILE:LINE] (Score: XX) Issue description` with a `Recommendation: ...` line below it. Extract every finding with a score of 95 or higher.
253
+
254
+ 2. **If no critical findings exist** (the "Critical Issues" section is empty or absent, or the summary shows "0 critical"), skip to Step 8. Warnings (80-94) are reported but not auto-fixed.
255
+
256
+ 3. **If critical findings exist**, group them by file path, then invoke one implementer skill per file — all in the **same response** so they run in parallel:
257
+
258
+ CRITICAL: Skills run with `context: fork` and start at the project root. You MUST include the epic worktree path so the forked agent works in the correct location.
259
+
260
+ For each file that has critical findings, invoke:
261
+
262
+ ```
263
+ /iloom-swarm-issue-implementer "Your working directory is {{EPIC_WORKTREE_PATH}}. cd there before doing any work.
264
+
265
+ Fix the following critical code review findings in FILE_PATH. DO NOT create your own issue comment. Do NOT commit changes — just make the edits.
266
+
267
+ 1. [FILE:LINE] (Score: XX) Issue description — Recommendation: ...
268
+ 2. [FILE:LINE] (Score: XX) Issue description — Recommendation: ...
269
+
270
+ Fix ONLY these specific issues. Do not refactor or make additional changes beyond what is listed."
271
+ ```
272
+
273
+ **Parallel invocation:** If critical findings span 3 files, you invoke 3 separate `/iloom-swarm-issue-implementer` skills in a single response message. This runs them concurrently. Each invocation handles findings for ONE file only, preventing edit conflicts.
274
+
275
+ **Fix prompt construction:** Copy each critical finding EXACTLY from the code reviewer's output (file path, line number, score, issue description, and recommendation). Do NOT paraphrase or summarize — the fix agent needs the precise details to locate and fix each issue.
276
+
277
+ 4. **After ALL fix agents return**, stage and commit once from the epic worktree:
278
+ ```bash
279
+ cd "{{EPIC_WORKTREE_PATH}}"
280
+ git add -A
281
+ git commit -m "fix(review): address critical wave code review findings"
282
+ ```
283
+
284
+ 5. Record which findings were sent for fixing for the Step 8 report
285
+
286
+ ### Step 8: Return Structured Report
183
287
 
184
288
  Return the verification report in this exact format:
185
289
 
@@ -220,9 +324,26 @@ Return the verification report in this exact format:
220
324
 
221
325
  *(If no fix skills were invoked: "None — all must-haves passed on initial verification.")*
222
326
 
223
- ### Overall Status: [ALL_PASSED | PARTIALLY_FIXED | FAILURES_REMAIN]
327
+ ### Code Review
328
+
329
+ {{#if HAS_REVIEW_GEMINI}}
330
+ - **Findings**: X critical, Y warnings
331
+ - **Auto-fixed**: N critical issues
332
+ - **Remaining**: Z issues require manual attention
333
+ {{else}}
334
+ {{#if HAS_REVIEW_CODEX}}
335
+ - **Findings**: X critical, Y warnings
336
+ - **Auto-fixed**: N critical issues
337
+ - **Remaining**: Z issues require manual attention
338
+ {{else}}
339
+ - **Status**: Skipped (no review providers configured)
340
+ {{/if}}
341
+ {{/if}}
342
+
343
+ ### Overall Status: [ALL_PASSED | ALL_FIXED | PARTIALLY_FIXED | FAILURES_REMAIN]
224
344
 
225
345
  - **ALL_PASSED**: All must-haves passed initial verification (no fix skills needed)
346
+ - **ALL_FIXED**: Some must-haves failed initially but ALL were fixed after re-verification
226
347
  - **PARTIALLY_FIXED**: Some failures were fixed but others remain
227
348
  - **FAILURES_REMAIN**: One or more must-haves are still failing after re-verification
228
349
 
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-CTHB7345.js";
5
- import "./chunk-ZM2AYHMO.js";
6
- import "./chunk-VIQOQ463.js";
7
- import "./chunk-6RINI7OL.js";
4
+ } from "./chunk-PS6K2AOV.js";
5
+ import "./chunk-GQDVH6FA.js";
6
+ import "./chunk-OLJ54WGW.js";
7
+ import "./chunk-PPQ5LV7U.js";
8
8
  import "./chunk-K3QGG4O2.js";
9
- import "./chunk-OPQC4OWM.js";
10
- import "./chunk-653XBU3L.js";
11
- import "./chunk-4JZEQBWV.js";
9
+ import "./chunk-KGOBNC5A.js";
10
+ import "./chunk-F5NKWLMQ.js";
11
+ import "./chunk-XIVLGWUX.js";
12
12
  import "./chunk-FTYWGQFM.js";
13
13
  import "./chunk-VRPPI6GU.js";
14
14
 
@@ -24,4 +24,4 @@ var BuildCommand = class extends ScriptCommandBase {
24
24
  export {
25
25
  BuildCommand
26
26
  };
27
- //# sourceMappingURL=build-PKHPE34Y.js.map
27
+ //# sourceMappingURL=build-ZTGWDHWU.js.map
@@ -2,18 +2,18 @@
2
2
  import {
3
3
  PRManager,
4
4
  VCSProviderFactory
5
- } from "./chunk-M3FBM4T3.js";
5
+ } from "./chunk-J5JOJPK3.js";
6
6
  import {
7
7
  preAcceptClaudeTrust
8
8
  } from "./chunk-7UBEHQTP.js";
9
9
  import {
10
10
  calculatePortForBranch,
11
11
  calculatePortFromIdentifier
12
- } from "./chunk-BFF27W3S.js";
12
+ } from "./chunk-ERMEYFT6.js";
13
13
  import {
14
14
  installDependencies,
15
15
  runScript
16
- } from "./chunk-VIQOQ463.js";
16
+ } from "./chunk-OLJ54WGW.js";
17
17
  import {
18
18
  getPackageConfig,
19
19
  hasScript
@@ -43,10 +43,10 @@ import {
43
43
  fetchOrigin,
44
44
  isFileTrackedByGit,
45
45
  pushBranchToRemote
46
- } from "./chunk-OPQC4OWM.js";
46
+ } from "./chunk-KGOBNC5A.js";
47
47
  import {
48
48
  MetadataManager
49
- } from "./chunk-4JZEQBWV.js";
49
+ } from "./chunk-XIVLGWUX.js";
50
50
  import {
51
51
  getLogger
52
52
  } from "./chunk-FTYWGQFM.js";
@@ -239,7 +239,7 @@ var LoomManager = class {
239
239
  * NEW: Checks for existing worktrees and reuses them if found
240
240
  */
241
241
  async createIloom(input) {
242
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t;
242
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
243
243
  getLogger().info("Fetching issue data...");
244
244
  const issueData = await this.fetchIssueData(input);
245
245
  if (input.type === "issue" || input.type === "epic" || input.type === "pr" || input.type === "branch") {
@@ -443,8 +443,8 @@ ${issueData.body}` : "";
443
443
  const setArguments = (_l = input.options) == null ? void 0 : _l.setArguments;
444
444
  const executablePath = (_m = input.options) == null ? void 0 : _m.executablePath;
445
445
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
446
- const { LoomLauncher } = await import("./LoomLauncher-3TSFW7QP.js");
447
- const { ClaudeContextManager } = await import("./ClaudeContextManager-IENAE2CP.js");
446
+ const { LoomLauncher } = await import("./LoomLauncher-V54ENBEF.js");
447
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-ZH6LEA5I.js");
448
448
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
449
449
  const launcher = new LoomLauncher(claudeContext, this.settings);
450
450
  await launcher.launchLoom({
@@ -509,10 +509,11 @@ ${issueData.body}` : "";
509
509
  capabilities,
510
510
  ...draftPrNumber && { draftPrNumber },
511
511
  ...((_p = input.options) == null ? void 0 : _p.oneShot) && { oneShot: input.options.oneShot },
512
- ...((_q = input.options) == null ? void 0 : _q.complexity) && { complexity: input.options.complexity },
513
- ...((_r = input.options) == null ? void 0 : _r.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
514
- ...((_s = input.options) == null ? void 0 : _s.childIssues) && input.options.childIssues.length > 0 && { childIssues: input.options.childIssues },
515
- ...((_t = input.options) == null ? void 0 : _t.dependencyMap) && Object.keys(input.options.dependencyMap).length > 0 && { dependencyMap: input.options.dependencyMap },
512
+ ...((_q = input.options) == null ? void 0 : _q.dangerouslySkipPermissions) && { dangerouslySkipPermissions: true },
513
+ ...((_r = input.options) == null ? void 0 : _r.complexity) && { complexity: input.options.complexity },
514
+ ...((_s = input.options) == null ? void 0 : _s.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
515
+ ...((_t = input.options) == null ? void 0 : _t.childIssues) && input.options.childIssues.length > 0 && { childIssues: input.options.childIssues },
516
+ ...((_u = input.options) == null ? void 0 : _u.dependencyMap) && Object.keys(input.options.dependencyMap).length > 0 && { dependencyMap: input.options.dependencyMap },
516
517
  ...input.parentLoom && { parentLoom: input.parentLoom }
517
518
  };
518
519
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
@@ -606,7 +607,7 @@ ${issueData.body}` : "";
606
607
  async checkAndWarnChildLooms(branchName) {
607
608
  let targetBranch = branchName;
608
609
  if (!targetBranch) {
609
- const { getCurrentBranch } = await import("./git-I3PO6FY7.js");
610
+ const { getCurrentBranch } = await import("./git-IS7AV3ED.js");
610
611
  targetBranch = await getCurrentBranch();
611
612
  }
612
613
  if (!targetBranch) {
@@ -722,7 +723,7 @@ ${issueData.body}` : "";
722
723
  }
723
724
  }
724
725
  const branchExistedLocally = await branchExists(branchName, process.cwd(), false);
725
- if (input.type !== "pr" && branchExistedLocally) {
726
+ if (input.type === "issue" && branchExistedLocally) {
726
727
  throw new Error(
727
728
  `Cannot create worktree: branch '${branchName}' already exists. Use 'git branch -D ${branchName}' to delete it first if needed.`
728
729
  );
@@ -756,8 +757,8 @@ ${issueData.body}` : "";
756
757
  await this.gitWorktree.createWorktree({
757
758
  path: worktreePath,
758
759
  branch: branchName,
759
- createBranch: input.type !== "pr",
760
- // PRs use existing branches
760
+ createBranch: input.type !== "pr" && !branchExistedLocally,
761
+ // PRs and existing branches use existing branches
761
762
  ...baseBranch && { baseBranch }
762
763
  });
763
764
  if (input.type === "pr" && !branchExistedLocally) {
@@ -1099,7 +1100,7 @@ ${issueData.body}` : "";
1099
1100
  * Ports: handle_existing_worktree() from bash script lines 168-215
1100
1101
  */
1101
1102
  async reuseIloom(worktree, input, issueData) {
1102
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
1103
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
1103
1104
  const worktreePath = worktree.path;
1104
1105
  const branchName = worktree.branch;
1105
1106
  this.loadMainEnvFile();
@@ -1160,8 +1161,8 @@ ${issueData.body}` : "";
1160
1161
  const executablePath = (_j = input.options) == null ? void 0 : _j.executablePath;
1161
1162
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
1162
1163
  getLogger().info("Launching workspace components...");
1163
- const { LoomLauncher } = await import("./LoomLauncher-3TSFW7QP.js");
1164
- const { ClaudeContextManager } = await import("./ClaudeContextManager-IENAE2CP.js");
1164
+ const { LoomLauncher } = await import("./LoomLauncher-V54ENBEF.js");
1165
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-ZH6LEA5I.js");
1165
1166
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
1166
1167
  const launcher = new LoomLauncher(claudeContext, this.settings);
1167
1168
  await launcher.launchLoom({
@@ -1223,12 +1224,13 @@ ${issueData.body}` : "";
1223
1224
  prUrls,
1224
1225
  capabilities,
1225
1226
  ...((_m = input.options) == null ? void 0 : _m.oneShot) && { oneShot: input.options.oneShot },
1226
- ...((_n = input.options) == null ? void 0 : _n.complexity) && { complexity: input.options.complexity },
1227
- ...((_o = input.options) == null ? void 0 : _o.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
1227
+ ...((_n = input.options) == null ? void 0 : _n.dangerouslySkipPermissions) && { dangerouslySkipPermissions: true },
1228
+ ...((_o = input.options) == null ? void 0 : _o.complexity) && { complexity: input.options.complexity },
1229
+ ...((_p = input.options) == null ? void 0 : _p.childIssueNumbers) && input.options.childIssueNumbers.length > 0 && { childIssueNumbers: input.options.childIssueNumbers },
1228
1230
  ...input.parentLoom && { parentLoom: input.parentLoom }
1229
1231
  };
1230
1232
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
1231
- } else if ((_p = input.options) == null ? void 0 : _p.complexity) {
1233
+ } else if ((_q = input.options) == null ? void 0 : _q.complexity) {
1232
1234
  await this.metadataManager.updateMetadata(worktreePath, {
1233
1235
  complexity: input.options.complexity
1234
1236
  });
@@ -1909,4 +1911,4 @@ export {
1909
1911
  CLIIsolationManager,
1910
1912
  DatabaseManager
1911
1913
  };
1912
- //# sourceMappingURL=chunk-GWJWECZB.js.map
1914
+ //# sourceMappingURL=chunk-55NTREIU.js.map