@iloom/cli 0.9.2 → 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 (231) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +160 -41
  3. package/dist/{BranchNamingService-K6XNWQ6C.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/{GitHubService-TGWJN4V4.js → GitHubService-MEHKHUQP.js} +4 -4
  7. package/dist/IssueTrackerFactory-NG53YX5S.js +14 -0
  8. package/dist/{LoomLauncher-73NXL2CL.js → LoomLauncher-TDLZSYG2.js} +9 -9
  9. package/dist/{MetadataManager-W3C54UYT.js → MetadataManager-5QZSTKNN.js} +2 -2
  10. package/dist/{ProjectCapabilityDetector-N5L7T4IY.js → ProjectCapabilityDetector-5KSYUTBJ.js} +3 -3
  11. package/dist/{PromptTemplateManager-36YLQRHP.js → PromptTemplateManager-YOE2SIPG.js} +2 -2
  12. package/dist/README.md +160 -41
  13. package/dist/{SettingsManager-AW3JTJHD.js → SettingsManager-FNKCOZMQ.js} +4 -2
  14. package/dist/agents/iloom-artifact-reviewer.md +11 -0
  15. package/dist/agents/iloom-code-reviewer.md +14 -0
  16. package/dist/agents/iloom-issue-analyze-and-plan.md +55 -12
  17. package/dist/agents/iloom-issue-analyzer.md +49 -6
  18. package/dist/agents/iloom-issue-complexity-evaluator.md +47 -6
  19. package/dist/agents/iloom-issue-enhancer.md +86 -7
  20. package/dist/agents/iloom-issue-implementer.md +48 -7
  21. package/dist/agents/iloom-issue-planner.md +115 -62
  22. package/dist/{build-THZI572G.js → build-VHGEMXBA.js} +9 -9
  23. package/dist/chunk-4232AHNQ.js +35 -0
  24. package/dist/chunk-4232AHNQ.js.map +1 -0
  25. package/dist/chunk-4E7LCFUG.js +24 -0
  26. package/dist/chunk-4E7LCFUG.js.map +1 -0
  27. package/dist/{chunk-AR5QKYNE.js → chunk-4FGEGQW4.js} +4 -4
  28. package/dist/{chunk-R4YWBGY6.js → chunk-5FJWO4IT.js} +67 -22
  29. package/dist/chunk-5FJWO4IT.js.map +1 -0
  30. package/dist/{chunk-VPTAX5TR.js → chunk-5RPBYK5Q.js} +35 -30
  31. package/dist/chunk-5RPBYK5Q.js.map +1 -0
  32. package/dist/{chunk-YKFCCV6S.js → chunk-63QWFWH3.js} +7 -7
  33. package/dist/chunk-63QWFWH3.js.map +1 -0
  34. package/dist/{chunk-RI2YL6TK.js → chunk-7VHJNVLF.js} +80 -23
  35. package/dist/chunk-7VHJNVLF.js.map +1 -0
  36. package/dist/{chunk-B7U6OKUR.js → chunk-C6HNNJIV.js} +11 -3
  37. package/dist/chunk-C6HNNJIV.js.map +1 -0
  38. package/dist/{chunk-A7NJF73J.js → chunk-CVCTIDDK.js} +4 -4
  39. package/dist/{chunk-Z2TWEXR7.js → chunk-E6KOWMKA.js} +6 -6
  40. package/dist/chunk-E6KOWMKA.js.map +1 -0
  41. package/dist/{chunk-3I4ONZRT.js → chunk-EVPZFV3K.js} +10 -10
  42. package/dist/chunk-EVPZFV3K.js.map +1 -0
  43. package/dist/{chunk-IZIYLYPK.js → chunk-G5V75JD5.js} +2 -2
  44. package/dist/chunk-GRISNU6G.js +651 -0
  45. package/dist/chunk-GRISNU6G.js.map +1 -0
  46. package/dist/chunk-HEXKPKCK.js +1396 -0
  47. package/dist/chunk-HEXKPKCK.js.map +1 -0
  48. package/dist/{chunk-TC7APDKU.js → chunk-I5T677EA.js} +2 -2
  49. package/dist/{chunk-KBEIQP4G.js → chunk-KB64WNBZ.js} +43 -3
  50. package/dist/chunk-KB64WNBZ.js.map +1 -0
  51. package/dist/{chunk-NWMORW3U.js → chunk-KIK2ZFAL.js} +2 -2
  52. package/dist/{chunk-CWRI4JC3.js → chunk-KKV5WH5M.js} +30 -31
  53. package/dist/chunk-KKV5WH5M.js.map +1 -0
  54. package/dist/{chunk-DGG2VY7B.js → chunk-KVHIAWVT.js} +9 -9
  55. package/dist/chunk-KVHIAWVT.js.map +1 -0
  56. package/dist/{chunk-OFDN5NKS.js → chunk-KXDRI47U.js} +69 -12
  57. package/dist/chunk-KXDRI47U.js.map +1 -0
  58. package/dist/{chunk-NUACL52E.js → chunk-LLHXQS3C.js} +2 -2
  59. package/dist/chunk-LUKXJSRI.js +73 -0
  60. package/dist/chunk-LUKXJSRI.js.map +1 -0
  61. package/dist/{chunk-TL72BGP6.js → chunk-MORRVYPT.js} +2 -2
  62. package/dist/chunk-OTGH2HRS.js +1427 -0
  63. package/dist/chunk-OTGH2HRS.js.map +1 -0
  64. package/dist/{chunk-7ZEHSSUP.js → chunk-P4O6EH46.js} +4 -4
  65. package/dist/{chunk-KAYXR544.js → chunk-QVLPWNE3.js} +2 -2
  66. package/dist/chunk-QZWEJVWV.js +207 -0
  67. package/dist/chunk-QZWEJVWV.js.map +1 -0
  68. package/dist/chunk-RJ3VBUFK.js +781 -0
  69. package/dist/chunk-RJ3VBUFK.js.map +1 -0
  70. package/dist/chunk-RSYT7MVI.js +202 -0
  71. package/dist/chunk-RSYT7MVI.js.map +1 -0
  72. package/dist/{chunk-6IIL5M2L.js → chunk-S7PZA6IV.js} +10 -8
  73. package/dist/{chunk-6IIL5M2L.js.map → chunk-S7PZA6IV.js.map} +1 -1
  74. package/dist/chunk-SKSYYBCU.js +229 -0
  75. package/dist/chunk-SKSYYBCU.js.map +1 -0
  76. package/dist/{chunk-ULSWCPQG.js → chunk-SWSJWA2S.js} +476 -5
  77. package/dist/chunk-SWSJWA2S.js.map +1 -0
  78. package/dist/{chunk-KXGQYLFZ.js → chunk-UKBAJ2QQ.js} +61 -7
  79. package/dist/chunk-UKBAJ2QQ.js.map +1 -0
  80. package/dist/{chunk-FO5GGFOV.js → chunk-UR5DGNUO.js} +71 -9
  81. package/dist/chunk-UR5DGNUO.js.map +1 -0
  82. package/dist/{chunk-QN47QVBX.js → chunk-UUEW5KWB.js} +1 -1
  83. package/dist/chunk-UUEW5KWB.js.map +1 -0
  84. package/dist/{chunk-4CO6KG5S.js → chunk-VG45TUYK.js} +53 -7
  85. package/dist/{chunk-4CO6KG5S.js.map → chunk-VG45TUYK.js.map} +1 -1
  86. package/dist/{chunk-4LKGCFGG.js → chunk-WWKOVDWC.js} +2 -2
  87. package/dist/{chunk-KJTVU3HZ.js → chunk-WXIM2WS7.js} +8 -8
  88. package/dist/chunk-WXIM2WS7.js.map +1 -0
  89. package/dist/{chunk-VOGGLPG5.js → chunk-YQ57ORTV.js} +14 -1
  90. package/dist/chunk-YQ57ORTV.js.map +1 -0
  91. package/dist/{chunk-SOSQILHO.js → chunk-ZNMPGMHY.js} +44 -797
  92. package/dist/chunk-ZNMPGMHY.js.map +1 -0
  93. package/dist/{claude-TP2QO3BU.js → claude-7GGEWVEM.js} +2 -2
  94. package/dist/{cleanup-PJRIFFU4.js → cleanup-6PVAC4NI.js} +85 -34
  95. package/dist/cleanup-6PVAC4NI.js.map +1 -0
  96. package/dist/cli.js +630 -801
  97. package/dist/cli.js.map +1 -1
  98. package/dist/{commit-IVP3M4HG.js → commit-FZR5XDQG.js} +26 -23
  99. package/dist/commit-FZR5XDQG.js.map +1 -0
  100. package/dist/{compile-R2J65HBQ.js → compile-7ALJHZ4N.js} +9 -9
  101. package/dist/{contribute-VDZXHK5Y.js → contribute-5GKLK3BQ.js} +14 -6
  102. package/dist/contribute-5GKLK3BQ.js.map +1 -0
  103. package/dist/{dev-server-7F622OEO.js → dev-server-7SMIB7OF.js} +29 -15
  104. package/dist/dev-server-7SMIB7OF.js.map +1 -0
  105. package/dist/{feedback-E7VET7CL.js → feedback-G2GJFN2F.js} +18 -16
  106. package/dist/{feedback-E7VET7CL.js.map → feedback-G2GJFN2F.js.map} +1 -1
  107. package/dist/{git-2QDQ2X2S.js → git-GTLKAZRJ.js} +4 -4
  108. package/dist/hooks/iloom-hook.js +15 -0
  109. package/dist/ignite-H2O5Y5A2.js +34 -0
  110. package/dist/ignite-H2O5Y5A2.js.map +1 -0
  111. package/dist/index.d.ts +482 -58
  112. package/dist/index.js +1340 -44
  113. package/dist/index.js.map +1 -1
  114. package/dist/{init-676DHF6R.js → init-32YOKXRL.js} +57 -21
  115. package/dist/init-32YOKXRL.js.map +1 -0
  116. package/dist/{issues-PJSOLOBJ.js → issues-4UUAQ5K6.js} +61 -20
  117. package/dist/issues-4UUAQ5K6.js.map +1 -0
  118. package/dist/{lint-CJM7BAIM.js → lint-AAN2NZWG.js} +9 -9
  119. package/dist/mcp/harness-server.js +140 -0
  120. package/dist/mcp/harness-server.js.map +1 -0
  121. package/dist/mcp/issue-management-server.js +2599 -262
  122. package/dist/mcp/issue-management-server.js.map +1 -1
  123. package/dist/mcp/recap-server.js +144 -21
  124. package/dist/mcp/recap-server.js.map +1 -1
  125. package/dist/{neon-helpers-VVFFTLXE.js → neon-helpers-CQN2PB4S.js} +3 -3
  126. package/dist/neon-helpers-CQN2PB4S.js.map +1 -0
  127. package/dist/{open-544H7JF5.js → open-FXWW3VI4.js} +15 -15
  128. package/dist/open-FXWW3VI4.js.map +1 -0
  129. package/dist/{plan-Q7ELXDLC.js → plan-RQ5FPIGF.js} +358 -40
  130. package/dist/plan-RQ5FPIGF.js.map +1 -0
  131. package/dist/{projects-LH362JZQ.js → projects-2UOXFLNZ.js} +4 -4
  132. package/dist/prompts/CLAUDE.md +62 -0
  133. package/dist/prompts/init-prompt.txt +430 -34
  134. package/dist/prompts/issue-prompt.txt +473 -54
  135. package/dist/prompts/plan-prompt.txt +140 -19
  136. package/dist/prompts/pr-prompt.txt +44 -1
  137. package/dist/prompts/regular-prompt.txt +42 -1
  138. package/dist/prompts/session-summary-prompt.txt +14 -0
  139. package/dist/prompts/swarm-orchestrator-prompt.txt +464 -0
  140. package/dist/{rebase-YND35CIE.js → rebase-6NVLX5V7.js} +21 -12
  141. package/dist/rebase-6NVLX5V7.js.map +1 -0
  142. package/dist/{recap-3W7COH7D.js → recap-OMBOKJST.js} +47 -19
  143. package/dist/recap-OMBOKJST.js.map +1 -0
  144. package/dist/{run-QUXJKDQQ.js → run-BBXLRIZB.js} +15 -15
  145. package/dist/run-BBXLRIZB.js.map +1 -0
  146. package/dist/schema/package-iloom.schema.json +58 -0
  147. package/dist/schema/settings.schema.json +149 -15
  148. package/dist/{shell-QGECBLST.js → shell-RF7LTND5.js} +14 -7
  149. package/dist/shell-RF7LTND5.js.map +1 -0
  150. package/dist/{summary-G2T4452H.js → summary-WTQZ7XG2.js} +27 -25
  151. package/dist/summary-WTQZ7XG2.js.map +1 -0
  152. package/dist/{test-EA5NQFDC.js → test-SGO6I5Z7.js} +9 -9
  153. package/dist/{test-git-M7LSLEFL.js → test-git-XM4TM65W.js} +4 -4
  154. package/dist/test-jira-LDTOYFSD.js +96 -0
  155. package/dist/test-jira-LDTOYFSD.js.map +1 -0
  156. package/dist/{test-prefix-64NAAUON.js → test-prefix-GBO37XCN.js} +4 -4
  157. package/dist/{test-webserver-OK6Z5FJM.js → test-webserver-NZ3JTVLL.js} +6 -6
  158. package/dist/{vscode-AR5NNXXI.js → vscode-6XUGHJKL.js} +7 -7
  159. package/package.json +5 -1
  160. package/dist/ClaudeContextManager-HR5JQKAI.js +0 -14
  161. package/dist/ClaudeService-TK7FMC2X.js +0 -13
  162. package/dist/chunk-3I4ONZRT.js.map +0 -1
  163. package/dist/chunk-B7U6OKUR.js.map +0 -1
  164. package/dist/chunk-CWRI4JC3.js.map +0 -1
  165. package/dist/chunk-DGG2VY7B.js.map +0 -1
  166. package/dist/chunk-FJDRTVJX.js +0 -520
  167. package/dist/chunk-FJDRTVJX.js.map +0 -1
  168. package/dist/chunk-FO5GGFOV.js.map +0 -1
  169. package/dist/chunk-KBEIQP4G.js.map +0 -1
  170. package/dist/chunk-KJTVU3HZ.js.map +0 -1
  171. package/dist/chunk-KXGQYLFZ.js.map +0 -1
  172. package/dist/chunk-OFDN5NKS.js.map +0 -1
  173. package/dist/chunk-QN47QVBX.js.map +0 -1
  174. package/dist/chunk-R4YWBGY6.js.map +0 -1
  175. package/dist/chunk-RI2YL6TK.js.map +0 -1
  176. package/dist/chunk-SOSQILHO.js.map +0 -1
  177. package/dist/chunk-ULSWCPQG.js.map +0 -1
  178. package/dist/chunk-VOGGLPG5.js.map +0 -1
  179. package/dist/chunk-VPTAX5TR.js.map +0 -1
  180. package/dist/chunk-W6DP5RVR.js +0 -101
  181. package/dist/chunk-W6DP5RVR.js.map +0 -1
  182. package/dist/chunk-WHI5KEOX.js +0 -121
  183. package/dist/chunk-WHI5KEOX.js.map +0 -1
  184. package/dist/chunk-YKFCCV6S.js.map +0 -1
  185. package/dist/chunk-Z2TWEXR7.js.map +0 -1
  186. package/dist/cleanup-PJRIFFU4.js.map +0 -1
  187. package/dist/commit-IVP3M4HG.js.map +0 -1
  188. package/dist/contribute-VDZXHK5Y.js.map +0 -1
  189. package/dist/dev-server-7F622OEO.js.map +0 -1
  190. package/dist/ignite-IW35CDBD.js +0 -784
  191. package/dist/ignite-IW35CDBD.js.map +0 -1
  192. package/dist/init-676DHF6R.js.map +0 -1
  193. package/dist/issues-PJSOLOBJ.js.map +0 -1
  194. package/dist/open-544H7JF5.js.map +0 -1
  195. package/dist/plan-Q7ELXDLC.js.map +0 -1
  196. package/dist/rebase-YND35CIE.js.map +0 -1
  197. package/dist/recap-3W7COH7D.js.map +0 -1
  198. package/dist/run-QUXJKDQQ.js.map +0 -1
  199. package/dist/shell-QGECBLST.js.map +0 -1
  200. package/dist/summary-G2T4452H.js.map +0 -1
  201. /package/dist/{BranchNamingService-K6XNWQ6C.js.map → BranchNamingService-25KSZAEM.js.map} +0 -0
  202. /package/dist/{ClaudeContextManager-HR5JQKAI.js.map → ClaudeContextManager-66GR4BGM.js.map} +0 -0
  203. /package/dist/{ClaudeService-TK7FMC2X.js.map → ClaudeService-7KM5NA5Z.js.map} +0 -0
  204. /package/dist/{GitHubService-TGWJN4V4.js.map → GitHubService-MEHKHUQP.js.map} +0 -0
  205. /package/dist/{MetadataManager-W3C54UYT.js.map → IssueTrackerFactory-NG53YX5S.js.map} +0 -0
  206. /package/dist/{LoomLauncher-73NXL2CL.js.map → LoomLauncher-TDLZSYG2.js.map} +0 -0
  207. /package/dist/{ProjectCapabilityDetector-N5L7T4IY.js.map → MetadataManager-5QZSTKNN.js.map} +0 -0
  208. /package/dist/{PromptTemplateManager-36YLQRHP.js.map → ProjectCapabilityDetector-5KSYUTBJ.js.map} +0 -0
  209. /package/dist/{SettingsManager-AW3JTJHD.js.map → PromptTemplateManager-YOE2SIPG.js.map} +0 -0
  210. /package/dist/{claude-TP2QO3BU.js.map → SettingsManager-FNKCOZMQ.js.map} +0 -0
  211. /package/dist/{build-THZI572G.js.map → build-VHGEMXBA.js.map} +0 -0
  212. /package/dist/{chunk-AR5QKYNE.js.map → chunk-4FGEGQW4.js.map} +0 -0
  213. /package/dist/{chunk-A7NJF73J.js.map → chunk-CVCTIDDK.js.map} +0 -0
  214. /package/dist/{chunk-IZIYLYPK.js.map → chunk-G5V75JD5.js.map} +0 -0
  215. /package/dist/{chunk-TC7APDKU.js.map → chunk-I5T677EA.js.map} +0 -0
  216. /package/dist/{chunk-NWMORW3U.js.map → chunk-KIK2ZFAL.js.map} +0 -0
  217. /package/dist/{chunk-NUACL52E.js.map → chunk-LLHXQS3C.js.map} +0 -0
  218. /package/dist/{chunk-TL72BGP6.js.map → chunk-MORRVYPT.js.map} +0 -0
  219. /package/dist/{chunk-7ZEHSSUP.js.map → chunk-P4O6EH46.js.map} +0 -0
  220. /package/dist/{chunk-KAYXR544.js.map → chunk-QVLPWNE3.js.map} +0 -0
  221. /package/dist/{chunk-4LKGCFGG.js.map → chunk-WWKOVDWC.js.map} +0 -0
  222. /package/dist/{git-2QDQ2X2S.js.map → claude-7GGEWVEM.js.map} +0 -0
  223. /package/dist/{compile-R2J65HBQ.js.map → compile-7ALJHZ4N.js.map} +0 -0
  224. /package/dist/{neon-helpers-VVFFTLXE.js.map → git-GTLKAZRJ.js.map} +0 -0
  225. /package/dist/{lint-CJM7BAIM.js.map → lint-AAN2NZWG.js.map} +0 -0
  226. /package/dist/{projects-LH362JZQ.js.map → projects-2UOXFLNZ.js.map} +0 -0
  227. /package/dist/{test-EA5NQFDC.js.map → test-SGO6I5Z7.js.map} +0 -0
  228. /package/dist/{test-git-M7LSLEFL.js.map → test-git-XM4TM65W.js.map} +0 -0
  229. /package/dist/{test-prefix-64NAAUON.js.map → test-prefix-GBO37XCN.js.map} +0 -0
  230. /package/dist/{test-webserver-OK6Z5FJM.js.map → test-webserver-NZ3JTVLL.js.map} +0 -0
  231. /package/dist/{vscode-AR5NNXXI.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."
@@ -325,6 +334,63 @@ The following JSON Schema defines valid iloom settings:
325
334
  "review": {
326
335
  "type": "boolean",
327
336
  "description": "Whether artifacts from this agent should be reviewed before posting (defaults to false)"
337
+ },
338
+ "agents": {
339
+ "type": "object",
340
+ "additionalProperties": {
341
+ "type": "object",
342
+ "properties": {
343
+ "model": {
344
+ "type": "string",
345
+ "enum": [
346
+ "sonnet",
347
+ "opus",
348
+ "haiku"
349
+ ],
350
+ "description": "Claude model shorthand: sonnet, opus, or haiku"
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
+ },
361
+ "enabled": {
362
+ "type": "boolean",
363
+ "description": "Whether this agent is enabled. Defaults to true."
364
+ },
365
+ "providers": {
366
+ "type": "object",
367
+ "additionalProperties": {
368
+ "type": "string"
369
+ },
370
+ "propertyNames": {
371
+ "enum": [
372
+ "claude",
373
+ "gemini",
374
+ "codex"
375
+ ]
376
+ },
377
+ "description": "Map of review providers to model names. Keys: claude, gemini, codex. Values: model name strings (e.g., \"sonnet\", \"gemini-3-pro-preview\", \"gpt-5.2-codex\")"
378
+ },
379
+ "review": {
380
+ "type": "boolean",
381
+ "description": "Whether artifacts from this agent should be reviewed before posting (defaults to false)"
382
+ }
383
+ },
384
+ "additionalProperties": false
385
+ },
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."
328
394
  }
329
395
  },
330
396
  "additionalProperties": false
@@ -336,7 +402,7 @@ The following JSON Schema defines valid iloom settings:
336
402
  "type": "null"
337
403
  }
338
404
  ],
339
- "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)"
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."
340
406
  },
341
407
  "spin": {
342
408
  "type": "object",
@@ -350,6 +416,15 @@ The following JSON Schema defines valid iloom settings:
350
416
  ],
351
417
  "default": "opus",
352
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."
353
428
  }
354
429
  },
355
430
  "additionalProperties": false,
@@ -413,17 +488,6 @@ The following JSON Schema defines valid iloom settings:
413
488
  "capabilities": {
414
489
  "type": "object",
415
490
  "properties": {
416
- "capabilities": {
417
- "type": "array",
418
- "items": {
419
- "type": "string",
420
- "enum": [
421
- "cli",
422
- "web"
423
- ]
424
- },
425
- "description": "Explicitly declared project capabilities (auto-detected if not specified)"
426
- },
427
491
  "web": {
428
492
  "type": "object",
429
493
  "properties": {
@@ -434,7 +498,8 @@ The following JSON Schema defines valid iloom settings:
434
498
  "description": "Base port for web workspace port calculations (default: 3000)"
435
499
  }
436
500
  },
437
- "additionalProperties": false
501
+ "additionalProperties": false,
502
+ "description": "Web dev server settings. To declare a project as a web project, add \"web\" to the capabilities array in .iloom/package.iloom.json or .iloom/package.iloom.local.json."
438
503
  },
439
504
  "database": {
440
505
  "type": "object",
@@ -489,10 +554,11 @@ The following JSON Schema defines valid iloom settings:
489
554
  "type": "string",
490
555
  "enum": [
491
556
  "github",
492
- "linear"
557
+ "linear",
558
+ "jira"
493
559
  ],
494
560
  "default": "github",
495
- "description": "Issue tracker provider (github, linear)"
561
+ "description": "Issue tracker provider (github, linear, jira)"
496
562
  },
497
563
  "github": {
498
564
  "type": "object",
@@ -529,6 +595,69 @@ The following JSON Schema defines valid iloom settings:
529
595
  "teamId"
530
596
  ],
531
597
  "additionalProperties": false
598
+ },
599
+ "jira": {
600
+ "type": "object",
601
+ "properties": {
602
+ "host": {
603
+ "type": "string",
604
+ "minLength": 1,
605
+ "description": "Jira instance URL (e.g., \"https://yourcompany.atlassian.net\")"
606
+ },
607
+ "username": {
608
+ "type": "string",
609
+ "minLength": 1,
610
+ "description": "Jira username or email address"
611
+ },
612
+ "apiToken": {
613
+ "type": "string",
614
+ "description": "Jira API token. SECURITY: Store in settings.local.json only, never commit to source control. Generate at: https://id.atlassian.com/manage-profile/security/api-tokens"
615
+ },
616
+ "projectKey": {
617
+ "type": "string",
618
+ "minLength": 1,
619
+ "description": "Jira project key (e.g., \"PROJ\", \"ENG\")"
620
+ },
621
+ "boardId": {
622
+ "type": "string",
623
+ "description": "Jira board ID for sprint/workflow operations (optional)"
624
+ },
625
+ "transitionMappings": {
626
+ "type": "object",
627
+ "additionalProperties": {
628
+ "type": "string"
629
+ },
630
+ "description": "Map iloom states to Jira transition names (e.g., {\"In Review\": \"Start Review\"})"
631
+ },
632
+ "defaultIssueType": {
633
+ "type": "string",
634
+ "minLength": 1,
635
+ "default": "Task",
636
+ "description": "Default Jira issue type name for creating issues (e.g., \"Task\", \"Story\", \"Bug\")"
637
+ },
638
+ "defaultSubtaskType": {
639
+ "type": "string",
640
+ "minLength": 1,
641
+ "default": "Subtask",
642
+ "description": "Default Jira issue type name for creating subtasks/child issues (e.g., \"Subtask\", \"Sub-task\")"
643
+ },
644
+ "doneStatuses": {
645
+ "type": "array",
646
+ "items": {
647
+ "type": "string"
648
+ },
649
+ "default": [
650
+ "Done"
651
+ ],
652
+ "description": "Status names to exclude from issue lists (e.g., [\"Done\", \"Closed\", \"Verify\"])"
653
+ }
654
+ },
655
+ "required": [
656
+ "host",
657
+ "username",
658
+ "projectKey"
659
+ ],
660
+ "additionalProperties": false
532
661
  }
533
662
  },
534
663
  "additionalProperties": false,
@@ -552,6 +681,11 @@ The following JSON Schema defines valid iloom settings:
552
681
  "autoCommitPush": {
553
682
  "type": "boolean",
554
683
  "description": "Auto-commit and push after code review in draft PR mode. Defaults to true when mode is github-draft-pr."
684
+ },
685
+ "openBrowserOnFinish": {
686
+ "type": "boolean",
687
+ "default": true,
688
+ "description": "Open the PR in the default browser after finishing in github-pr or github-draft-pr mode. Use --no-browser flag to override."
555
689
  }
556
690
  },
557
691
  "additionalProperties": false,
@@ -720,6 +854,10 @@ Extract these current values if they exist:
720
854
  - `currentIssueProvider` from `issueManagement.provider` field (default: "github")
721
855
  - `currentLinearTeamId` from `issueManagement.linear.teamId` field (if Linear is provider)
722
856
  - `currentGitHubRemote` from `issueManagement.github.remote` field (if GitHub is provider and multiple remotes)
857
+ - `currentJiraHost` from `issueManagement.jira.host` field (if Jira is provider)
858
+ - `currentJiraUsername` from `issueManagement.jira.username` field (if Jira is provider)
859
+ - `currentJiraProjectKey` from `issueManagement.jira.projectKey` field (if Jira is provider)
860
+ - `currentJiraBoardId` from `issueManagement.jira.boardId` field (if Jira is provider, optional)
723
861
 
724
862
  **If configuration already exists, display current configuration summary:**
725
863
 
@@ -733,6 +871,9 @@ IDE: [currentIdeType or "vscode (default)"]
733
871
  Issue Tracker: [currentIssueProvider or "github (default)"]
734
872
  Linear Team ID: [currentLinearTeamId] (only if currentIssueProvider == linear)
735
873
  {{#if MULTIPLE_REMOTES}}GitHub Remote: [currentGitHubRemote] (only if currentIssueProvider == github){{/if}}
874
+ Jira Host: [currentJiraHost] (only if currentIssueProvider == jira)
875
+ Jira Project Key: [currentJiraProjectKey] (only if currentIssueProvider == jira)
876
+ Jira Board ID: [currentJiraBoardId] (only if currentIssueProvider == jira and boardId is set)
736
877
  ```
737
878
 
738
879
  **Then ask the user what they want to do:**
@@ -814,7 +955,69 @@ The agent will:
814
955
  4. Create `.iloom/package.iloom.json` with the detected configuration
815
956
  5. Detect and set project capabilities (cli, web) based on the framework
816
957
 
817
- **File Format:**
958
+ **package.iloom.json Schema:**
959
+ ```json
960
+ {
961
+ "$ref": "#/definitions/PackageIloom",
962
+ "definitions": {
963
+ "PackageIloom": {
964
+ "type": "object",
965
+ "properties": {
966
+ "capabilities": {
967
+ "type": "array",
968
+ "items": {
969
+ "type": "string",
970
+ "enum": [
971
+ "cli",
972
+ "web"
973
+ ]
974
+ },
975
+ "description": "Project capabilities - \"cli\" for command-line tools (enables CLI isolation), \"web\" for web applications (enables port assignment and dev server)"
976
+ },
977
+ "scripts": {
978
+ "type": "object",
979
+ "properties": {
980
+ "install": {
981
+ "type": "string",
982
+ "description": "Install command (e.g., \"bundle install\", \"poetry install\")"
983
+ },
984
+ "build": {
985
+ "type": "string",
986
+ "description": "Build/compile command"
987
+ },
988
+ "test": {
989
+ "type": "string",
990
+ "description": "Test suite command"
991
+ },
992
+ "dev": {
993
+ "type": "string",
994
+ "description": "Dev server command"
995
+ },
996
+ "lint": {
997
+ "type": "string",
998
+ "description": "Linting command"
999
+ },
1000
+ "typecheck": {
1001
+ "type": "string",
1002
+ "description": "Type checking command"
1003
+ },
1004
+ "compile": {
1005
+ "type": "string",
1006
+ "description": "Compilation command (preferred over typecheck if both exist)"
1007
+ }
1008
+ },
1009
+ "additionalProperties": false,
1010
+ "description": "Custom shell commands for project operations. These are raw shell commands, not npm script names."
1011
+ }
1012
+ },
1013
+ "additionalProperties": false
1014
+ }
1015
+ },
1016
+ "$schema": "http://json-schema.org/draft-07/schema#"
1017
+ }
1018
+ ```
1019
+
1020
+ **File Format Example:**
818
1021
  ```json
819
1022
  {
820
1023
  "capabilities": ["cli"],
@@ -855,7 +1058,16 @@ If the framework detector did not set capabilities, or if you need to ask the us
855
1058
  - "web" - Web application with dev server
856
1059
  - "both" - Both CLI and web capabilities
857
1060
  - "neither" - Library or other project type
858
- - Update `.iloom/package.iloom.json` with the appropriate `capabilities` array.
1061
+
1062
+ **Choose where to save package.iloom configuration:**
1063
+
1064
+ After determining the configuration, ask the user where to save it:
1065
+ - **Project** (`package.iloom.json`) - Shared with team, committed to git
1066
+ - **Local** (`package.iloom.local.json`) - Local only, gitignored, never committed
1067
+
1068
+ Default to **Local** if fork was detected (origin + upstream remotes). Otherwise default to **Project**.
1069
+
1070
+ Write the capabilities and scripts to the chosen file.
859
1071
 
860
1072
  **When to infer capabilities:**
861
1073
  - Flask/Django/FastAPI/Rails/Actix/Rocket detected -> include "web"
@@ -873,7 +1085,7 @@ This phase configures external tooling integrations. Use AskUserQuestion to gath
873
1085
  **Step 1: Issue Tracker Provider**
874
1086
 
875
1087
  {{#if MULTIPLE_REMOTES}}
876
- Since this repository has multiple git remotes, GitHub Issues is suggested as the default since it integrates with your existing GitHub workflow. However, you can choose Linear if that's your team's issue tracker.
1088
+ Since this repository has multiple git remotes, GitHub Issues is suggested as the default since it integrates with your existing GitHub workflow. However, you can choose Linear or Jira if that's your team's issue tracker.
877
1089
  {{/if}}
878
1090
 
879
1091
  1. **Issue Tracker Provider**
@@ -881,8 +1093,9 @@ Since this repository has multiple git remotes, GitHub Issues is suggested as th
881
1093
  - Options:
882
1094
  - "github" - GitHub Issues (default)
883
1095
  - "linear" - Linear Issues
1096
+ - "jira" - Jira Cloud
884
1097
  - Default: currentIssueProvider or "github"
885
- - Validation: Must be one of: github, linear
1098
+ - Validation: Must be one of: github, linear, jira
886
1099
  - Store answer as: `issueManagement.provider`
887
1100
 
888
1101
  **Note on Provider + Merge Mode Combinations:**
@@ -890,6 +1103,8 @@ Since this repository has multiple git remotes, GitHub Issues is suggested as th
890
1103
  - GitHub Issues + github-pr or github-draft-pr: Requires authorized GitHub CLI (`gh`)
891
1104
  - Linear Issues + local merge: Requires Linear API token only
892
1105
  - Linear Issues + github-pr or github-draft-pr: Requires BOTH Linear API token AND authorized GitHub CLI (`gh`)
1106
+ - Jira Cloud + local merge: Requires Jira credentials (host, username, API token) only
1107
+ - Jira Cloud + github-pr or github-draft-pr: Requires BOTH Jira credentials AND authorized GitHub CLI (`gh`)
893
1108
 
894
1109
  **Step 2: Provider-Specific Configuration**
895
1110
 
@@ -945,6 +1160,59 @@ This repository has multiple git remotes detected. iloom needs to know which rem
945
1160
  - **CRITICAL SECURITY REQUIREMENT:** This value MUST ALWAYS be saved to `settings.local.json`, NEVER to `settings.json`, regardless of which file the user selected for other settings. This token must never be committed to source control.
946
1161
  - Context: Get your API token from Linear Settings → API → Personal API Keys (https://linear.app/settings/api)
947
1162
 
1163
+ **If Jira was selected:**
1164
+
1165
+ 2. **Jira Host URL** (only ask if issue provider is "jira")
1166
+ - Question format: "What is your Jira instance URL?{{#if currentJiraHost}} (Currently: [currentJiraHost]){{/if}}"
1167
+ - Options (as examples):
1168
+ - "https://yourcompany.atlassian.net" - Jira Cloud instance
1169
+ - Default: currentJiraHost or NO DEFAULT (required if Jira is selected)
1170
+ - Validation: Non-empty string, must be a valid URL. If the user provides a value without `https://`, automatically prepend `https://` (e.g., `yourcompany.atlassian.net` becomes `https://yourcompany.atlassian.net`). Strip any trailing slashes.
1171
+ - Store answer as: `issueManagement.jira.host`
1172
+ - Context: This is your Jira Cloud instance URL (e.g., "https://yourcompany.atlassian.net")
1173
+
1174
+ 3. **Jira Username/Email** (only ask if issue provider is "jira")
1175
+ - Question format: "What is your Atlassian account email?{{#if currentJiraUsername}} (Currently: [currentJiraUsername]){{/if}}"
1176
+ - Default: currentJiraUsername or NO DEFAULT (required if Jira is selected)
1177
+ - Validation: Non-empty string
1178
+ - Store answer as: `issueManagement.jira.username`
1179
+ - **CRITICAL SECURITY REQUIREMENT:** This value MUST ALWAYS be saved to `settings.local.json`, NEVER to `settings.json`, regardless of which file the user selected for other settings. This is personal account information that should not be committed to source control.
1180
+ - Context: This is the email address associated with your Atlassian account
1181
+
1182
+ 4. **Jira API Token** (only ask if issue provider is "jira")
1183
+ - Question format: "What is your Jira API token? (Currently: 'set' or 'unset' - do not print)"
1184
+ - Options:
1185
+ - I have it now - use the "Type something" option to enter it
1186
+ - I'll come back to it
1187
+ - Default: currentJiraApiToken or NO DEFAULT
1188
+ - Validation: Non-empty string
1189
+ - Guidance: Choose "Type something" to enter it
1190
+ - Store answer as: `issueManagement.jira.apiToken`
1191
+ - **CRITICAL SECURITY REQUIREMENT:** This value MUST ALWAYS be saved to `settings.local.json`, NEVER to `settings.json`, regardless of which file the user selected for other settings. This token must never be committed to source control.
1192
+ - Context: Generate an API token at https://id.atlassian.com/manage-profile/security/api-tokens
1193
+
1194
+ 5. **Jira Project Key** (only ask if issue provider is "jira")
1195
+ - Question format: "What is your Jira project key?{{#if currentJiraProjectKey}} (Currently: [currentJiraProjectKey]){{/if}}"
1196
+ - Options (as examples):
1197
+ - "PROJ" - Project team
1198
+ - "ENG" - Engineering team
1199
+ - Default: currentJiraProjectKey or NO DEFAULT (required if Jira is selected)
1200
+ - Validation: Non-empty string, typically uppercase letters
1201
+ - Store answer as: `issueManagement.jira.projectKey`
1202
+ - Context: This is the project key prefix shown in your Jira issue IDs (e.g., "PROJ" in "PROJ-123")
1203
+
1204
+ 6. **Jira Board ID** (only ask if issue provider is "jira")
1205
+ - Question format: "What is your Jira board ID? (optional, used for sprint filtering){{#if currentJiraBoardId}} (Currently: [currentJiraBoardId]){{/if}}"
1206
+ - Options:
1207
+ - Skip - Don't configure board ID now
1208
+ - Enter board ID - use the "Type something" option to enter it
1209
+ - Default: currentJiraBoardId or SKIP (optional)
1210
+ - Validation: If provided, must be a numeric string
1211
+ - Store answer as: `issueManagement.jira.boardId`
1212
+ - Context: The board ID can be found in the URL when viewing a Jira board (e.g., `/board/42`). This is optional and used for sprint-based filtering with `il issues --sprint`.
1213
+
1214
+ **Note:** Advanced Jira settings like `transitionMappings`, `doneStatuses`, `defaultIssueType`, and `defaultSubtaskType` can be configured later by editing the settings files directly. Mention this to the user.
1215
+
948
1216
  **Step 3: IDE Selection**
949
1217
 
950
1218
  4. **IDE Selection**
@@ -982,7 +1250,7 @@ This repository has multiple git remotes detected. iloom needs to know which rem
982
1250
 
983
1251
  **Implementation Details:**
984
1252
  - Ask Step 1 first to determine provider
985
- - Then ask Step 2 based on the provider selected (includes Linear API Token if Linear was selected)
1253
+ - Then ask Step 2 based on the provider selected (includes Linear API Token if Linear was selected, or Jira credentials if Jira was selected)
986
1254
  - Ask Step 3 (IDE) for all users
987
1255
  - Ask Step 4 (Merge Mode) only if multiple remotes detected OR user requests advanced config
988
1256
  - Set multiSelect: false for all questions
@@ -1022,9 +1290,32 @@ Based on the users answer:
1022
1290
 
1023
1291
  **Note:** Terminal colors default to `true` (always recommend unless user explicitly disables).
1024
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
+
1025
1316
  ### Phase 3: Configuration Summary
1026
1317
 
1027
- 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:
1028
1319
 
1029
1320
  ```
1030
1321
  Configuration Summary:
@@ -1040,13 +1331,19 @@ Tooling Configuration (Phase 2):
1040
1331
  Linear Team ID: [value] (only if issue tracker is Linear)
1041
1332
  Linear API Token: [configured/not configured] (only if issue tracker is Linear - never show actual token)
1042
1333
  {{#if MULTIPLE_REMOTES}}GitHub Remote: [value] (only if issue tracker is GitHub){{/if}}
1334
+ Jira Host: [value] (only if issue tracker is Jira)
1335
+ Jira Project Key: [value] (only if issue tracker is Jira)
1336
+ Jira Board ID: [value or "not configured"] (only if issue tracker is Jira)
1337
+ Jira API Token: [configured/not configured] (only if issue tracker is Jira - never show actual token)
1043
1338
  IDE: [value or "vscode (default)"]
1044
1339
  Merge Mode: [value] (only if configured)
1340
+ Swarm Mode: [Maximum Quality / Balanced / Fast & Cheap] (only if configured in Phase 2.7)
1045
1341
  ```
1046
1342
 
1047
1343
  **Note**:
1048
1344
  - Include the GitHub Remote line in the summary ONLY if it was configured in Phase 2 (multiple remotes and GitHub selected)
1049
1345
  - Include Linear Team ID ONLY if Linear was selected as the issue tracker provider
1346
+ - Include Jira Host, Project Key, Board ID, and API Token ONLY if Jira was selected as the issue tracker provider
1050
1347
  - Include Merge Mode ONLY if it was asked and configured (multiple remotes or advanced config)
1051
1348
 
1052
1349
  Then ask: "Does this configuration look correct?"
@@ -1185,6 +1482,46 @@ When both settings.json and settings.local.json exist, you MUST prevent duplicat
1185
1482
  }
1186
1483
  ```
1187
1484
 
1485
+ **For Jira:**
1486
+
1487
+ In settings.json (committed):
1488
+ ```json
1489
+ {
1490
+ "issueManagement": {
1491
+ "provider": "jira",
1492
+ "jira": {
1493
+ "host": "<user's Jira host URL>",
1494
+ "projectKey": "<user's project key>"
1495
+ }
1496
+ }
1497
+ }
1498
+ ```
1499
+
1500
+ In settings.local.json (gitignored - MUST be separate from settings.json):
1501
+ ```json
1502
+ {
1503
+ "issueManagement": {
1504
+ "jira": {
1505
+ "username": "<user's Atlassian email>",
1506
+ "apiToken": "<user's API token>"
1507
+ }
1508
+ }
1509
+ }
1510
+ ```
1511
+
1512
+ If a boardId was provided, add it to settings.json alongside host and projectKey:
1513
+ ```json
1514
+ {
1515
+ "issueManagement": {
1516
+ "jira": {
1517
+ "boardId": "<user's board ID>"
1518
+ }
1519
+ }
1520
+ }
1521
+ ```
1522
+
1523
+ **CRITICAL:** The `username` and `apiToken` fields MUST be saved to `settings.local.json`, never to `settings.json`. The `host`, `projectKey`, and `boardId` fields are safe to commit in `settings.json`.
1524
+
1188
1525
  6. **Add mergeBehavior ONLY if mode is not "local":**
1189
1526
  ```json
1190
1527
  {
@@ -1315,16 +1652,16 @@ Would you like to commit these changes?
1315
1652
  - Yes - Commit iloom configuration changes (strongly recommended)
1316
1653
  - No - Skip committing (not recommended)
1317
1654
 
1318
- ⚠️ WARNING: If you don't commit settings.json, iloom will not work correctly in new looms.
1655
+ ⚠️ WARNING: If you don't commit settings.json and package.iloom.json, iloom will not work correctly in new looms.
1319
1656
  Looms are created from committed code, so your configuration won't be available.
1320
- (Local files like settings.local.json and .env are copied automatically - but settings.json must be committed.)
1657
+ (Local files like settings.local.json, package.iloom.local.json, and .env are copied automatically - but shared files must be committed.)
1321
1658
  ```
1322
1659
 
1323
1660
  **CRITICAL RULES:**
1324
- - **ONLY commit iloom-related files**: .iloom/settings.json, .gitignore
1661
+ - **ONLY commit iloom-related files**: .iloom/settings.json, .iloom/package.iloom.json, .gitignore
1325
1662
  - **NEVER stage or commit unrelated files** - even if they appear in `git status`
1326
1663
  - **If the commit fails, you must then subsequently request to use --no-verify flag** to bypass pre-commit hooks that might fail due to unrelated codebase state
1327
- - **Do NOT commit settings.local.json** - it should be gitignored, not committed
1664
+ - **Do NOT commit local-only files** - settings.local.json and package.iloom.local.json should be gitignored, not committed
1328
1665
  - **YOU MAY NEED TO EDIT/UPDATE MORE THAN ONE FILE if the user is changing something like API Keys (local only), permissionsMode (local only), IDE (recommened global) as well as shared settings.
1329
1666
 
1330
1667
  **Step 3: If user says yes, commit the changes**
@@ -1333,10 +1670,10 @@ VERIFY YOU'RE NOT BUNDLING ALL CHANGES IN ONE FILE DESPITE GUIDANCE TO SPLIT ACC
1333
1670
 
1334
1671
  Stage ONLY the iloom-related files that should be committed:
1335
1672
  ```bash
1336
- git add .iloom/settings.json .gitignore 2>/dev/null || true
1673
+ git add .iloom/settings.json .iloom/package.iloom.json .gitignore 2>/dev/null || true
1337
1674
  ```
1338
1675
 
1339
- Note: Do NOT add .iloom/settings.local.json - it's meant to be local-only.
1676
+ Note: Do NOT add local-only files (.iloom/settings.local.json, .iloom/package.iloom.local.json) - they should be gitignored, not committed.
1340
1677
 
1341
1678
  Then commit:
1342
1679
 
@@ -1404,6 +1741,8 @@ Need more advanced configuration? I can help you set up:
1404
1741
  • Multi-Provider Code Review - Get code reviews from Gemini or Codex alongside Claude
1405
1742
  • Plan Configuration - Use different AI providers for planning and plan review
1406
1743
  • Agent Models - Use different Claude models for different tasks
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)
1407
1746
  • Database Settings - Configure database branching for isolated development
1408
1747
  • Skip Pre-Commit Hooks - Bypass slow or failing hooks during commit and finish workflows
1409
1748
  • Workflow Behavior - Control permissions, IDE launching, dev servers, and terminal behavior
@@ -1421,6 +1760,9 @@ You can ask me questions like:
1421
1760
  "Can I disable the IDE from launching automatically?"
1422
1761
  "How do I protect my main branch from worktree creation?"
1423
1762
  "What models are available for the different agents?"
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?"
1424
1766
  "How do I use custom build/test commands instead of package.json scripts?"
1425
1767
 
1426
1768
  Just ask any of these questions and I'll help you modify your settings.
@@ -1452,7 +1794,50 @@ When configuring agents, use these model identifiers:
1452
1794
  }
1453
1795
  ```
1454
1796
 
1455
- 2. **Database Environment Variable:**
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
+
1799
+ **Swarm-Specific Phase Agent Models:**
1800
+
1801
+ To override a specific agent's model in swarm mode, use `swarmModel`:
1802
+
1803
+ ```json
1804
+ "agents": {
1805
+ "iloom-issue-implementer": {
1806
+ "model": "opus",
1807
+ "swarmModel": "sonnet"
1808
+ }
1809
+ }
1810
+ ```
1811
+
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**.
1839
+
1840
+ 3. **Database Environment Variable:**
1456
1841
  ```json
1457
1842
  "capabilities": {
1458
1843
  "database": {
@@ -1461,7 +1846,7 @@ When configuring agents, use these model identifiers:
1461
1846
  }
1462
1847
  ```
1463
1848
 
1464
- 3. **Workflow Behavior:**
1849
+ 4. **Workflow Behavior:**
1465
1850
  ```json
1466
1851
  "workflows": {
1467
1852
  "pr": {
@@ -1473,26 +1858,26 @@ When configuring agents, use these model identifiers:
1473
1858
  }
1474
1859
  ```
1475
1860
 
1476
- 4. **Copy Gitignored Files:**
1861
+ 5. **Copy Gitignored Files:**
1477
1862
  ```json
1478
1863
  "copyGitIgnoredPatterns": ["*.db", "data/*.sqlite", "tmp/fixtures/**"]
1479
1864
  ```
1480
1865
 
1481
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.
1482
1867
 
1483
- 5. **Protected Branches:**
1868
+ 6. **Protected Branches:**
1484
1869
  ```json
1485
1870
  "protectedBranches": ["main", "production", "release/*"]
1486
1871
  ```
1487
1872
 
1488
- 6. **IDE Configuration:**
1873
+ 7. **IDE Configuration:**
1489
1874
  ```json
1490
1875
  "ide": {
1491
1876
  "type": "cursor"
1492
1877
  }
1493
1878
  ```
1494
1879
 
1495
- 7. **Code Review with Multiple Providers:**
1880
+ 8. **Code Review with Multiple Providers:**
1496
1881
  ```json
1497
1882
  "agents": {
1498
1883
  "iloom-code-reviewer": {
@@ -1506,7 +1891,7 @@ When configuring agents, use these model identifiers:
1506
1891
 
1507
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.
1508
1893
 
1509
- 8. **Custom Script Configuration (package.iloom.json):**
1894
+ 9. **Custom Script Configuration (package.iloom.json):**
1510
1895
 
1511
1896
  If users want to override or supplement npm scripts with custom commands, help them create `.iloom/package.iloom.json`:
1512
1897
  ```json
@@ -1564,6 +1949,15 @@ When configuring agents, use these model identifiers:
1564
1949
  - Your local environment needs different commands than the team standard
1565
1950
  - You want to add debug flags or local-only tooling without affecting others
1566
1951
 
1952
+ ## Telemetry
1953
+
1954
+ iloom collects anonymous usage data to improve the product. If the user asks about telemetry or data collection during setup:
1955
+
1956
+ - **CLI telemetry**: Managed via `il telemetry off` (disable) and `il telemetry on` (re-enable). Run `il telemetry status` to check current state.
1957
+ - **VS Code extension telemetry**: If the user also uses the iloom VS Code extension, its telemetry is managed separately via VS Code settings (`iloom.telemetry.enabled`). Disabling CLI telemetry does NOT affect the extension, and vice versa.
1958
+ - **What's collected**: Only anonymous usage events (commands run, errors). No personal information, repo names, or code.
1959
+ - **Distinct ID**: A random UUID stored in `~/.config/iloom-ai/telemetry.json`, shared between CLI and VS Code extension.
1960
+
1567
1961
  ## Important Notes
1568
1962
 
1569
1963
  - **Validate ALL inputs** against the schema before writing files
@@ -1581,3 +1975,5 @@ When configuring agents, use these model identifiers:
1581
1975
  - **CRITICAL: PREVENT DUPLICATION** - When writing settings.local.json, ONLY include settings that differ from settings.json. If a setting has the same value in both files, it MUST be removed from the local file. Local should only contain overrides, never duplicates.
1582
1976
  - **Deep comparison required** - When comparing settings for duplication, compare nested objects deeply (e.g., capabilities.web.basePort), not just top-level keys
1583
1977
  - **Empty local is OK** - If all local settings match shared settings after deduplication, an empty settings.local.json file is perfectly valid (or the user may choose not to create it at all)
1978
+ - **ALWAYS ask where to save package.iloom configuration** - When creating or modifying package.iloom.json outside of the guided wizard flow, always ask the user whether to save to `package.iloom.json` (shared, committed) or `package.iloom.local.json` (local, gitignored) before writing. Apply the same fork detection logic — if origin + upstream remotes are detected, default to the local variant.
1979
+ - **ALWAYS offer to commit after writing shared files** - Whenever you create or modify a committable file (settings.json, package.iloom.json, .gitignore), offer to commit it — even outside the guided wizard flow. Looms are created from committed code, so uncommitted shared configuration won't be available in new looms. Follow the same commit rules from Phase 7: only stage iloom-related files, never stage local-only files.