@iloom/cli 0.10.0 → 0.10.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 (155) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -2
  3. package/dist/{BranchNamingService-ECJHBB67.js → BranchNamingService-25KSZAEM.js} +2 -2
  4. package/dist/ClaudeContextManager-66GR4BGM.js +14 -0
  5. package/dist/ClaudeService-7KM5NA5Z.js +13 -0
  6. package/dist/{LoomLauncher-L64HHS3T.js → LoomLauncher-TDLZSYG2.js} +6 -6
  7. package/dist/{PromptTemplateManager-DULSVRRE.js → PromptTemplateManager-YOE2SIPG.js} +2 -2
  8. package/dist/README.md +2 -2
  9. package/dist/{SettingsManager-BQDQA3FK.js → SettingsManager-FNKCOZMQ.js} +2 -2
  10. package/dist/{build-5GO3XW26.js → build-VHGEMXBA.js} +6 -6
  11. package/dist/chunk-4E7LCFUG.js +24 -0
  12. package/dist/chunk-4E7LCFUG.js.map +1 -0
  13. package/dist/{chunk-MNHZB4Z2.js → chunk-4FGEGQW4.js} +3 -3
  14. package/dist/{chunk-LXLMMXXY.js → chunk-5FJWO4IT.js} +17 -12
  15. package/dist/chunk-5FJWO4IT.js.map +1 -0
  16. package/dist/{chunk-ZHPNZC75.js → chunk-5RPBYK5Q.js} +26 -21
  17. package/dist/chunk-5RPBYK5Q.js.map +1 -0
  18. package/dist/{chunk-WY4QBK43.js → chunk-63QWFWH3.js} +2 -2
  19. package/dist/{chunk-YYAKPQBT.js → chunk-7VHJNVLF.js} +19 -9
  20. package/dist/chunk-7VHJNVLF.js.map +1 -0
  21. package/dist/{chunk-SF2P22EE.js → chunk-C6HNNJIV.js} +2 -2
  22. package/dist/{chunk-5MWV33NN.js → chunk-CVCTIDDK.js} +2 -2
  23. package/dist/{chunk-RYWFS37M.js → chunk-E6KOWMKA.js} +2 -2
  24. package/dist/{chunk-6EU6TCF6.js → chunk-EVPZFV3K.js} +5 -5
  25. package/dist/{chunk-ZEWU5PZK.js → chunk-G5V75JD5.js} +2 -2
  26. package/dist/chunk-GRISNU6G.js +651 -0
  27. package/dist/chunk-GRISNU6G.js.map +1 -0
  28. package/dist/{chunk-VGGST52X.js → chunk-I5T677EA.js} +2 -2
  29. package/dist/{chunk-VECNX6VX.js → chunk-KIK2ZFAL.js} +2 -2
  30. package/dist/{chunk-FB47TIJG.js → chunk-KKV5WH5M.js} +4 -23
  31. package/dist/chunk-KKV5WH5M.js.map +1 -0
  32. package/dist/{chunk-ZW2LKWWE.js → chunk-KVHIAWVT.js} +3 -3
  33. package/dist/{chunk-3D7WQM7I.js → chunk-LLHXQS3C.js} +2 -2
  34. package/dist/{chunk-Y4YZTHZE.js → chunk-LUKXJSRI.js} +2 -2
  35. package/dist/{ignite-CGOV3TD4.js → chunk-OTGH2HRS.js} +105 -71
  36. package/dist/chunk-OTGH2HRS.js.map +1 -0
  37. package/dist/{chunk-J5S7DFYC.js → chunk-QVLPWNE3.js} +2 -2
  38. package/dist/chunk-RJ3VBUFK.js +781 -0
  39. package/dist/chunk-RJ3VBUFK.js.map +1 -0
  40. package/dist/{chunk-SN3SQCFK.js → chunk-S7PZA6IV.js} +4 -4
  41. package/dist/{chunk-UWGVCXRF.js → chunk-SKSYYBCU.js} +23 -1
  42. package/dist/chunk-SKSYYBCU.js.map +1 -0
  43. package/dist/{chunk-JO2LZ6EQ.js → chunk-SWSJWA2S.js} +2 -2
  44. package/dist/{chunk-ONQYPICO.js → chunk-UR5DGNUO.js} +60 -6
  45. package/dist/chunk-UR5DGNUO.js.map +1 -0
  46. package/dist/{chunk-4WJNIR5O.js → chunk-UUEW5KWB.js} +1 -1
  47. package/dist/chunk-UUEW5KWB.js.map +1 -0
  48. package/dist/{chunk-NRSWLOAZ.js → chunk-WXIM2WS7.js} +4 -4
  49. package/dist/{chunk-UD3WJDIV.js → chunk-ZNMPGMHY.js} +11 -774
  50. package/dist/chunk-ZNMPGMHY.js.map +1 -0
  51. package/dist/{claude-P3NQR6IJ.js → claude-7GGEWVEM.js} +2 -2
  52. package/dist/{cleanup-6UCPVMFG.js → cleanup-6PVAC4NI.js} +19 -17
  53. package/dist/{cleanup-6UCPVMFG.js.map → cleanup-6PVAC4NI.js.map} +1 -1
  54. package/dist/cli.js +154 -614
  55. package/dist/cli.js.map +1 -1
  56. package/dist/{commit-L3EPY5QG.js → commit-FZR5XDQG.js} +12 -10
  57. package/dist/commit-FZR5XDQG.js.map +1 -0
  58. package/dist/{compile-ZS4HYRX5.js → compile-7ALJHZ4N.js} +6 -6
  59. package/dist/{contribute-ORDDQGSL.js → contribute-5GKLK3BQ.js} +3 -3
  60. package/dist/{dev-server-FYZ2AQIH.js → dev-server-7SMIB7OF.js} +8 -8
  61. package/dist/{feedback-TMBXSCM5.js → feedback-G2GJFN2F.js} +10 -8
  62. package/dist/{feedback-TMBXSCM5.js.map → feedback-G2GJFN2F.js.map} +1 -1
  63. package/dist/{git-ET64COO3.js → git-GTLKAZRJ.js} +3 -3
  64. package/dist/ignite-H2O5Y5A2.js +34 -0
  65. package/dist/ignite-H2O5Y5A2.js.map +1 -0
  66. package/dist/index.d.ts +113 -18
  67. package/dist/index.js +177 -12
  68. package/dist/index.js.map +1 -1
  69. package/dist/{init-GFQ5W7GK.js → init-32YOKXRL.js} +8 -8
  70. package/dist/{issues-T4ZZSPEG.js → issues-4UUAQ5K6.js} +3 -3
  71. package/dist/{lint-6TQXDZ3T.js → lint-AAN2NZWG.js} +6 -6
  72. package/dist/mcp/harness-server.js +140 -0
  73. package/dist/mcp/harness-server.js.map +1 -0
  74. package/dist/mcp/issue-management-server.js +140 -18
  75. package/dist/mcp/issue-management-server.js.map +1 -1
  76. package/dist/{open-5QZGXQRF.js → open-FXWW3VI4.js} +8 -8
  77. package/dist/{plan-U7ZQWLFY.js → plan-RQ5FPIGF.js} +338 -36
  78. package/dist/plan-RQ5FPIGF.js.map +1 -0
  79. package/dist/prompts/CLAUDE.md +2 -2
  80. package/dist/prompts/init-prompt.txt +102 -27
  81. package/dist/prompts/issue-prompt.txt +46 -0
  82. package/dist/prompts/plan-prompt.txt +59 -19
  83. package/dist/prompts/swarm-orchestrator-prompt.txt +107 -80
  84. package/dist/{rebase-DWIB77KV.js → rebase-6NVLX5V7.js} +17 -8
  85. package/dist/rebase-6NVLX5V7.js.map +1 -0
  86. package/dist/{recap-MX63HAKV.js → recap-OMBOKJST.js} +6 -6
  87. package/dist/{run-O3TFNQFC.js → run-BBXLRIZB.js} +8 -8
  88. package/dist/schema/settings.schema.json +36 -2
  89. package/dist/{shell-G6VC2CYR.js → shell-RF7LTND5.js} +5 -5
  90. package/dist/{summary-FWHAX55O.js → summary-WTQZ7XG2.js} +9 -9
  91. package/dist/{test-F7JNJZYP.js → test-SGO6I5Z7.js} +6 -6
  92. package/dist/{test-git-BTAOIUE2.js → test-git-XM4TM65W.js} +3 -3
  93. package/dist/{test-jira-CHYNV33F.js → test-jira-LDTOYFSD.js} +3 -3
  94. package/dist/{test-prefix-Q6TFSU6F.js → test-prefix-GBO37XCN.js} +3 -3
  95. package/dist/{test-webserver-EONCG7E7.js → test-webserver-NZ3JTVLL.js} +5 -5
  96. package/dist/{vscode-VA5X4P25.js → vscode-6XUGHJKL.js} +5 -5
  97. package/package.json +1 -1
  98. package/dist/ClaudeContextManager-QXX6ZFST.js +0 -14
  99. package/dist/ClaudeService-NJNK2SUH.js +0 -13
  100. package/dist/chunk-4WJNIR5O.js.map +0 -1
  101. package/dist/chunk-FB47TIJG.js.map +0 -1
  102. package/dist/chunk-LXLMMXXY.js.map +0 -1
  103. package/dist/chunk-ONQYPICO.js.map +0 -1
  104. package/dist/chunk-UD3WJDIV.js.map +0 -1
  105. package/dist/chunk-UVD4CZKS.js +0 -101
  106. package/dist/chunk-UVD4CZKS.js.map +0 -1
  107. package/dist/chunk-UWGVCXRF.js.map +0 -1
  108. package/dist/chunk-YYAKPQBT.js.map +0 -1
  109. package/dist/chunk-ZHPNZC75.js.map +0 -1
  110. package/dist/commit-L3EPY5QG.js.map +0 -1
  111. package/dist/ignite-CGOV3TD4.js.map +0 -1
  112. package/dist/plan-U7ZQWLFY.js.map +0 -1
  113. package/dist/rebase-DWIB77KV.js.map +0 -1
  114. /package/dist/{BranchNamingService-ECJHBB67.js.map → BranchNamingService-25KSZAEM.js.map} +0 -0
  115. /package/dist/{ClaudeContextManager-QXX6ZFST.js.map → ClaudeContextManager-66GR4BGM.js.map} +0 -0
  116. /package/dist/{ClaudeService-NJNK2SUH.js.map → ClaudeService-7KM5NA5Z.js.map} +0 -0
  117. /package/dist/{LoomLauncher-L64HHS3T.js.map → LoomLauncher-TDLZSYG2.js.map} +0 -0
  118. /package/dist/{PromptTemplateManager-DULSVRRE.js.map → PromptTemplateManager-YOE2SIPG.js.map} +0 -0
  119. /package/dist/{SettingsManager-BQDQA3FK.js.map → SettingsManager-FNKCOZMQ.js.map} +0 -0
  120. /package/dist/{build-5GO3XW26.js.map → build-VHGEMXBA.js.map} +0 -0
  121. /package/dist/{chunk-MNHZB4Z2.js.map → chunk-4FGEGQW4.js.map} +0 -0
  122. /package/dist/{chunk-WY4QBK43.js.map → chunk-63QWFWH3.js.map} +0 -0
  123. /package/dist/{chunk-SF2P22EE.js.map → chunk-C6HNNJIV.js.map} +0 -0
  124. /package/dist/{chunk-5MWV33NN.js.map → chunk-CVCTIDDK.js.map} +0 -0
  125. /package/dist/{chunk-RYWFS37M.js.map → chunk-E6KOWMKA.js.map} +0 -0
  126. /package/dist/{chunk-6EU6TCF6.js.map → chunk-EVPZFV3K.js.map} +0 -0
  127. /package/dist/{chunk-ZEWU5PZK.js.map → chunk-G5V75JD5.js.map} +0 -0
  128. /package/dist/{chunk-VGGST52X.js.map → chunk-I5T677EA.js.map} +0 -0
  129. /package/dist/{chunk-VECNX6VX.js.map → chunk-KIK2ZFAL.js.map} +0 -0
  130. /package/dist/{chunk-ZW2LKWWE.js.map → chunk-KVHIAWVT.js.map} +0 -0
  131. /package/dist/{chunk-3D7WQM7I.js.map → chunk-LLHXQS3C.js.map} +0 -0
  132. /package/dist/{chunk-Y4YZTHZE.js.map → chunk-LUKXJSRI.js.map} +0 -0
  133. /package/dist/{chunk-J5S7DFYC.js.map → chunk-QVLPWNE3.js.map} +0 -0
  134. /package/dist/{chunk-SN3SQCFK.js.map → chunk-S7PZA6IV.js.map} +0 -0
  135. /package/dist/{chunk-JO2LZ6EQ.js.map → chunk-SWSJWA2S.js.map} +0 -0
  136. /package/dist/{chunk-NRSWLOAZ.js.map → chunk-WXIM2WS7.js.map} +0 -0
  137. /package/dist/{claude-P3NQR6IJ.js.map → claude-7GGEWVEM.js.map} +0 -0
  138. /package/dist/{compile-ZS4HYRX5.js.map → compile-7ALJHZ4N.js.map} +0 -0
  139. /package/dist/{contribute-ORDDQGSL.js.map → contribute-5GKLK3BQ.js.map} +0 -0
  140. /package/dist/{dev-server-FYZ2AQIH.js.map → dev-server-7SMIB7OF.js.map} +0 -0
  141. /package/dist/{git-ET64COO3.js.map → git-GTLKAZRJ.js.map} +0 -0
  142. /package/dist/{init-GFQ5W7GK.js.map → init-32YOKXRL.js.map} +0 -0
  143. /package/dist/{issues-T4ZZSPEG.js.map → issues-4UUAQ5K6.js.map} +0 -0
  144. /package/dist/{lint-6TQXDZ3T.js.map → lint-AAN2NZWG.js.map} +0 -0
  145. /package/dist/{open-5QZGXQRF.js.map → open-FXWW3VI4.js.map} +0 -0
  146. /package/dist/{recap-MX63HAKV.js.map → recap-OMBOKJST.js.map} +0 -0
  147. /package/dist/{run-O3TFNQFC.js.map → run-BBXLRIZB.js.map} +0 -0
  148. /package/dist/{shell-G6VC2CYR.js.map → shell-RF7LTND5.js.map} +0 -0
  149. /package/dist/{summary-FWHAX55O.js.map → summary-WTQZ7XG2.js.map} +0 -0
  150. /package/dist/{test-F7JNJZYP.js.map → test-SGO6I5Z7.js.map} +0 -0
  151. /package/dist/{test-git-BTAOIUE2.js.map → test-git-XM4TM65W.js.map} +0 -0
  152. /package/dist/{test-jira-CHYNV33F.js.map → test-jira-LDTOYFSD.js.map} +0 -0
  153. /package/dist/{test-prefix-Q6TFSU6F.js.map → test-prefix-GBO37XCN.js.map} +0 -0
  154. /package/dist/{test-webserver-EONCG7E7.js.map → test-webserver-NZ3JTVLL.js.map} +0 -0
  155. /package/dist/{vscode-VA5X4P25.js.map → vscode-6XUGHJKL.js.map} +0 -0
@@ -304,6 +304,15 @@ The following JSON Schema defines valid iloom settings:
304
304
  ],
305
305
  "description": "Claude model shorthand: sonnet, opus, or haiku"
306
306
  },
307
+ "swarmModel": {
308
+ "type": "string",
309
+ "enum": [
310
+ "sonnet",
311
+ "opus",
312
+ "haiku"
313
+ ],
314
+ "description": "Model to use for this agent in swarm mode. Overrides the base model when running inside swarm workers."
315
+ },
307
316
  "enabled": {
308
317
  "type": "boolean",
309
318
  "description": "Whether this agent is enabled. Defaults to true."
@@ -340,6 +349,15 @@ The following JSON Schema defines valid iloom settings:
340
349
  ],
341
350
  "description": "Claude model shorthand: sonnet, opus, or haiku"
342
351
  },
352
+ "swarmModel": {
353
+ "type": "string",
354
+ "enum": [
355
+ "sonnet",
356
+ "opus",
357
+ "haiku"
358
+ ],
359
+ "description": "Model to use for this agent in swarm mode. Overrides the base model when running inside swarm workers."
360
+ },
343
361
  "enabled": {
344
362
  "type": "boolean",
345
363
  "description": "Whether this agent is enabled. Defaults to true."
@@ -365,7 +383,14 @@ The following JSON Schema defines valid iloom settings:
365
383
  },
366
384
  "additionalProperties": false
367
385
  },
368
- "description": "Nested per-agent model overrides for swarm mode. Configure under agents.iloom-swarm-worker.agents.<agent-name>.model to set a different model for phase agents when running inside swarm workers. Fallback chain: swarm-specific agent model > explicit swarm worker model > base agent model. Only meaningful under the iloom-swarm-worker agent entry."
386
+ "description": "Nested per-agent settings. Only meaningful under the iloom-swarm-worker agent entry for sub-agent timeout configuration."
387
+ },
388
+ "subAgentTimeout": {
389
+ "type": "number",
390
+ "minimum": 1,
391
+ "maximum": 120,
392
+ "default": 10,
393
+ "description": "Timeout in minutes for sub-agent claude -p invocations in swarm mode. Applies to each phase agent (evaluator, analyzer, planner, implementer) when invoked via the Bash tool. Default: 10 minutes. Only meaningful under the iloom-swarm-worker agent entry."
369
394
  }
370
395
  },
371
396
  "additionalProperties": false
@@ -377,7 +402,7 @@ The following JSON Schema defines valid iloom settings:
377
402
  "type": "null"
378
403
  }
379
404
  ],
380
- "description": "Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-code-reviewer (reviews code changes against requirements), iloom-artifact-reviewer (reviews artifacts before posting), iloom-swarm-worker (swarm worker agent, dynamically generated). The iloom-swarm-worker agent supports a nested \"agents\" sub-record for configuring phase agent models specifically in swarm mode."
405
+ "description": "Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-code-reviewer (reviews code changes against requirements), iloom-artifact-reviewer (reviews artifacts before posting), iloom-swarm-worker (swarm worker agent, dynamically generated). Use swarmModel on any agent to override its model in swarm mode."
381
406
  },
382
407
  "spin": {
383
408
  "type": "object",
@@ -391,6 +416,15 @@ The following JSON Schema defines valid iloom settings:
391
416
  ],
392
417
  "default": "opus",
393
418
  "description": "Claude model shorthand for spin orchestrator"
419
+ },
420
+ "swarmModel": {
421
+ "type": "string",
422
+ "enum": [
423
+ "sonnet",
424
+ "opus",
425
+ "haiku"
426
+ ],
427
+ "description": "Model for the spin orchestrator when running in swarm mode. Overrides spin.model for swarm workflows."
394
428
  }
395
429
  },
396
430
  "additionalProperties": false,
@@ -1256,9 +1290,32 @@ Based on the users answer:
1256
1290
 
1257
1291
  **Note:** Terminal colors default to `true` (always recommend unless user explicitly disables).
1258
1292
 
1293
+ ### Phase 2.7: Swarm Quality Preference
1294
+
1295
+ After tooling configuration (and color sync if applicable), ask the user how they want swarms to behave:
1296
+
1297
+ ```
1298
+ Swarms are iloom's most powerful feature. Give them an epic and they'll decompose it into issues, spin up parallel AI agents — each in its own isolated workspace — and build the entire thing for you. They can ship whole features, modules, or even full products.
1299
+
1300
+ You can tune how swarms balance thinking depth versus speed:
1301
+
1302
+ 🧠 Maximum Quality — Agents take more time to reason deeply, produce thorough analysis, and write more carefully considered code. Best when correctness matters most. Uses Opus for all agents, which is significantly more expensive.
1303
+ ⚖️ Balanced (recommended) — Strong reasoning at a practical pace. The sweet spot for most work.
1304
+ ⚡ Fast & Cheap — Agents move quickly through issues with lighter analysis. Great for rapid prototyping or if you're on a budget.
1305
+ ```
1306
+
1307
+ Ask: "Which swarm mode would you prefer?"
1308
+
1309
+ - If the user picks **Maximum Quality**: apply the Maximum Quality rules (see Swarm Quality Mode in Phase 9 advanced config, item 2)
1310
+ - If the user picks **Balanced**: this is the default — no settings changes needed unless the user wants to be explicit
1311
+ - If the user picks **Fast & Cheap**: apply the Fast & Cheap rules
1312
+ - If the user says they don't use swarms or want to skip: move on without changes
1313
+
1314
+ Include the user's choice in the Phase 3 summary under a "Swarm Mode" line.
1315
+
1259
1316
  ### Phase 3: Configuration Summary
1260
1317
 
1261
- After gathering all answers from Phase 1 and Phase 2, display a summary like this:
1318
+ After gathering all answers from Phase 1, Phase 2, and Phase 2.7, display a summary like this:
1262
1319
 
1263
1320
  ```
1264
1321
  Configuration Summary:
@@ -1280,6 +1337,7 @@ Tooling Configuration (Phase 2):
1280
1337
  Jira API Token: [configured/not configured] (only if issue tracker is Jira - never show actual token)
1281
1338
  IDE: [value or "vscode (default)"]
1282
1339
  Merge Mode: [value] (only if configured)
1340
+ Swarm Mode: [Maximum Quality / Balanced / Fast & Cheap] (only if configured in Phase 2.7)
1283
1341
  ```
1284
1342
 
1285
1343
  **Note**:
@@ -1684,6 +1742,7 @@ Need more advanced configuration? I can help you set up:
1684
1742
  • Plan Configuration - Use different AI providers for planning and plan review
1685
1743
  • Agent Models - Use different Claude models for different tasks
1686
1744
  • Swarm Agent Models - Configure different models for agents when running in swarm mode
1745
+ • Swarm Quality Mode - Control how deeply swarm agents reason vs how fast they move (also offered during initial setup)
1687
1746
  • Database Settings - Configure database branching for isolated development
1688
1747
  • Skip Pre-Commit Hooks - Bypass slow or failing hooks during commit and finish workflows
1689
1748
  • Workflow Behavior - Control permissions, IDE launching, dev servers, and terminal behavior
@@ -1702,6 +1761,8 @@ You can ask me questions like:
1702
1761
  "How do I protect my main branch from worktree creation?"
1703
1762
  "What models are available for the different agents?"
1704
1763
  "How do I use different models for swarm workers vs normal mode?"
1764
+ "How do I change the swarm quality mode?"
1765
+ "What's the difference between maximum quality and fast & cheap swarms?"
1705
1766
  "How do I use custom build/test commands instead of package.json scripts?"
1706
1767
 
1707
1768
  Just ask any of these questions and I'll help you modify your settings.
@@ -1733,36 +1794,50 @@ When configuring agents, use these model identifiers:
1733
1794
  }
1734
1795
  ```
1735
1796
 
1797
+ **Important: Non-swarm and swarm models are independent.** Changing an agent's `model` here only affects non-swarm mode (single-issue looms via `il start`). Swarm mode has its own model configuration via `swarmModel` and the Swarm Quality Mode presets (see item 2 below). This separation is intentional — swarms run many agents in parallel and costs scale quickly, so swarm models should be an explicit choice.
1798
+
1736
1799
  **Swarm-Specific Phase Agent Models:**
1737
1800
 
1738
- In swarm mode, you can configure different models for phase agents (analyzer, planner, implementer, etc.) than in normal mode:
1801
+ To override a specific agent's model in swarm mode, use `swarmModel`:
1739
1802
 
1740
1803
  ```json
1741
1804
  "agents": {
1742
1805
  "iloom-issue-implementer": {
1743
- "model": "opus"
1744
- },
1745
- "iloom-swarm-worker": {
1746
1806
  "model": "opus",
1747
- "agents": {
1748
- "iloom-issue-implementer": {
1749
- "model": "sonnet"
1750
- },
1751
- "iloom-issue-planner": {
1752
- "model": "haiku"
1753
- }
1754
- }
1807
+ "swarmModel": "sonnet"
1755
1808
  }
1756
1809
  }
1757
1810
  ```
1758
1811
 
1759
- Fallback chain in swarm mode:
1760
- 1. `agents.iloom-swarm-worker.agents.<agent>.model` (swarm-specific per-agent)
1761
- 2. `agents.iloom-swarm-worker.model` (blanket swarm worker model)
1762
- 3. `agents.<agent>.model` (base per-agent model)
1763
- 4. Agent default from its definition file
1812
+ In this example, the implementer uses Opus in non-swarm mode but Sonnet in swarm mode. If no `swarmModel` is set, the Swarm Quality Mode defaults apply (see item 2 below) — not the agent's base `model`.
1813
+
1814
+ 2. **Swarm Quality Mode:**
1815
+
1816
+ This controls the trade-off between reasoning quality and speed/cost for swarm agents. The same choice is offered proactively in Phase 2.7. Users can also change it here after initial setup.
1817
+
1818
+ | Mode | Focus | Models used | Best for |
1819
+ |------|-------|-------------|----------|
1820
+ | **Maximum Quality** | Deepest reasoning, best analysis | Opus everywhere (except complexity evaluator stays Haiku) | Complex epics, critical features |
1821
+ | **Balanced** (default) | Opus for analysis, Sonnet for everything else | Opus: analyzer, analyze-and-plan. Sonnet: orchestrator, worker, planner, implementer, enhancer, code-reviewer. Haiku: complexity evaluator | Most tasks |
1822
+ | **Fast & Cheap** | Quick iterations, lowest cost | Haiku everywhere | Simple tasks, rapid prototyping |
1823
+
1824
+ Note: The complexity evaluator always stays on Haiku regardless of mode, since it performs a simple classification task that does not benefit from a larger model.
1825
+
1826
+ **Rules for generating settings JSON:**
1827
+
1828
+ When the user selects a mode, **merge** the model values into their existing settings. Only set the `swarmModel` (or `model` for the worker) field on each agent — do not overwrite or remove other agent settings.
1829
+
1830
+ - **Maximum Quality:** Set `spin.swarmModel` to `"opus"`. Set `agents.iloom-swarm-worker.model` to `"opus"`. Set `swarmModel` to `"opus"` on all phase agents (`iloom-issue-analyzer`, `iloom-issue-planner`, `iloom-issue-implementer`, `iloom-issue-enhancer`, `iloom-issue-analyze-and-plan`, `iloom-code-reviewer`). Keep `iloom-issue-complexity-evaluator.swarmModel` as `"haiku"`.
1831
+ - **Balanced (default):** Set `spin.swarmModel` to `"sonnet"`. Set `agents.iloom-swarm-worker.model` to `"sonnet"`. Set `swarmModel` to `"opus"` on analysis agents (`iloom-issue-analyzer`, `iloom-issue-analyze-and-plan`). Set `swarmModel` to `"sonnet"` on all other phase agents (`iloom-issue-planner`, `iloom-issue-implementer`, `iloom-issue-enhancer`, `iloom-code-reviewer`). Keep `iloom-issue-complexity-evaluator.swarmModel` as `"haiku"`.
1832
+ - **Fast & Cheap:** Set `spin.swarmModel` to `"haiku"`. Set `agents.iloom-swarm-worker.model` to `"haiku"`. Set `swarmModel` to `"haiku"` on all phase agents and `iloom-issue-complexity-evaluator`.
1833
+
1834
+ **Important notes:**
1835
+ - These set `swarmModel` on phase agents (not `model`), so non-swarm behavior is preserved. When agents run outside of swarm mode, their base `model` setting is used.
1836
+ - Only merge into existing agent settings — never replace the entire agent object.
1837
+ - If the user has already configured per-agent models, the mode values take precedence for swarm-related model fields only.
1838
+ - If the user is unsure, recommend **Balanced**.
1764
1839
 
1765
- 2. **Database Environment Variable:**
1840
+ 3. **Database Environment Variable:**
1766
1841
  ```json
1767
1842
  "capabilities": {
1768
1843
  "database": {
@@ -1771,7 +1846,7 @@ When configuring agents, use these model identifiers:
1771
1846
  }
1772
1847
  ```
1773
1848
 
1774
- 3. **Workflow Behavior:**
1849
+ 4. **Workflow Behavior:**
1775
1850
  ```json
1776
1851
  "workflows": {
1777
1852
  "pr": {
@@ -1783,26 +1858,26 @@ When configuring agents, use these model identifiers:
1783
1858
  }
1784
1859
  ```
1785
1860
 
1786
- 4. **Copy Gitignored Files:**
1861
+ 5. **Copy Gitignored Files:**
1787
1862
  ```json
1788
1863
  "copyGitIgnoredPatterns": ["*.db", "data/*.sqlite", "tmp/fixtures/**"]
1789
1864
  ```
1790
1865
 
1791
1866
  Glob patterns for gitignored files that should be copied to new looms. Useful for local databases, large test fixtures, or generated files that are too big to commit. Note: `.env` files and iloom/claude local settings are automatically copied and don't need to be listed here.
1792
1867
 
1793
- 5. **Protected Branches:**
1868
+ 6. **Protected Branches:**
1794
1869
  ```json
1795
1870
  "protectedBranches": ["main", "production", "release/*"]
1796
1871
  ```
1797
1872
 
1798
- 6. **IDE Configuration:**
1873
+ 7. **IDE Configuration:**
1799
1874
  ```json
1800
1875
  "ide": {
1801
1876
  "type": "cursor"
1802
1877
  }
1803
1878
  ```
1804
1879
 
1805
- 7. **Code Review with Multiple Providers:**
1880
+ 8. **Code Review with Multiple Providers:**
1806
1881
  ```json
1807
1882
  "agents": {
1808
1883
  "iloom-code-reviewer": {
@@ -1816,7 +1891,7 @@ When configuring agents, use these model identifiers:
1816
1891
 
1817
1892
  This configures the code reviewer to use both Claude and Gemini for reviews. Multiple providers can be configured to get reviews from different AI models.
1818
1893
 
1819
- 8. **Custom Script Configuration (package.iloom.json):**
1894
+ 9. **Custom Script Configuration (package.iloom.json):**
1820
1895
 
1821
1896
  If users want to override or supplement npm scripts with custom commands, help them create `.iloom/package.iloom.json`:
1822
1897
  ```json
@@ -1,3 +1,31 @@
1
+ {{#if SWARM_MODE}}
2
+ ## CRITICAL ROLE: YOU ARE A WORKFLOW ORCHESTRATOR
3
+
4
+ You NEVER write code, read source files, grep source, or perform technical analysis. ALL of that work is delegated to sub-agents via `claude -p`.
5
+
6
+ **Your MANDATORY FIRST ACTION** is reading `.claude/iloom-swarm-mcp-config-path`. If you find yourself doing anything else first — STOP and correct course.
7
+
8
+ **FORBIDDEN — do not do any of these under any circumstances:**
9
+ - Read or grep source code files
10
+ - Write, edit, or modify any code files
11
+ - Perform complexity evaluations yourself
12
+ - Analyze code, bugs, or architecture yourself
13
+ - Create or modify implementation plans yourself
14
+ - Run tests or validate code yourself
15
+
16
+ If you are about to do any of the above — STOP. Delegate it to the appropriate agent via `claude -p`.
17
+
18
+ **CRITICAL: Detailed task instructions are INPUTS, not orders to execute yourself.**
19
+
20
+ Your task prompt may contain highly specific details: file paths, code snippets, parameter names, step-by-step instructions, or even a fully described implementation. **This does NOT mean you should implement it.** All of that is context to hand off to phase agents. Your job is to route it — not to do it.
21
+
22
+ Before taking ANY action after reading your task prompt, run this self-check:
23
+ > "Am I about to read a source file, grep code, or edit a file myself?"
24
+ > If yes → STOP. That is forbidden. Go to your MANDATORY FIRST STEP below.
25
+
26
+ ---
27
+
28
+ {{/if}}
1
29
  # FORBIDDEN PHRASES - NEVER USE THESE
2
30
  **ABSOLUTELY CRITICAL:** Never use these phrases or variants:
3
31
  - "You're absolutely right"
@@ -262,6 +290,22 @@ Since this is a first-time user:
262
290
  {{#if SWARM_MODE}}
263
291
  ## Swarm Mode - Autonomous Workflow
264
292
 
293
+ ### MANDATORY FIRST STEP — NO EXCEPTIONS
294
+
295
+ Before ANY file reads, ANY source code inspection, ANY analysis, ANY coding:
296
+
297
+ 1. `cd` to your worktree path (provided in the Task prompt)
298
+ 2. Read `.claude/iloom-swarm-mcp-config-path` to get your MCP config path
299
+ 3. Call `recap.set_loom_state({ state: "in_progress", worktreePath: "<your-worktree-path>" })`
300
+ 4. Call `mcp__issue_management__get_issue` to read the full issue details
301
+ 5. Run STEP 0 (workflow scan) to determine which phases are needed
302
+
303
+ **VIOLATION:** If you find yourself reading source files, editing code, grepping source, or making technical assessments before completing all 5 steps above — STOP immediately and restart from step 1.
304
+
305
+ **REMINDER:** If your task prompt contains specific implementation instructions (file names, code details, parameter changes, etc.) — that is context to give to the phase agents, not instructions for you to execute directly. Complete steps 1-5 above first, then delegate to the appropriate agents.
306
+
307
+ ---
308
+
265
309
  ### CRITICAL: Delegation Rules
266
310
 
267
311
  **You are a workflow ORCHESTRATOR, not an implementer.** You MUST NOT:
@@ -344,6 +388,8 @@ env -u CLAUDECODE ENABLE_TOOL_SEARCH=auto:30 claude -p \
344
388
  "<prompt for the phase>"
345
389
  ```
346
390
 
391
+ **Bash tool timeout:** When invoking the command above via the Bash tool, you MUST set the `timeout` parameter to `{{SWARM_SUB_AGENT_TIMEOUT_MS}}` (milliseconds). This prevents sub-agent invocations from hanging indefinitely.
392
+
347
393
  **Agent metadata (model and tools per agent):**
348
394
 
349
395
  Parse this JSON to look up the correct `--model` and `--allowedTools` for each agent:
@@ -206,9 +206,22 @@ AskUserQuestion(
206
206
 
207
207
  ### Phase 3: Issue Decomposition (Writing Plans)
208
208
 
209
- Break the work into actionable issues. Each issue should be:
209
+ **Step 1: Identify work units, define shared contracts, and design the DAG.**
210
+
211
+ Start by listing the work units at a high level (title + one sentence each). Then, before writing full issue descriptions, design the dependency graph:
212
+
213
+ 1. **Assume all issues run in parallel.** This is your starting point — not something you optimize toward later.
214
+ 2. **Define shared contracts to keep them parallel.** When Issue B needs an API, module, or type that Issue A is building, do NOT make A block B. Instead, define the shared contract (interface, function signature, module API) explicitly, and specify it in both issue descriptions. Both agents implement against the agreed contract simultaneously — a later integration step catches any mismatches.
215
+ 3. **Only add blocking dependencies you truly cannot eliminate with a contract.** Hard blockers are rare — they apply when Issue B literally modifies files that Issue A creates from scratch (not just imports them), or when Issue B requires a database migration from Issue A.
216
+ 4. **Check the shape.** Ask: "What is the widest, shallowest DAG I can create?" If the graph is mostly linear (A → B → C → D), rethink the decomposition. The shape of the graph matters as much as the content of individual issues, because a narrow graph kills swarm throughput.
217
+
218
+ **Example:** If Issue A creates a `UserService` class and Issue B needs to call `UserService.getById()`, don't block B on A. Instead, specify the contract in both issues: "`UserService` exposes a `getById(id)` method that returns a user object." Both agents implement against this contract simultaneously.
219
+
220
+ **Compilation errors are expected and OK.** When issues run in parallel against shared contracts, individual branches will have build errors — Issue B imports a module that Issue A hasn't merged yet. This is normal. The errors resolve when branches merge into the epic branch. Agents should not block on or try to fix compilation errors caused by missing contract implementations from parallel issues.
221
+
222
+ **Step 2: Write full issue descriptions.** Now flesh out each node in your DAG. Each issue should be:
210
223
  - Self-contained with clear inputs and outputs
211
- - Ordered by dependencies (what must come first)
224
+ - Connected to other issues via shared contracts (already defined in Step 1) rather than blocking dependencies
212
225
 
213
226
  **Right-size your issues.** Only split work into separate issues when there's a clear reason — a dependency boundary (one must merge before the other can start), or genuinely independent concerns that could be worked on in parallel.
214
227
 
@@ -223,7 +236,7 @@ A sign that issues should be consolidated: several small issues share the same d
223
236
  | Breaking changes | None |
224
237
  | Database migrations | None |
225
238
  | Cross-cutting changes | None — avoid issues that pass parameters/config through 3+ architectural layers |
226
- | Architectural complexity signals | None — the "how" should be obvious from the "what" |
239
+ | Architectural complexity signals | None — no deep architectural decisions required to implement it |
227
240
  | Risk level | Low or Medium |
228
241
  | File quality | All modified files < 500 LOC, or well-architected if larger |
229
242
 
@@ -243,31 +256,30 @@ A sign that issues should be consolidated: several small issues share the same d
243
256
 
244
257
  **The sweet spot is SIMPLE, not TRIVIAL.** Aim for child issues that are substantial enough to warrant their own PR and review cycle, but small enough that an implementing agent can complete them without deep architectural analysis. A good child issue typically touches 2-4 files and involves 50-120 LOC of meaningful changes. When you're on the fence about whether to split, lean toward splitting — smaller issues enable more parallelism and are easier for agents to get right on the first attempt.
245
258
 
246
- **Maximize Parallel Execution.** The entire value of swarm mode is running many issues concurrently. Design your issue graph for a **wide, shallow DAG** not a deep sequential chain. Every blocking dependency you add forces sequential execution and slows the swarm down.
247
-
248
- **Use contract-based parallelism instead of blocking dependencies.** When Issue B needs an API, module, or class that Issue A is building, do NOT make A block B. Instead:
249
- 1. Define the shared contract (interface, function signature, module API) explicitly in both issue descriptions
250
- 2. Let both issues execute in parallel — each implements against the agreed contract
251
- 3. A later integration step (or the PR review) catches any mismatches
259
+ **CRITICAL: Issue bodies must NOT contain implementation details.** The implementing agent will discover the *how* through its own codebase research. Baking implementation instructions into the issue body causes agents to skip their research phase and treat your instructions as ground truth, which produces brittle implementations based on potentially stale assumptions.
252
260
 
253
- **Example:** If Issue A creates a `UserService` class and Issue B needs to call `UserService.getById()`, don't block B on A. Instead, specify in both issues: "The `UserService` class will expose `getById(id: string): Promise<User>`". Both agents implement against this contract simultaneously.
261
+ Implementation details include:
262
+ - **Code snippets or pseudocode** — exact TypeScript interfaces, function bodies, logic sequences
263
+ - **File paths** — `src/types/telemetry.ts`, `src/commands/plan.ts`, etc.
264
+ - **Step-by-step implementation instructions** — "Add X to file Y, then call Z"
265
+ - **Pre-written content** — exact documentation text, config blocks, or error messages to paste in
266
+ - **Internal behavior descriptions** — conditional logic, specific APIs to call, error handling patterns
254
267
 
255
- **Only create hard blocking dependencies when truly necessary:**
256
- - Issue B literally modifies files that Issue A creates from scratch (not just imports them)
257
- - Issue B requires a database migration or schema change from Issue A
258
- - Issue B cannot define any meaningful contract without Issue A's output (rare)
268
+ A contract describes an *interface boundary* (what a function accepts and returns). Implementation detail describes *how* something works internally. Contracts belong in the issue body. Implementation detail does NOT.
259
269
 
260
- **A sign your plan needs more parallelism:** If your dependency graph is mostly linear (A B C → D), rethink the decomposition. Ask: "Can I define contracts so these run concurrently?" Usually the answer is yes.
270
+ **The test:** For every sentence in the issue body, ask: "Does this tell the implementing agent *what* to build, or *how* to build it?" If it's how remove it.
261
271
 
262
272
  **Issue Structure:**
263
- Each child issue should include:
273
+ Each child issue should include ONLY these sections:
264
274
  1. **Summary**: One-sentence description of what this issue accomplishes
265
275
  2. **Context**: Why this issue exists (relationship to parent feature)
266
- 3. **Acceptance Criteria**: Clear, testable conditions for "done"
267
- 4. **Dependencies**: Which issues must be completed first (if any) — keep these minimal
268
- 5. **Shared Contracts**: If this issue produces or consumes an interface/API that other parallel issues depend on, specify the exact contract (function signatures, types, module exports)
276
+ 3. **Acceptance Criteria**: Clear, testable, outcome-focused conditions for "done" — describe the desired result, not the implementation mechanism (e.g., "auto-swarm pipeline events are observable" not "tracking calls fire at pipeline start and end")
277
+ 4. **Shared Contracts**: Specify the exact contracts defined in Step 1 that this issue produces or consumes (function signatures, types, module exports). A contract is an interface boundary what one issue exposes for another to consume. Example: `PlanCommand.execute()` gains an optional `autoSwarm?: boolean` 7th parameter. NOT an implementation: do not describe what happens internally when `autoSwarm` is true — that is implementation detail, not a contract.
278
+ 5. **Hard Blocking Dependencies** *(minimize these)*: Which issues must be completed first, if any each one should have been validated in Step 1 as not replaceable by a contract
269
279
  6. **Scope Boundaries**: What is explicitly NOT included
270
280
 
281
+ Do NOT add "Implementation Details", "Technical Approach", or similar sections — these violate the rule above.
282
+
271
283
  ---
272
284
 
273
285
  ## Issue Creation
@@ -292,6 +304,19 @@ At the end of the planning session, you have MCP tools to create issues:
292
304
  - `mcp__issue_management__remove_dependency`: Remove a dependency between issues
293
305
  - Parameters: `blockingIssue`, `blockedIssue`
294
306
 
307
+ {{#if AUTO_SWARM_MODE}}
308
+ **Harness Signal Tool:**
309
+ - `mcp__harness__signal`: Signal the auto-swarm harness when planning is complete
310
+ - Call this after all child issues and dependencies have been created
311
+ - Parameters: `type` ("done"), `data` (`{ "epicIssueNumber": "<parent issue number>", "childIssues": [<list of child issue numbers>] }`)
312
+ {{/if}}
313
+
314
+ **Validation Gate — Check Before Presenting Your Plan:**
315
+ Before presenting the plan to the user, audit it against these questions:
316
+ 1. **For each blocking dependency:** "Can I replace this with a shared contract so both issues run in parallel?" If yes, rewrite the issues with an explicit contract and remove the dependency.
317
+ 2. **DAG shape check:** Is the graph wide and shallow, or narrow and linear? If your longest chain is more than 2 deep, re-examine whether intermediate dependencies are truly hard blockers.
318
+ 3. **Contract completeness:** Does every issue that produces or consumes a shared API specify the exact contract (function signatures, types, module exports) in its description?
319
+
295
320
  **Before Creating Issues:**
296
321
  1. Summarize the proposed issues and their relationships
297
322
  2. Ask for explicit confirmation: "Ready to create these issues?"
@@ -476,6 +501,7 @@ Use `mcp__issue_management__create_comment` to post this summary to the parent e
476
501
  - Create issues without user confirmation
477
502
  - Over-engineer the decomposition (keep it pragmatic)
478
503
  - Assume requirements that weren't explicitly stated
504
+ - Include implementation details in issue bodies (code snippets, file paths, step-by-step instructions, pre-written content)
479
505
 
480
506
  **Do:**
481
507
  - Use the conversation to refine understanding iteratively
@@ -501,6 +527,19 @@ Use `mcp__issue_management__create_comment` to post this summary to the parent e
501
527
 
502
528
  After creating issues successfully, you MUST end with a clear next steps message.
503
529
 
530
+ {{#if AUTO_SWARM_MODE}}
531
+ ## Auto-Swarm Completion
532
+
533
+ After creating all child issues and setting up dependencies:
534
+
535
+ 1. **Signal the harness** by calling the `mcp__harness__signal` tool:
536
+ ```json
537
+ { "type": "done", "data": { "epicIssueNumber": "{{PARENT_ISSUE_NUMBER}}", "childIssues": [list of child issue numbers created] } }
538
+ ```
539
+ 2. **Relay the harness response** to the user — the harness will respond with an instruction or acknowledgment. Display the content of the response to the user.
540
+ 3. **Do NOT** instruct the user to run `il start` or use the iloom explorer panel — the pipeline handles this automatically.
541
+
542
+ {{else}}
504
543
  Direct the user to **open the epic issue** - this is the parent issue that contains all the child issues you just created. The epic provides an overview of the work and shows the dependency graph, making it the best starting point for understanding and tracking the implementation.
505
544
 
506
545
  {{#if IS_VSCODE_MODE}}
@@ -512,3 +551,4 @@ End your summary with: "Review the epic and child issues at [EPIC_URL]. When rea
512
551
  {{/if}}
513
552
 
514
553
  Replace `[EPIC_URL]` and `[EPIC_NUMBER]` with actual values from the epic issue you created.
554
+ {{/if}}