@iloom/cli 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +179 -41
  3. package/dist/{BranchNamingService-K6XNWQ6C.js → BranchNamingService-ECJHBB67.js} +2 -2
  4. package/dist/ClaudeContextManager-QXX6ZFST.js +14 -0
  5. package/dist/ClaudeService-NJNK2SUH.js +13 -0
  6. package/dist/{GitHubService-O7T6CFAJ.js → GitHubService-MEHKHUQP.js} +4 -4
  7. package/dist/IssueTrackerFactory-NG53YX5S.js +14 -0
  8. package/dist/{LoomLauncher-3I47SUPV.js → LoomLauncher-L64HHS3T.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-DULSVRRE.js} +2 -2
  12. package/dist/README.md +179 -41
  13. package/dist/{SettingsManager-QR7V2IW2.js → SettingsManager-BQDQA3FK.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-IC4CJRMP.js → build-5GO3XW26.js} +9 -9
  23. package/dist/{chunk-USSL2X4A.js → chunk-3D7WQM7I.js} +2 -2
  24. package/dist/chunk-4232AHNQ.js +35 -0
  25. package/dist/chunk-4232AHNQ.js.map +1 -0
  26. package/dist/{chunk-QN47QVBX.js → chunk-4WJNIR5O.js} +1 -1
  27. package/dist/chunk-4WJNIR5O.js.map +1 -0
  28. package/dist/{chunk-2JPXGGP4.js → chunk-5MWV33NN.js} +4 -4
  29. package/dist/{chunk-POU2UMWN.js → chunk-6EU6TCF6.js} +10 -10
  30. package/dist/chunk-6EU6TCF6.js.map +1 -0
  31. package/dist/{chunk-Y5O2ALDZ.js → chunk-FB47TIJG.js} +29 -11
  32. package/dist/chunk-FB47TIJG.js.map +1 -0
  33. package/dist/chunk-HEXKPKCK.js +1396 -0
  34. package/dist/chunk-HEXKPKCK.js.map +1 -0
  35. package/dist/{chunk-KAYXR544.js → chunk-J5S7DFYC.js} +2 -2
  36. package/dist/{chunk-OK7LUTRW.js → chunk-JO2LZ6EQ.js} +476 -5
  37. package/dist/chunk-JO2LZ6EQ.js.map +1 -0
  38. package/dist/{chunk-KBEIQP4G.js → chunk-KB64WNBZ.js} +43 -3
  39. package/dist/chunk-KB64WNBZ.js.map +1 -0
  40. package/dist/{chunk-Y5HSSIK2.js → chunk-KXDRI47U.js} +71 -13
  41. package/dist/chunk-KXDRI47U.js.map +1 -0
  42. package/dist/{chunk-HZXBHMVM.js → chunk-LXLMMXXY.js} +54 -14
  43. package/dist/chunk-LXLMMXXY.js.map +1 -0
  44. package/dist/{chunk-H6ST2TGP.js → chunk-MNHZB4Z2.js} +4 -4
  45. package/dist/{chunk-TL72BGP6.js → chunk-MORRVYPT.js} +2 -2
  46. package/dist/{chunk-TGRK3CHF.js → chunk-NRSWLOAZ.js} +8 -8
  47. package/dist/chunk-NRSWLOAZ.js.map +1 -0
  48. package/dist/{chunk-FO5GGFOV.js → chunk-ONQYPICO.js} +13 -5
  49. package/dist/chunk-ONQYPICO.js.map +1 -0
  50. package/dist/{chunk-7ZEHSSUP.js → chunk-P4O6EH46.js} +4 -4
  51. package/dist/chunk-QZWEJVWV.js +207 -0
  52. package/dist/chunk-QZWEJVWV.js.map +1 -0
  53. package/dist/chunk-RSYT7MVI.js +202 -0
  54. package/dist/chunk-RSYT7MVI.js.map +1 -0
  55. package/dist/{chunk-OAVJR4PM.js → chunk-RYWFS37M.js} +6 -6
  56. package/dist/chunk-RYWFS37M.js.map +1 -0
  57. package/dist/{chunk-B7U6OKUR.js → chunk-SF2P22EE.js} +11 -3
  58. package/dist/chunk-SF2P22EE.js.map +1 -0
  59. package/dist/{chunk-MZPRBNYC.js → chunk-SN3SQCFK.js} +10 -8
  60. package/dist/{chunk-MZPRBNYC.js.map → chunk-SN3SQCFK.js.map} +1 -1
  61. package/dist/{chunk-4ZIHFUPN.js → chunk-UD3WJDIV.js} +145 -107
  62. package/dist/chunk-UD3WJDIV.js.map +1 -0
  63. package/dist/{chunk-3P6J4IZZ.js → chunk-UKBAJ2QQ.js} +61 -7
  64. package/dist/chunk-UKBAJ2QQ.js.map +1 -0
  65. package/dist/{chunk-RD7OPXZK.js → chunk-UVD4CZKS.js} +3 -3
  66. package/dist/chunk-UWGVCXRF.js +207 -0
  67. package/dist/chunk-UWGVCXRF.js.map +1 -0
  68. package/dist/{chunk-JT5LZRMI.js → chunk-VECNX6VX.js} +2 -2
  69. package/dist/{chunk-TRUMP4DA.js → chunk-VG45TUYK.js} +75 -6
  70. package/dist/chunk-VG45TUYK.js.map +1 -0
  71. package/dist/{chunk-4GAJJUYS.js → chunk-VGGST52X.js} +2 -2
  72. package/dist/{chunk-4LKGCFGG.js → chunk-WWKOVDWC.js} +2 -2
  73. package/dist/{chunk-2HZX6AMR.js → chunk-WY4QBK43.js} +7 -7
  74. package/dist/chunk-WY4QBK43.js.map +1 -0
  75. package/dist/chunk-Y4YZTHZE.js +73 -0
  76. package/dist/chunk-Y4YZTHZE.js.map +1 -0
  77. package/dist/{chunk-VOGGLPG5.js → chunk-YQ57ORTV.js} +14 -1
  78. package/dist/chunk-YQ57ORTV.js.map +1 -0
  79. package/dist/{chunk-XFEK2X2D.js → chunk-YYAKPQBT.js} +73 -20
  80. package/dist/chunk-YYAKPQBT.js.map +1 -0
  81. package/dist/{chunk-NTTSUAVM.js → chunk-ZEWU5PZK.js} +2 -2
  82. package/dist/{chunk-5LVVQGB3.js → chunk-ZHPNZC75.js} +17 -17
  83. package/dist/chunk-ZHPNZC75.js.map +1 -0
  84. package/dist/{chunk-I3HMNWQQ.js → chunk-ZW2LKWWE.js} +9 -9
  85. package/dist/chunk-ZW2LKWWE.js.map +1 -0
  86. package/dist/{claude-TP2QO3BU.js → claude-P3NQR6IJ.js} +2 -2
  87. package/dist/{cleanup-D3CSRBBZ.js → cleanup-6UCPVMFG.js} +81 -32
  88. package/dist/cleanup-6UCPVMFG.js.map +1 -0
  89. package/dist/cli.js +640 -350
  90. package/dist/cli.js.map +1 -1
  91. package/dist/{commit-IWGT42XN.js → commit-L3EPY5QG.js} +23 -21
  92. package/dist/commit-L3EPY5QG.js.map +1 -0
  93. package/dist/{compile-EOWJORKO.js → compile-ZS4HYRX5.js} +9 -9
  94. package/dist/{contribute-WSJTV2RX.js → contribute-ORDDQGSL.js} +14 -6
  95. package/dist/contribute-ORDDQGSL.js.map +1 -0
  96. package/dist/{dev-server-Q6M62ATG.js → dev-server-FYZ2AQIH.js} +29 -15
  97. package/dist/dev-server-FYZ2AQIH.js.map +1 -0
  98. package/dist/{feedback-QPNDZQRV.js → feedback-TMBXSCM5.js} +15 -15
  99. package/dist/{git-W3XUIFTR.js → git-ET64COO3.js} +4 -4
  100. package/dist/hooks/iloom-hook.js +15 -0
  101. package/dist/ignite-CGOV3TD4.js +1393 -0
  102. package/dist/ignite-CGOV3TD4.js.map +1 -0
  103. package/dist/index.d.ts +397 -53
  104. package/dist/index.js +1178 -40
  105. package/dist/index.js.map +1 -1
  106. package/dist/{init-ALYWKNWG.js → init-GFQ5W7GK.js} +57 -21
  107. package/dist/init-GFQ5W7GK.js.map +1 -0
  108. package/dist/issues-T4ZZSPEG.js +179 -0
  109. package/dist/issues-T4ZZSPEG.js.map +1 -0
  110. package/dist/{lint-IHUH45OC.js → lint-6TQXDZ3T.js} +9 -9
  111. package/dist/mcp/issue-management-server.js +2472 -257
  112. package/dist/mcp/issue-management-server.js.map +1 -1
  113. package/dist/mcp/recap-server.js +144 -21
  114. package/dist/mcp/recap-server.js.map +1 -1
  115. package/dist/{neon-helpers-VVFFTLXE.js → neon-helpers-CQN2PB4S.js} +3 -3
  116. package/dist/neon-helpers-CQN2PB4S.js.map +1 -0
  117. package/dist/{open-KWOV2OFO.js → open-5QZGXQRF.js} +15 -15
  118. package/dist/open-5QZGXQRF.js.map +1 -0
  119. package/dist/{plan-BRJBFJHF.js → plan-U7ZQWLFY.js} +41 -25
  120. package/dist/plan-U7ZQWLFY.js.map +1 -0
  121. package/dist/{projects-LH362JZQ.js → projects-2UOXFLNZ.js} +4 -4
  122. package/dist/prompts/CLAUDE.md +62 -0
  123. package/dist/prompts/init-prompt.txt +386 -47
  124. package/dist/prompts/issue-prompt.txt +427 -54
  125. package/dist/prompts/plan-prompt.txt +97 -16
  126. package/dist/prompts/pr-prompt.txt +44 -1
  127. package/dist/prompts/regular-prompt.txt +42 -1
  128. package/dist/prompts/session-summary-prompt.txt +14 -0
  129. package/dist/prompts/swarm-orchestrator-prompt.txt +437 -0
  130. package/dist/{rebase-AJOJOZUG.js → rebase-DWIB77KV.js} +10 -10
  131. package/dist/{recap-GKJXMDXW.js → recap-MX63HAKV.js} +47 -19
  132. package/dist/recap-MX63HAKV.js.map +1 -0
  133. package/dist/{run-QEUVZF7J.js → run-O3TFNQFC.js} +15 -15
  134. package/dist/run-O3TFNQFC.js.map +1 -0
  135. package/dist/schema/package-iloom.schema.json +58 -0
  136. package/dist/schema/settings.schema.json +130 -15
  137. package/dist/{shell-DAAVG4YN.js → shell-G6VC2CYR.js} +14 -7
  138. package/dist/shell-G6VC2CYR.js.map +1 -0
  139. package/dist/{summary-ZKOA35PT.js → summary-FWHAX55O.js} +27 -25
  140. package/dist/summary-FWHAX55O.js.map +1 -0
  141. package/dist/{test-5GPWWO3P.js → test-F7JNJZYP.js} +9 -9
  142. package/dist/{test-git-EJUKDB7F.js → test-git-BTAOIUE2.js} +4 -4
  143. package/dist/test-jira-CHYNV33F.js +96 -0
  144. package/dist/test-jira-CHYNV33F.js.map +1 -0
  145. package/dist/{test-prefix-23TOBUXY.js → test-prefix-Q6TFSU6F.js} +4 -4
  146. package/dist/{test-webserver-CKROHFBQ.js → test-webserver-EONCG7E7.js} +6 -6
  147. package/dist/{vscode-6TOLFCI2.js → vscode-VA5X4P25.js} +7 -7
  148. package/package.json +5 -1
  149. package/dist/ClaudeContextManager-X2Y72GRL.js +0 -14
  150. package/dist/ClaudeService-7P32TTES.js +0 -13
  151. package/dist/chunk-2HZX6AMR.js.map +0 -1
  152. package/dist/chunk-3P6J4IZZ.js.map +0 -1
  153. package/dist/chunk-4ZIHFUPN.js.map +0 -1
  154. package/dist/chunk-5LVVQGB3.js.map +0 -1
  155. package/dist/chunk-B7U6OKUR.js.map +0 -1
  156. package/dist/chunk-ENGCJIYQ.js +0 -520
  157. package/dist/chunk-ENGCJIYQ.js.map +0 -1
  158. package/dist/chunk-FO5GGFOV.js.map +0 -1
  159. package/dist/chunk-HZXBHMVM.js.map +0 -1
  160. package/dist/chunk-I3HMNWQQ.js.map +0 -1
  161. package/dist/chunk-J7FJ6PUT.js +0 -121
  162. package/dist/chunk-J7FJ6PUT.js.map +0 -1
  163. package/dist/chunk-KBEIQP4G.js.map +0 -1
  164. package/dist/chunk-OAVJR4PM.js.map +0 -1
  165. package/dist/chunk-OK7LUTRW.js.map +0 -1
  166. package/dist/chunk-POU2UMWN.js.map +0 -1
  167. package/dist/chunk-QN47QVBX.js.map +0 -1
  168. package/dist/chunk-TGRK3CHF.js.map +0 -1
  169. package/dist/chunk-TRUMP4DA.js.map +0 -1
  170. package/dist/chunk-VOGGLPG5.js.map +0 -1
  171. package/dist/chunk-XFEK2X2D.js.map +0 -1
  172. package/dist/chunk-Y5HSSIK2.js.map +0 -1
  173. package/dist/chunk-Y5O2ALDZ.js.map +0 -1
  174. package/dist/cleanup-D3CSRBBZ.js.map +0 -1
  175. package/dist/commit-IWGT42XN.js.map +0 -1
  176. package/dist/contribute-WSJTV2RX.js.map +0 -1
  177. package/dist/dev-server-Q6M62ATG.js.map +0 -1
  178. package/dist/ignite-OPO6EDYT.js +0 -784
  179. package/dist/ignite-OPO6EDYT.js.map +0 -1
  180. package/dist/init-ALYWKNWG.js.map +0 -1
  181. package/dist/issues-L7TBUPXT.js +0 -116
  182. package/dist/issues-L7TBUPXT.js.map +0 -1
  183. package/dist/open-KWOV2OFO.js.map +0 -1
  184. package/dist/plan-BRJBFJHF.js.map +0 -1
  185. package/dist/recap-GKJXMDXW.js.map +0 -1
  186. package/dist/run-QEUVZF7J.js.map +0 -1
  187. package/dist/shell-DAAVG4YN.js.map +0 -1
  188. package/dist/summary-ZKOA35PT.js.map +0 -1
  189. /package/dist/{BranchNamingService-K6XNWQ6C.js.map → BranchNamingService-ECJHBB67.js.map} +0 -0
  190. /package/dist/{ClaudeContextManager-X2Y72GRL.js.map → ClaudeContextManager-QXX6ZFST.js.map} +0 -0
  191. /package/dist/{ClaudeService-7P32TTES.js.map → ClaudeService-NJNK2SUH.js.map} +0 -0
  192. /package/dist/{GitHubService-O7T6CFAJ.js.map → GitHubService-MEHKHUQP.js.map} +0 -0
  193. /package/dist/{MetadataManager-W3C54UYT.js.map → IssueTrackerFactory-NG53YX5S.js.map} +0 -0
  194. /package/dist/{LoomLauncher-3I47SUPV.js.map → LoomLauncher-L64HHS3T.js.map} +0 -0
  195. /package/dist/{ProjectCapabilityDetector-N5L7T4IY.js.map → MetadataManager-5QZSTKNN.js.map} +0 -0
  196. /package/dist/{PromptTemplateManager-36YLQRHP.js.map → ProjectCapabilityDetector-5KSYUTBJ.js.map} +0 -0
  197. /package/dist/{SettingsManager-QR7V2IW2.js.map → PromptTemplateManager-DULSVRRE.js.map} +0 -0
  198. /package/dist/{claude-TP2QO3BU.js.map → SettingsManager-BQDQA3FK.js.map} +0 -0
  199. /package/dist/{build-IC4CJRMP.js.map → build-5GO3XW26.js.map} +0 -0
  200. /package/dist/{chunk-USSL2X4A.js.map → chunk-3D7WQM7I.js.map} +0 -0
  201. /package/dist/{chunk-2JPXGGP4.js.map → chunk-5MWV33NN.js.map} +0 -0
  202. /package/dist/{chunk-KAYXR544.js.map → chunk-J5S7DFYC.js.map} +0 -0
  203. /package/dist/{chunk-H6ST2TGP.js.map → chunk-MNHZB4Z2.js.map} +0 -0
  204. /package/dist/{chunk-TL72BGP6.js.map → chunk-MORRVYPT.js.map} +0 -0
  205. /package/dist/{chunk-7ZEHSSUP.js.map → chunk-P4O6EH46.js.map} +0 -0
  206. /package/dist/{chunk-RD7OPXZK.js.map → chunk-UVD4CZKS.js.map} +0 -0
  207. /package/dist/{chunk-JT5LZRMI.js.map → chunk-VECNX6VX.js.map} +0 -0
  208. /package/dist/{chunk-4GAJJUYS.js.map → chunk-VGGST52X.js.map} +0 -0
  209. /package/dist/{chunk-4LKGCFGG.js.map → chunk-WWKOVDWC.js.map} +0 -0
  210. /package/dist/{chunk-NTTSUAVM.js.map → chunk-ZEWU5PZK.js.map} +0 -0
  211. /package/dist/{git-W3XUIFTR.js.map → claude-P3NQR6IJ.js.map} +0 -0
  212. /package/dist/{compile-EOWJORKO.js.map → compile-ZS4HYRX5.js.map} +0 -0
  213. /package/dist/{feedback-QPNDZQRV.js.map → feedback-TMBXSCM5.js.map} +0 -0
  214. /package/dist/{neon-helpers-VVFFTLXE.js.map → git-ET64COO3.js.map} +0 -0
  215. /package/dist/{lint-IHUH45OC.js.map → lint-6TQXDZ3T.js.map} +0 -0
  216. /package/dist/{projects-LH362JZQ.js.map → projects-2UOXFLNZ.js.map} +0 -0
  217. /package/dist/{rebase-AJOJOZUG.js.map → rebase-DWIB77KV.js.map} +0 -0
  218. /package/dist/{test-5GPWWO3P.js.map → test-F7JNJZYP.js.map} +0 -0
  219. /package/dist/{test-git-EJUKDB7F.js.map → test-git-BTAOIUE2.js.map} +0 -0
  220. /package/dist/{test-prefix-23TOBUXY.js.map → test-prefix-Q6TFSU6F.js.map} +0 -0
  221. /package/dist/{test-webserver-CKROHFBQ.js.map → test-webserver-EONCG7E7.js.map} +0 -0
  222. /package/dist/{vscode-6TOLFCI2.js.map → vscode-VA5X4P25.js.map} +0 -0
@@ -325,6 +325,47 @@ The following JSON Schema defines valid iloom settings:
325
325
  "review": {
326
326
  "type": "boolean",
327
327
  "description": "Whether artifacts from this agent should be reviewed before posting (defaults to false)"
328
+ },
329
+ "agents": {
330
+ "type": "object",
331
+ "additionalProperties": {
332
+ "type": "object",
333
+ "properties": {
334
+ "model": {
335
+ "type": "string",
336
+ "enum": [
337
+ "sonnet",
338
+ "opus",
339
+ "haiku"
340
+ ],
341
+ "description": "Claude model shorthand: sonnet, opus, or haiku"
342
+ },
343
+ "enabled": {
344
+ "type": "boolean",
345
+ "description": "Whether this agent is enabled. Defaults to true."
346
+ },
347
+ "providers": {
348
+ "type": "object",
349
+ "additionalProperties": {
350
+ "type": "string"
351
+ },
352
+ "propertyNames": {
353
+ "enum": [
354
+ "claude",
355
+ "gemini",
356
+ "codex"
357
+ ]
358
+ },
359
+ "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\")"
360
+ },
361
+ "review": {
362
+ "type": "boolean",
363
+ "description": "Whether artifacts from this agent should be reviewed before posting (defaults to false)"
364
+ }
365
+ },
366
+ "additionalProperties": false
367
+ },
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."
328
369
  }
329
370
  },
330
371
  "additionalProperties": false
@@ -336,7 +377,7 @@ The following JSON Schema defines valid iloom settings:
336
377
  "type": "null"
337
378
  }
338
379
  ],
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)"
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."
340
381
  },
341
382
  "spin": {
342
383
  "type": "object",
@@ -413,17 +454,6 @@ The following JSON Schema defines valid iloom settings:
413
454
  "capabilities": {
414
455
  "type": "object",
415
456
  "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
457
  "web": {
428
458
  "type": "object",
429
459
  "properties": {
@@ -434,7 +464,8 @@ The following JSON Schema defines valid iloom settings:
434
464
  "description": "Base port for web workspace port calculations (default: 3000)"
435
465
  }
436
466
  },
437
- "additionalProperties": false
467
+ "additionalProperties": false,
468
+ "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
469
  },
439
470
  "database": {
440
471
  "type": "object",
@@ -489,10 +520,11 @@ The following JSON Schema defines valid iloom settings:
489
520
  "type": "string",
490
521
  "enum": [
491
522
  "github",
492
- "linear"
523
+ "linear",
524
+ "jira"
493
525
  ],
494
526
  "default": "github",
495
- "description": "Issue tracker provider (github, linear)"
527
+ "description": "Issue tracker provider (github, linear, jira)"
496
528
  },
497
529
  "github": {
498
530
  "type": "object",
@@ -529,6 +561,69 @@ The following JSON Schema defines valid iloom settings:
529
561
  "teamId"
530
562
  ],
531
563
  "additionalProperties": false
564
+ },
565
+ "jira": {
566
+ "type": "object",
567
+ "properties": {
568
+ "host": {
569
+ "type": "string",
570
+ "minLength": 1,
571
+ "description": "Jira instance URL (e.g., \"https://yourcompany.atlassian.net\")"
572
+ },
573
+ "username": {
574
+ "type": "string",
575
+ "minLength": 1,
576
+ "description": "Jira username or email address"
577
+ },
578
+ "apiToken": {
579
+ "type": "string",
580
+ "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"
581
+ },
582
+ "projectKey": {
583
+ "type": "string",
584
+ "minLength": 1,
585
+ "description": "Jira project key (e.g., \"PROJ\", \"ENG\")"
586
+ },
587
+ "boardId": {
588
+ "type": "string",
589
+ "description": "Jira board ID for sprint/workflow operations (optional)"
590
+ },
591
+ "transitionMappings": {
592
+ "type": "object",
593
+ "additionalProperties": {
594
+ "type": "string"
595
+ },
596
+ "description": "Map iloom states to Jira transition names (e.g., {\"In Review\": \"Start Review\"})"
597
+ },
598
+ "defaultIssueType": {
599
+ "type": "string",
600
+ "minLength": 1,
601
+ "default": "Task",
602
+ "description": "Default Jira issue type name for creating issues (e.g., \"Task\", \"Story\", \"Bug\")"
603
+ },
604
+ "defaultSubtaskType": {
605
+ "type": "string",
606
+ "minLength": 1,
607
+ "default": "Subtask",
608
+ "description": "Default Jira issue type name for creating subtasks/child issues (e.g., \"Subtask\", \"Sub-task\")"
609
+ },
610
+ "doneStatuses": {
611
+ "type": "array",
612
+ "items": {
613
+ "type": "string"
614
+ },
615
+ "default": [
616
+ "Done"
617
+ ],
618
+ "description": "Status names to exclude from issue lists (e.g., [\"Done\", \"Closed\", \"Verify\"])"
619
+ }
620
+ },
621
+ "required": [
622
+ "host",
623
+ "username",
624
+ "projectKey"
625
+ ],
626
+ "additionalProperties": false
532
627
  }
533
628
  },
534
629
  "additionalProperties": false,
@@ -552,6 +647,11 @@ The following JSON Schema defines valid iloom settings:
552
647
  "autoCommitPush": {
553
648
  "type": "boolean",
554
649
  "description": "Auto-commit and push after code review in draft PR mode. Defaults to true when mode is github-draft-pr."
650
+ },
651
+ "openBrowserOnFinish": {
652
+ "type": "boolean",
653
+ "default": true,
654
+ "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
655
  }
556
656
  },
557
657
  "additionalProperties": false,
@@ -604,6 +704,21 @@ The following JSON Schema defines valid iloom settings:
604
704
  ],
605
705
  "default": "upstreamOnly",
606
706
  "description": "Controls when iloom attribution appears in session summaries. \"off\" - never show attribution. \"upstreamOnly\" - only show for contributions to external repositories (e.g., open source). \"on\" - always show attribution."
707
+ },
708
+ "git": {
709
+ "type": "object",
710
+ "properties": {
711
+ "commitTimeout": {
712
+ "type": "number",
713
+ "minimum": 1000,
714
+ "maximum": 600000,
715
+ "default": 60000,
716
+ "description": "Timeout in milliseconds for git commit operations. Increase for long-running pre-commit hooks."
717
+ }
718
+ },
719
+ "additionalProperties": false,
720
+ "default": {},
721
+ "description": "Git operation settings"
607
722
  }
608
723
  },
609
724
  "additionalProperties": false
@@ -698,7 +813,6 @@ Parse both settings.json and settings.local.json. Merge them with local taking p
698
813
 
699
814
  Extract these current values if they exist:
700
815
  - `currentMainBranch` from `mainBranch` field (default: "main")
701
- - `currentWorktreePrefix` from `worktreePrefix` field (default: null which means use default - NOTE: "" does not mean default)
702
816
  - `currentPermissionMode` from `workflows.issue.permissionMode` field (default: "acceptEdits")
703
817
  - `currentBasePort` from `capabilities.web.basePort` field (default: 3000)
704
818
  - `currentMergeMode` from `mergeBehavior.mode` field (default: "local")
@@ -706,6 +820,10 @@ Extract these current values if they exist:
706
820
  - `currentIssueProvider` from `issueManagement.provider` field (default: "github")
707
821
  - `currentLinearTeamId` from `issueManagement.linear.teamId` field (if Linear is provider)
708
822
  - `currentGitHubRemote` from `issueManagement.github.remote` field (if GitHub is provider and multiple remotes)
823
+ - `currentJiraHost` from `issueManagement.jira.host` field (if Jira is provider)
824
+ - `currentJiraUsername` from `issueManagement.jira.username` field (if Jira is provider)
825
+ - `currentJiraProjectKey` from `issueManagement.jira.projectKey` field (if Jira is provider)
826
+ - `currentJiraBoardId` from `issueManagement.jira.boardId` field (if Jira is provider, optional)
709
827
 
710
828
  **If configuration already exists, display current configuration summary:**
711
829
 
@@ -713,13 +831,15 @@ Extract these current values if they exist:
713
831
  Current Configuration:
714
832
  ━━━━━━━━━━━━━━━━━━━━━
715
833
  Main Branch: [currentMainBranch or "main (default)"]
716
- Worktree Prefix: [currentWorktreePrefix or "default (repo-name-looms)"]
717
834
  Permission Mode (Issues): [currentPermissionMode or "acceptEdits (default)"]
718
835
  Base Port: [currentBasePort or "3000 (default)"]
719
836
  IDE: [currentIdeType or "vscode (default)"]
720
837
  Issue Tracker: [currentIssueProvider or "github (default)"]
721
838
  Linear Team ID: [currentLinearTeamId] (only if currentIssueProvider == linear)
722
839
  {{#if MULTIPLE_REMOTES}}GitHub Remote: [currentGitHubRemote] (only if currentIssueProvider == github){{/if}}
840
+ Jira Host: [currentJiraHost] (only if currentIssueProvider == jira)
841
+ Jira Project Key: [currentJiraProjectKey] (only if currentIssueProvider == jira)
842
+ Jira Board ID: [currentJiraBoardId] (only if currentIssueProvider == jira and boardId is set)
723
843
  ```
724
844
 
725
845
  **Then ask the user what they want to do:**
@@ -758,18 +878,7 @@ Use AskUserQuestion to ask ALL local development settings questions **IN A SINGL
758
878
  - Validation: Non-empty string
759
879
  - Store answer as: `mainBranch`
760
880
 
761
- 2. **Worktree Prefix**
762
- - Question format: "What prefix should iloom use for worktree directories?{{#if currentWorktreePrefix}} (Currently: [currentWorktreePrefix]){{/if}} Leave empty to use default (<repo-name>-looms)."
763
- - Options (as examples):
764
- - Use default prefix (recommened)
765
- - "looms" - Simple 'looms-' prefix
766
- - Empty - each loom will be a sibling of this directory
767
- - Default: currentWorktreePrefix or default (NOTE: empty does NOT mean use default)
768
- - Validation: If not empty, only alphanumeric characters, hyphens, underscores, and forward slashes allowed
769
- - Store answer as: `worktreePrefix`
770
- - Note: If user specifies default, omit this field from settings, it they say empty, add an empty string to the settings
771
-
772
- 3. **Permission Mode for Issue Workflows**
881
+ 2. **Permission Mode for Issue Workflows**
773
882
  - Question format: "What permission mode should Claude use when working on issues?{{#if currentPermissionMode}} (Currently: [currentPermissionMode]){{/if}}"
774
883
  - Options:
775
884
  - "default" - Use Claude Code's default behavior
@@ -780,7 +889,7 @@ Use AskUserQuestion to ask ALL local development settings questions **IN A SINGL
780
889
  - Validation: Must be one of: default, plan, acceptEdits, bypassPermissions
781
890
  - Store answer as: `workflows.issue.permissionMode` - NOTE: this is a personal preference - recommend it be stored in the gitignored local settings file.
782
891
 
783
- 4. **Base Port**
892
+ 3. **Base Port**
784
893
  - Question format: "What base port should web development servers use?{{#if currentBasePort}} (Currently: [currentBasePort]){{/if}}"
785
894
  - Options (as examples):
786
895
  - "3000" - Common Node.js default
@@ -812,7 +921,69 @@ The agent will:
812
921
  4. Create `.iloom/package.iloom.json` with the detected configuration
813
922
  5. Detect and set project capabilities (cli, web) based on the framework
814
923
 
815
- **File Format:**
924
+ **package.iloom.json Schema:**
925
+ ```json
926
+ {
927
+ "$ref": "#/definitions/PackageIloom",
928
+ "definitions": {
929
+ "PackageIloom": {
930
+ "type": "object",
931
+ "properties": {
932
+ "capabilities": {
933
+ "type": "array",
934
+ "items": {
935
+ "type": "string",
936
+ "enum": [
937
+ "cli",
938
+ "web"
939
+ ]
940
+ },
941
+ "description": "Project capabilities - \"cli\" for command-line tools (enables CLI isolation), \"web\" for web applications (enables port assignment and dev server)"
942
+ },
943
+ "scripts": {
944
+ "type": "object",
945
+ "properties": {
946
+ "install": {
947
+ "type": "string",
948
+ "description": "Install command (e.g., \"bundle install\", \"poetry install\")"
949
+ },
950
+ "build": {
951
+ "type": "string",
952
+ "description": "Build/compile command"
953
+ },
954
+ "test": {
955
+ "type": "string",
956
+ "description": "Test suite command"
957
+ },
958
+ "dev": {
959
+ "type": "string",
960
+ "description": "Dev server command"
961
+ },
962
+ "lint": {
963
+ "type": "string",
964
+ "description": "Linting command"
965
+ },
966
+ "typecheck": {
967
+ "type": "string",
968
+ "description": "Type checking command"
969
+ },
970
+ "compile": {
971
+ "type": "string",
972
+ "description": "Compilation command (preferred over typecheck if both exist)"
973
+ }
974
+ },
975
+ "additionalProperties": false,
976
+ "description": "Custom shell commands for project operations. These are raw shell commands, not npm script names."
977
+ }
978
+ },
979
+ "additionalProperties": false
980
+ }
981
+ },
982
+ "$schema": "http://json-schema.org/draft-07/schema#"
983
+ }
984
+ ```
985
+
986
+ **File Format Example:**
816
987
  ```json
817
988
  {
818
989
  "capabilities": ["cli"],
@@ -853,7 +1024,16 @@ If the framework detector did not set capabilities, or if you need to ask the us
853
1024
  - "web" - Web application with dev server
854
1025
  - "both" - Both CLI and web capabilities
855
1026
  - "neither" - Library or other project type
856
- - Update `.iloom/package.iloom.json` with the appropriate `capabilities` array.
1027
+
1028
+ **Choose where to save package.iloom configuration:**
1029
+
1030
+ After determining the configuration, ask the user where to save it:
1031
+ - **Project** (`package.iloom.json`) - Shared with team, committed to git
1032
+ - **Local** (`package.iloom.local.json`) - Local only, gitignored, never committed
1033
+
1034
+ Default to **Local** if fork was detected (origin + upstream remotes). Otherwise default to **Project**.
1035
+
1036
+ Write the capabilities and scripts to the chosen file.
857
1037
 
858
1038
  **When to infer capabilities:**
859
1039
  - Flask/Django/FastAPI/Rails/Actix/Rocket detected -> include "web"
@@ -871,7 +1051,7 @@ This phase configures external tooling integrations. Use AskUserQuestion to gath
871
1051
  **Step 1: Issue Tracker Provider**
872
1052
 
873
1053
  {{#if MULTIPLE_REMOTES}}
874
- 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.
1054
+ 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.
875
1055
  {{/if}}
876
1056
 
877
1057
  1. **Issue Tracker Provider**
@@ -879,8 +1059,9 @@ Since this repository has multiple git remotes, GitHub Issues is suggested as th
879
1059
  - Options:
880
1060
  - "github" - GitHub Issues (default)
881
1061
  - "linear" - Linear Issues
1062
+ - "jira" - Jira Cloud
882
1063
  - Default: currentIssueProvider or "github"
883
- - Validation: Must be one of: github, linear
1064
+ - Validation: Must be one of: github, linear, jira
884
1065
  - Store answer as: `issueManagement.provider`
885
1066
 
886
1067
  **Note on Provider + Merge Mode Combinations:**
@@ -888,6 +1069,8 @@ Since this repository has multiple git remotes, GitHub Issues is suggested as th
888
1069
  - GitHub Issues + github-pr or github-draft-pr: Requires authorized GitHub CLI (`gh`)
889
1070
  - Linear Issues + local merge: Requires Linear API token only
890
1071
  - Linear Issues + github-pr or github-draft-pr: Requires BOTH Linear API token AND authorized GitHub CLI (`gh`)
1072
+ - Jira Cloud + local merge: Requires Jira credentials (host, username, API token) only
1073
+ - Jira Cloud + github-pr or github-draft-pr: Requires BOTH Jira credentials AND authorized GitHub CLI (`gh`)
891
1074
 
892
1075
  **Step 2: Provider-Specific Configuration**
893
1076
 
@@ -943,6 +1126,59 @@ This repository has multiple git remotes detected. iloom needs to know which rem
943
1126
  - **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.
944
1127
  - Context: Get your API token from Linear Settings → API → Personal API Keys (https://linear.app/settings/api)
945
1128
 
1129
+ **If Jira was selected:**
1130
+
1131
+ 2. **Jira Host URL** (only ask if issue provider is "jira")
1132
+ - Question format: "What is your Jira instance URL?{{#if currentJiraHost}} (Currently: [currentJiraHost]){{/if}}"
1133
+ - Options (as examples):
1134
+ - "https://yourcompany.atlassian.net" - Jira Cloud instance
1135
+ - Default: currentJiraHost or NO DEFAULT (required if Jira is selected)
1136
+ - 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.
1137
+ - Store answer as: `issueManagement.jira.host`
1138
+ - Context: This is your Jira Cloud instance URL (e.g., "https://yourcompany.atlassian.net")
1139
+
1140
+ 3. **Jira Username/Email** (only ask if issue provider is "jira")
1141
+ - Question format: "What is your Atlassian account email?{{#if currentJiraUsername}} (Currently: [currentJiraUsername]){{/if}}"
1142
+ - Default: currentJiraUsername or NO DEFAULT (required if Jira is selected)
1143
+ - Validation: Non-empty string
1144
+ - Store answer as: `issueManagement.jira.username`
1145
+ - **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.
1146
+ - Context: This is the email address associated with your Atlassian account
1147
+
1148
+ 4. **Jira API Token** (only ask if issue provider is "jira")
1149
+ - Question format: "What is your Jira API token? (Currently: 'set' or 'unset' - do not print)"
1150
+ - Options:
1151
+ - I have it now - use the "Type something" option to enter it
1152
+ - I'll come back to it
1153
+ - Default: currentJiraApiToken or NO DEFAULT
1154
+ - Validation: Non-empty string
1155
+ - Guidance: Choose "Type something" to enter it
1156
+ - Store answer as: `issueManagement.jira.apiToken`
1157
+ - **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.
1158
+ - Context: Generate an API token at https://id.atlassian.com/manage-profile/security/api-tokens
1159
+
1160
+ 5. **Jira Project Key** (only ask if issue provider is "jira")
1161
+ - Question format: "What is your Jira project key?{{#if currentJiraProjectKey}} (Currently: [currentJiraProjectKey]){{/if}}"
1162
+ - Options (as examples):
1163
+ - "PROJ" - Project team
1164
+ - "ENG" - Engineering team
1165
+ - Default: currentJiraProjectKey or NO DEFAULT (required if Jira is selected)
1166
+ - Validation: Non-empty string, typically uppercase letters
1167
+ - Store answer as: `issueManagement.jira.projectKey`
1168
+ - Context: This is the project key prefix shown in your Jira issue IDs (e.g., "PROJ" in "PROJ-123")
1169
+
1170
+ 6. **Jira Board ID** (only ask if issue provider is "jira")
1171
+ - Question format: "What is your Jira board ID? (optional, used for sprint filtering){{#if currentJiraBoardId}} (Currently: [currentJiraBoardId]){{/if}}"
1172
+ - Options:
1173
+ - Skip - Don't configure board ID now
1174
+ - Enter board ID - use the "Type something" option to enter it
1175
+ - Default: currentJiraBoardId or SKIP (optional)
1176
+ - Validation: If provided, must be a numeric string
1177
+ - Store answer as: `issueManagement.jira.boardId`
1178
+ - 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`.
1179
+
1180
+ **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.
1181
+
946
1182
  **Step 3: IDE Selection**
947
1183
 
948
1184
  4. **IDE Selection**
@@ -980,7 +1216,7 @@ This repository has multiple git remotes detected. iloom needs to know which rem
980
1216
 
981
1217
  **Implementation Details:**
982
1218
  - Ask Step 1 first to determine provider
983
- - Then ask Step 2 based on the provider selected (includes Linear API Token if Linear was selected)
1219
+ - Then ask Step 2 based on the provider selected (includes Linear API Token if Linear was selected, or Jira credentials if Jira was selected)
984
1220
  - Ask Step 3 (IDE) for all users
985
1221
  - Ask Step 4 (Merge Mode) only if multiple remotes detected OR user requests advanced config
986
1222
  - Set multiSelect: false for all questions
@@ -1030,7 +1266,6 @@ Configuration Summary:
1030
1266
 
1031
1267
  Local Development Settings (Phase 1):
1032
1268
  Main Branch: [value]
1033
- Worktree Prefix: [value or "default (repo-name-looms)"]
1034
1269
  Permission Mode (Issues): [value]
1035
1270
  Base Port: [value]
1036
1271
 
@@ -1039,6 +1274,10 @@ Tooling Configuration (Phase 2):
1039
1274
  Linear Team ID: [value] (only if issue tracker is Linear)
1040
1275
  Linear API Token: [configured/not configured] (only if issue tracker is Linear - never show actual token)
1041
1276
  {{#if MULTIPLE_REMOTES}}GitHub Remote: [value] (only if issue tracker is GitHub){{/if}}
1277
+ Jira Host: [value] (only if issue tracker is Jira)
1278
+ Jira Project Key: [value] (only if issue tracker is Jira)
1279
+ Jira Board ID: [value or "not configured"] (only if issue tracker is Jira)
1280
+ Jira API Token: [configured/not configured] (only if issue tracker is Jira - never show actual token)
1042
1281
  IDE: [value or "vscode (default)"]
1043
1282
  Merge Mode: [value] (only if configured)
1044
1283
  ```
@@ -1046,6 +1285,7 @@ Tooling Configuration (Phase 2):
1046
1285
  **Note**:
1047
1286
  - Include the GitHub Remote line in the summary ONLY if it was configured in Phase 2 (multiple remotes and GitHub selected)
1048
1287
  - Include Linear Team ID ONLY if Linear was selected as the issue tracker provider
1288
+ - Include Jira Host, Project Key, Board ID, and API Token ONLY if Jira was selected as the issue tracker provider
1049
1289
  - Include Merge Mode ONLY if it was asked and configured (multiple remotes or advanced config)
1050
1290
 
1051
1291
  Then ask: "Does this configuration look correct?"
@@ -1184,6 +1424,46 @@ When both settings.json and settings.local.json exist, you MUST prevent duplicat
1184
1424
  }
1185
1425
  ```
1186
1426
 
1427
+ **For Jira:**
1428
+
1429
+ In settings.json (committed):
1430
+ ```json
1431
+ {
1432
+ "issueManagement": {
1433
+ "provider": "jira",
1434
+ "jira": {
1435
+ "host": "<user's Jira host URL>",
1436
+ "projectKey": "<user's project key>"
1437
+ }
1438
+ }
1439
+ }
1440
+ ```
1441
+
1442
+ In settings.local.json (gitignored - MUST be separate from settings.json):
1443
+ ```json
1444
+ {
1445
+ "issueManagement": {
1446
+ "jira": {
1447
+ "username": "<user's Atlassian email>",
1448
+ "apiToken": "<user's API token>"
1449
+ }
1450
+ }
1451
+ }
1452
+ ```
1453
+
1454
+ If a boardId was provided, add it to settings.json alongside host and projectKey:
1455
+ ```json
1456
+ {
1457
+ "issueManagement": {
1458
+ "jira": {
1459
+ "boardId": "<user's board ID>"
1460
+ }
1461
+ }
1462
+ }
1463
+ ```
1464
+
1465
+ **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`.
1466
+
1187
1467
  6. **Add mergeBehavior ONLY if mode is not "local":**
1188
1468
  ```json
1189
1469
  {
@@ -1314,16 +1594,16 @@ Would you like to commit these changes?
1314
1594
  - Yes - Commit iloom configuration changes (strongly recommended)
1315
1595
  - No - Skip committing (not recommended)
1316
1596
 
1317
- ⚠️ WARNING: If you don't commit settings.json, iloom will not work correctly in new looms.
1597
+ ⚠️ WARNING: If you don't commit settings.json and package.iloom.json, iloom will not work correctly in new looms.
1318
1598
  Looms are created from committed code, so your configuration won't be available.
1319
- (Local files like settings.local.json and .env are copied automatically - but settings.json must be committed.)
1599
+ (Local files like settings.local.json, package.iloom.local.json, and .env are copied automatically - but shared files must be committed.)
1320
1600
  ```
1321
1601
 
1322
1602
  **CRITICAL RULES:**
1323
- - **ONLY commit iloom-related files**: .iloom/settings.json, .gitignore
1603
+ - **ONLY commit iloom-related files**: .iloom/settings.json, .iloom/package.iloom.json, .gitignore
1324
1604
  - **NEVER stage or commit unrelated files** - even if they appear in `git status`
1325
1605
  - **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
1326
- - **Do NOT commit settings.local.json** - it should be gitignored, not committed
1606
+ - **Do NOT commit local-only files** - settings.local.json and package.iloom.local.json should be gitignored, not committed
1327
1607
  - **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.
1328
1608
 
1329
1609
  **Step 3: If user says yes, commit the changes**
@@ -1332,10 +1612,10 @@ VERIFY YOU'RE NOT BUNDLING ALL CHANGES IN ONE FILE DESPITE GUIDANCE TO SPLIT ACC
1332
1612
 
1333
1613
  Stage ONLY the iloom-related files that should be committed:
1334
1614
  ```bash
1335
- git add .iloom/settings.json .gitignore 2>/dev/null || true
1615
+ git add .iloom/settings.json .iloom/package.iloom.json .gitignore 2>/dev/null || true
1336
1616
  ```
1337
1617
 
1338
- Note: Do NOT add .iloom/settings.local.json - it's meant to be local-only.
1618
+ Note: Do NOT add local-only files (.iloom/settings.local.json, .iloom/package.iloom.local.json) - they should be gitignored, not committed.
1339
1619
 
1340
1620
  Then commit:
1341
1621
 
@@ -1398,18 +1678,30 @@ Here's how to get started:
1398
1678
  • Run `iloom finish` when you're done working to merge changes and clean up
1399
1679
 
1400
1680
  Need more advanced configuration? I can help you set up:
1681
+ • Merge Behavior - Choose between local merge, GitHub PR, or draft PR workflows
1682
+ • Copy Gitignored Files - Automatically copy local databases, test fixtures, or other gitignored files to new looms
1683
+ • Multi-Provider Code Review - Get code reviews from Gemini or Codex alongside Claude
1684
+ • Plan Configuration - Use different AI providers for planning and plan review
1401
1685
  • Agent Models - Use different Claude models for different tasks
1686
+ • Swarm Agent Models - Configure different models for agents when running in swarm mode
1402
1687
  • Database Settings - Configure database branching for isolated development
1688
+ • Skip Pre-Commit Hooks - Bypass slow or failing hooks during commit and finish workflows
1403
1689
  • Workflow Behavior - Control permissions, IDE launching, dev servers, and terminal behavior
1404
1690
  • Protected Branches - Prevent iloom from creating worktrees for certain branches
1405
1691
  • Custom Scripts - Override package.json scripts with custom commands
1406
1692
 
1407
1693
  You can ask me questions like:
1694
+ "How do I set up GitHub PR mode instead of local merge?"
1695
+ "How do I copy my local SQLite database to new looms?"
1696
+ "Can I get code reviews from Gemini as well as Claude?"
1697
+ "How do I use Codex for planning?"
1408
1698
  "Is it possible to have the analysis agent use a different model?"
1409
1699
  "How do I configure database branching?"
1700
+ "How do I skip pre-commit hooks?"
1410
1701
  "Can I disable the IDE from launching automatically?"
1411
1702
  "How do I protect my main branch from worktree creation?"
1412
1703
  "What models are available for the different agents?"
1704
+ "How do I use different models for swarm workers vs normal mode?"
1413
1705
  "How do I use custom build/test commands instead of package.json scripts?"
1414
1706
 
1415
1707
  Just ask any of these questions and I'll help you modify your settings.
@@ -1441,6 +1733,35 @@ When configuring agents, use these model identifiers:
1441
1733
  }
1442
1734
  ```
1443
1735
 
1736
+ **Swarm-Specific Phase Agent Models:**
1737
+
1738
+ In swarm mode, you can configure different models for phase agents (analyzer, planner, implementer, etc.) than in normal mode:
1739
+
1740
+ ```json
1741
+ "agents": {
1742
+ "iloom-issue-implementer": {
1743
+ "model": "opus"
1744
+ },
1745
+ "iloom-swarm-worker": {
1746
+ "model": "opus",
1747
+ "agents": {
1748
+ "iloom-issue-implementer": {
1749
+ "model": "sonnet"
1750
+ },
1751
+ "iloom-issue-planner": {
1752
+ "model": "haiku"
1753
+ }
1754
+ }
1755
+ }
1756
+ }
1757
+ ```
1758
+
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
1764
+
1444
1765
  2. **Database Environment Variable:**
1445
1766
  ```json
1446
1767
  "capabilities": {
@@ -1462,19 +1783,26 @@ When configuring agents, use these model identifiers:
1462
1783
  }
1463
1784
  ```
1464
1785
 
1465
- 4. **Protected Branches:**
1786
+ 4. **Copy Gitignored Files:**
1787
+ ```json
1788
+ "copyGitIgnoredPatterns": ["*.db", "data/*.sqlite", "tmp/fixtures/**"]
1789
+ ```
1790
+
1791
+ 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
+
1793
+ 5. **Protected Branches:**
1466
1794
  ```json
1467
1795
  "protectedBranches": ["main", "production", "release/*"]
1468
1796
  ```
1469
1797
 
1470
- 5. **IDE Configuration:**
1798
+ 6. **IDE Configuration:**
1471
1799
  ```json
1472
1800
  "ide": {
1473
1801
  "type": "cursor"
1474
1802
  }
1475
1803
  ```
1476
1804
 
1477
- 6. **Code Review with Multiple Providers:**
1805
+ 7. **Code Review with Multiple Providers:**
1478
1806
  ```json
1479
1807
  "agents": {
1480
1808
  "iloom-code-reviewer": {
@@ -1488,7 +1816,7 @@ When configuring agents, use these model identifiers:
1488
1816
 
1489
1817
  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.
1490
1818
 
1491
- 7. **Custom Script Configuration (package.iloom.json):**
1819
+ 8. **Custom Script Configuration (package.iloom.json):**
1492
1820
 
1493
1821
  If users want to override or supplement npm scripts with custom commands, help them create `.iloom/package.iloom.json`:
1494
1822
  ```json
@@ -1546,6 +1874,15 @@ When configuring agents, use these model identifiers:
1546
1874
  - Your local environment needs different commands than the team standard
1547
1875
  - You want to add debug flags or local-only tooling without affecting others
1548
1876
 
1877
+ ## Telemetry
1878
+
1879
+ iloom collects anonymous usage data to improve the product. If the user asks about telemetry or data collection during setup:
1880
+
1881
+ - **CLI telemetry**: Managed via `il telemetry off` (disable) and `il telemetry on` (re-enable). Run `il telemetry status` to check current state.
1882
+ - **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.
1883
+ - **What's collected**: Only anonymous usage events (commands run, errors). No personal information, repo names, or code.
1884
+ - **Distinct ID**: A random UUID stored in `~/.config/iloom-ai/telemetry.json`, shared between CLI and VS Code extension.
1885
+
1549
1886
  ## Important Notes
1550
1887
 
1551
1888
  - **Validate ALL inputs** against the schema before writing files
@@ -1554,7 +1891,7 @@ When configuring agents, use these model identifiers:
1554
1891
  - **For existing users** - Ask what they want to do (modify, add advanced config, start fresh, or exit) instead of forcing them through the entire flow
1555
1892
  - **For new users** - Skip directly to Phase 1 (Local Development Settings) and proceed through Phase 2 (Tooling Configuration)
1556
1893
  - **ALWAYS use the question formats** specified in Phase 1 and Phase 2 that include "(Currently: [value])" when current values exist
1557
- - **Phase 1 = Local dev settings** (main branch, worktree prefix, permission mode, base port)
1894
+ - **Phase 1 = Local dev settings** (main branch, permission mode, base port)
1558
1895
  - **Phase 2 = Tooling integrations** (issue tracker provider, provider-specific config, IDE, merge mode)
1559
1896
  - **Keep configuration minimal** - only include non-default values
1560
1897
  - **Honor recommendations/requirements of where to save certain settings - this may mean you have to create/update multiple settings files. (e.g when adding API keys for permissions mode settings)
@@ -1563,3 +1900,5 @@ When configuring agents, use these model identifiers:
1563
1900
  - **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.
1564
1901
  - **Deep comparison required** - When comparing settings for duplication, compare nested objects deeply (e.g., capabilities.web.basePort), not just top-level keys
1565
1902
  - **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)
1903
+ - **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.
1904
+ - **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.