@iloom/cli 0.1.17 → 0.1.18

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 (112) hide show
  1. package/README.md +14 -0
  2. package/dist/ClaudeContextManager-LD3VB6EM.js +13 -0
  3. package/dist/ClaudeService-CFFI7DD5.js +12 -0
  4. package/dist/{GitHubService-F7Z3XJOS.js → GitHubService-SH4H6VS5.js} +3 -3
  5. package/dist/{LoomLauncher-MODG2SEM.js → LoomLauncher-FB2MV2ZI.js} +7 -7
  6. package/dist/{PromptTemplateManager-7FINLRDE.js → PromptTemplateManager-WM5GIPEF.js} +2 -2
  7. package/dist/{SettingsManager-VAZF26S2.js → SettingsManager-SKLUVE3K.js} +6 -2
  8. package/dist/{add-issue-22JBNOML.js → add-issue-L5HX6LEV.js} +23 -8
  9. package/dist/add-issue-L5HX6LEV.js.map +1 -0
  10. package/dist/{chunk-SSR5AVRJ.js → chunk-6OTVPRXH.js} +21 -8
  11. package/dist/chunk-6OTVPRXH.js.map +1 -0
  12. package/dist/{chunk-KQDEK2ZW.js → chunk-DGEKUT7Q.js} +9 -5
  13. package/dist/chunk-DGEKUT7Q.js.map +1 -0
  14. package/dist/chunk-FXV24OYZ.js +83 -0
  15. package/dist/chunk-FXV24OYZ.js.map +1 -0
  16. package/dist/{chunk-HPJJSYNS.js → chunk-H5LDRGVK.js} +6 -8
  17. package/dist/{chunk-HPJJSYNS.js.map → chunk-H5LDRGVK.js.map} +1 -1
  18. package/dist/{chunk-WKEWRSDB.js → chunk-HURVAQRK.js} +3 -3
  19. package/dist/{chunk-T7QPXANZ.js → chunk-IIPTBZQW.js} +17 -17
  20. package/dist/chunk-IIPTBZQW.js.map +1 -0
  21. package/dist/{chunk-QEPVTTHD.js → chunk-IO4WFTL2.js} +17 -11
  22. package/dist/chunk-IO4WFTL2.js.map +1 -0
  23. package/dist/{chunk-JQ7VOSTC.js → chunk-KOCQAD2E.js} +3 -3
  24. package/dist/{chunk-F3XBU2R7.js → chunk-L4QGC27H.js} +68 -2
  25. package/dist/chunk-L4QGC27H.js.map +1 -0
  26. package/dist/{chunk-YYSKGAZT.js → chunk-LAPY6NAE.js} +17 -8
  27. package/dist/chunk-LAPY6NAE.js.map +1 -0
  28. package/dist/{chunk-O2QWO64Z.js → chunk-PV3GAXQO.js} +56 -3
  29. package/dist/chunk-PV3GAXQO.js.map +1 -0
  30. package/dist/{chunk-CP2NU2JC.js → chunk-Q2KYPAH2.js} +7 -7
  31. package/dist/{chunk-CP2NU2JC.js.map → chunk-Q2KYPAH2.js.map} +1 -1
  32. package/dist/{chunk-Y7SAGNUT.js → chunk-SLIMABFA.js} +2 -2
  33. package/dist/{chunk-W3DQTW63.js → chunk-USVVV3FP.js} +4 -4
  34. package/dist/chunk-VVH3ANF2.js +307 -0
  35. package/dist/chunk-VVH3ANF2.js.map +1 -0
  36. package/dist/{chunk-JBH2ZYYZ.js → chunk-VYQLLHZ7.js} +22 -3
  37. package/dist/chunk-VYQLLHZ7.js.map +1 -0
  38. package/dist/{chunk-SJUQ2NDR.js → chunk-ZMNQBJUI.js} +24 -19
  39. package/dist/chunk-ZMNQBJUI.js.map +1 -0
  40. package/dist/{cleanup-3LUWPSM7.js → cleanup-ZHROIBSQ.js} +12 -16
  41. package/dist/cleanup-ZHROIBSQ.js.map +1 -0
  42. package/dist/cli.js +96 -48
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{enhance-XJIQHVPD.js → enhance-VVMAKMVZ.js} +18 -8
  45. package/dist/enhance-VVMAKMVZ.js.map +1 -0
  46. package/dist/{feedback-23CLXKFT.js → feedback-AKHD7QIM.js} +8 -8
  47. package/dist/{finish-3CQZIULO.js → finish-WGPISUEH.js} +36 -313
  48. package/dist/finish-WGPISUEH.js.map +1 -0
  49. package/dist/{git-LVRZ57GJ.js → git-OUYMVYJX.js} +2 -2
  50. package/dist/{ignite-WXEF2ID5.js → ignite-JEN3K3OT.js} +7 -7
  51. package/dist/index.d.ts +791 -712
  52. package/dist/index.js +126 -32
  53. package/dist/index.js.map +1 -1
  54. package/dist/init-EVUT4ZQJ.js +339 -0
  55. package/dist/init-EVUT4ZQJ.js.map +1 -0
  56. package/dist/mcp/github-comment-server.js +12 -9
  57. package/dist/mcp/github-comment-server.js.map +1 -1
  58. package/dist/neon-helpers-ZVIRPKCI.js +10 -0
  59. package/dist/{open-X6BTENPV.js → open-ETZUFSE4.js} +15 -17
  60. package/dist/{open-X6BTENPV.js.map → open-ETZUFSE4.js.map} +1 -1
  61. package/dist/prompts/init-prompt.txt +746 -0
  62. package/dist/rebase-KBWFDZCN.js +95 -0
  63. package/dist/rebase-KBWFDZCN.js.map +1 -0
  64. package/dist/remote-GJEZWRCC.js +14 -0
  65. package/dist/{run-2JCPQAX3.js → run-4SVQ3WEU.js} +15 -17
  66. package/dist/{run-2JCPQAX3.js.map → run-4SVQ3WEU.js.map} +1 -1
  67. package/dist/schema/settings.schema.json +51 -1
  68. package/dist/{start-LWVRBJ6S.js → start-2NEZU7SE.js} +54 -53
  69. package/dist/{start-LWVRBJ6S.js.map → start-2NEZU7SE.js.map} +1 -1
  70. package/dist/{test-git-XPF4SZXJ.js → test-git-MKZATGZN.js} +3 -3
  71. package/dist/{test-prefix-XGFXFAYN.js → test-prefix-ZNLWDI3K.js} +3 -3
  72. package/dist/{update-DN3FSNKY.js → update-4TDDUR5K.js} +10 -4
  73. package/dist/{update-DN3FSNKY.js.map → update-4TDDUR5K.js.map} +1 -1
  74. package/package.json +1 -1
  75. package/dist/ClaudeContextManager-XOSXQ67R.js +0 -13
  76. package/dist/ClaudeService-YSZ6EXWP.js +0 -12
  77. package/dist/NeonProvider-PAGPUH7F.js +0 -12
  78. package/dist/add-issue-22JBNOML.js.map +0 -1
  79. package/dist/chunk-37DYYFVK.js +0 -29
  80. package/dist/chunk-37DYYFVK.js.map +0 -1
  81. package/dist/chunk-F3XBU2R7.js.map +0 -1
  82. package/dist/chunk-JBH2ZYYZ.js.map +0 -1
  83. package/dist/chunk-KQDEK2ZW.js.map +0 -1
  84. package/dist/chunk-O2QWO64Z.js.map +0 -1
  85. package/dist/chunk-QEPVTTHD.js.map +0 -1
  86. package/dist/chunk-SJUQ2NDR.js.map +0 -1
  87. package/dist/chunk-SSR5AVRJ.js.map +0 -1
  88. package/dist/chunk-T7QPXANZ.js.map +0 -1
  89. package/dist/chunk-YYSKGAZT.js.map +0 -1
  90. package/dist/cleanup-3LUWPSM7.js.map +0 -1
  91. package/dist/enhance-XJIQHVPD.js.map +0 -1
  92. package/dist/env-MDFL4ZXL.js +0 -23
  93. package/dist/finish-3CQZIULO.js.map +0 -1
  94. package/dist/init-RHACUR4E.js +0 -123
  95. package/dist/init-RHACUR4E.js.map +0 -1
  96. /package/dist/{ClaudeContextManager-XOSXQ67R.js.map → ClaudeContextManager-LD3VB6EM.js.map} +0 -0
  97. /package/dist/{ClaudeService-YSZ6EXWP.js.map → ClaudeService-CFFI7DD5.js.map} +0 -0
  98. /package/dist/{GitHubService-F7Z3XJOS.js.map → GitHubService-SH4H6VS5.js.map} +0 -0
  99. /package/dist/{LoomLauncher-MODG2SEM.js.map → LoomLauncher-FB2MV2ZI.js.map} +0 -0
  100. /package/dist/{NeonProvider-PAGPUH7F.js.map → PromptTemplateManager-WM5GIPEF.js.map} +0 -0
  101. /package/dist/{PromptTemplateManager-7FINLRDE.js.map → SettingsManager-SKLUVE3K.js.map} +0 -0
  102. /package/dist/{chunk-WKEWRSDB.js.map → chunk-HURVAQRK.js.map} +0 -0
  103. /package/dist/{chunk-JQ7VOSTC.js.map → chunk-KOCQAD2E.js.map} +0 -0
  104. /package/dist/{chunk-Y7SAGNUT.js.map → chunk-SLIMABFA.js.map} +0 -0
  105. /package/dist/{chunk-W3DQTW63.js.map → chunk-USVVV3FP.js.map} +0 -0
  106. /package/dist/{feedback-23CLXKFT.js.map → feedback-AKHD7QIM.js.map} +0 -0
  107. /package/dist/{SettingsManager-VAZF26S2.js.map → git-OUYMVYJX.js.map} +0 -0
  108. /package/dist/{ignite-WXEF2ID5.js.map → ignite-JEN3K3OT.js.map} +0 -0
  109. /package/dist/{env-MDFL4ZXL.js.map → neon-helpers-ZVIRPKCI.js.map} +0 -0
  110. /package/dist/{git-LVRZ57GJ.js.map → remote-GJEZWRCC.js.map} +0 -0
  111. /package/dist/{test-git-XPF4SZXJ.js.map → test-git-MKZATGZN.js.map} +0 -0
  112. /package/dist/{test-prefix-XGFXFAYN.js.map → test-prefix-ZNLWDI3K.js.map} +0 -0
@@ -0,0 +1,746 @@
1
+ # iloom CLI Configuration Guide
2
+
3
+ You are helping the user configure iloom CLI for their project. Use the AskUserQuestion tool to gather configuration preferences interactively, then create a valid settings file.
4
+
5
+ ## Settings Schema
6
+
7
+ The following JSON Schema defines valid iloom settings:
8
+
9
+ ```json
10
+ {
11
+ "$ref": "#/definitions/IloomSettings",
12
+ "definitions": {
13
+ "IloomSettings": {
14
+ "type": "object",
15
+ "properties": {
16
+ "mainBranch": {
17
+ "type": "string",
18
+ "minLength": 1,
19
+ "description": "Name of the main/primary branch for the repository"
20
+ },
21
+ "worktreePrefix": {
22
+ "type": "string",
23
+ "description": "Prefix for worktree directories. Empty string disables prefix. Defaults to <repo-name>-looms if not set."
24
+ },
25
+ "protectedBranches": {
26
+ "type": "array",
27
+ "items": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "description": "List of branches that cannot be deleted (defaults to [mainBranch, \"main\", \"master\", \"develop\"])"
32
+ },
33
+ "workflows": {
34
+ "type": "object",
35
+ "properties": {
36
+ "issue": {
37
+ "type": "object",
38
+ "properties": {
39
+ "permissionMode": {
40
+ "type": "string",
41
+ "enum": [
42
+ "plan",
43
+ "acceptEdits",
44
+ "bypassPermissions",
45
+ "default"
46
+ ],
47
+ "description": "Permission mode for Claude CLI in this workflow type"
48
+ },
49
+ "noVerify": {
50
+ "type": "boolean",
51
+ "description": "Skip pre-commit hooks (--no-verify) when committing during finish workflow"
52
+ },
53
+ "startIde": {
54
+ "type": "boolean",
55
+ "default": true,
56
+ "description": "Launch IDE (code) when starting this workflow type"
57
+ },
58
+ "startDevServer": {
59
+ "type": "boolean",
60
+ "default": true,
61
+ "description": "Launch development server when starting this workflow type"
62
+ },
63
+ "startAiAgent": {
64
+ "type": "boolean",
65
+ "default": true,
66
+ "description": "Launch Claude AI agent when starting this workflow type"
67
+ },
68
+ "startTerminal": {
69
+ "type": "boolean",
70
+ "default": false,
71
+ "description": "Launch terminal window without dev server when starting this workflow type"
72
+ }
73
+ },
74
+ "additionalProperties": false
75
+ },
76
+ "pr": {
77
+ "type": "object",
78
+ "properties": {
79
+ "permissionMode": {
80
+ "type": "string",
81
+ "enum": [
82
+ "plan",
83
+ "acceptEdits",
84
+ "bypassPermissions",
85
+ "default"
86
+ ],
87
+ "description": "Permission mode for Claude CLI in this workflow type"
88
+ },
89
+ "noVerify": {
90
+ "type": "boolean",
91
+ "description": "Skip pre-commit hooks (--no-verify) when committing during finish workflow"
92
+ },
93
+ "startIde": {
94
+ "type": "boolean",
95
+ "default": true,
96
+ "description": "Launch IDE (code) when starting this workflow type"
97
+ },
98
+ "startDevServer": {
99
+ "type": "boolean",
100
+ "default": true,
101
+ "description": "Launch development server when starting this workflow type"
102
+ },
103
+ "startAiAgent": {
104
+ "type": "boolean",
105
+ "default": true,
106
+ "description": "Launch Claude AI agent when starting this workflow type"
107
+ },
108
+ "startTerminal": {
109
+ "type": "boolean",
110
+ "default": false,
111
+ "description": "Launch terminal window without dev server when starting this workflow type"
112
+ }
113
+ },
114
+ "additionalProperties": false
115
+ },
116
+ "regular": {
117
+ "type": "object",
118
+ "properties": {
119
+ "permissionMode": {
120
+ "type": "string",
121
+ "enum": [
122
+ "plan",
123
+ "acceptEdits",
124
+ "bypassPermissions",
125
+ "default"
126
+ ],
127
+ "description": "Permission mode for Claude CLI in this workflow type"
128
+ },
129
+ "noVerify": {
130
+ "type": "boolean",
131
+ "description": "Skip pre-commit hooks (--no-verify) when committing during finish workflow"
132
+ },
133
+ "startIde": {
134
+ "type": "boolean",
135
+ "default": true,
136
+ "description": "Launch IDE (code) when starting this workflow type"
137
+ },
138
+ "startDevServer": {
139
+ "type": "boolean",
140
+ "default": true,
141
+ "description": "Launch development server when starting this workflow type"
142
+ },
143
+ "startAiAgent": {
144
+ "type": "boolean",
145
+ "default": true,
146
+ "description": "Launch Claude AI agent when starting this workflow type"
147
+ },
148
+ "startTerminal": {
149
+ "type": "boolean",
150
+ "default": false,
151
+ "description": "Launch terminal window without dev server when starting this workflow type"
152
+ }
153
+ },
154
+ "additionalProperties": false
155
+ }
156
+ },
157
+ "additionalProperties": false,
158
+ "description": "Per-workflow-type permission configurations"
159
+ },
160
+ "agents": {
161
+ "anyOf": [
162
+ {
163
+ "anyOf": [
164
+ {
165
+ "not": {}
166
+ },
167
+ {
168
+ "type": "object",
169
+ "additionalProperties": {
170
+ "type": "object",
171
+ "properties": {
172
+ "model": {
173
+ "type": "string",
174
+ "enum": [
175
+ "sonnet",
176
+ "opus",
177
+ "haiku"
178
+ ],
179
+ "description": "Claude model shorthand: sonnet, opus, or haiku"
180
+ }
181
+ },
182
+ "additionalProperties": false
183
+ }
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "type": "null"
189
+ }
190
+ ],
191
+ "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-issue-reviewer (reviews code changes against requirements)"
192
+ },
193
+ "capabilities": {
194
+ "type": "object",
195
+ "properties": {
196
+ "web": {
197
+ "type": "object",
198
+ "properties": {
199
+ "basePort": {
200
+ "type": "number",
201
+ "minimum": 1,
202
+ "maximum": 65535,
203
+ "description": "Base port for web workspace port calculations (default: 3000)"
204
+ }
205
+ },
206
+ "additionalProperties": false
207
+ },
208
+ "database": {
209
+ "type": "object",
210
+ "properties": {
211
+ "databaseUrlEnvVarName": {
212
+ "type": "string",
213
+ "minLength": 1,
214
+ "pattern": "^[A-Z_][A-Z0-9_]*$",
215
+ "default": "DATABASE_URL",
216
+ "description": "Name of environment variable for database connection URL"
217
+ }
218
+ },
219
+ "additionalProperties": false
220
+ }
221
+ },
222
+ "additionalProperties": false,
223
+ "description": "Project capability configurations"
224
+ },
225
+ "databaseProviders": {
226
+ "type": "object",
227
+ "properties": {
228
+ "neon": {
229
+ "type": "object",
230
+ "properties": {
231
+ "projectId": {
232
+ "type": "string",
233
+ "minLength": 1,
234
+ "pattern": "^[a-zA-Z0-9-]+$",
235
+ "description": "Neon project ID found in your project URL (e.g., \"fantastic-fox-3566354\")"
236
+ },
237
+ "parentBranch": {
238
+ "type": "string",
239
+ "minLength": 1,
240
+ "description": "Branch from which new database branches are created"
241
+ }
242
+ },
243
+ "required": [
244
+ "projectId",
245
+ "parentBranch"
246
+ ],
247
+ "additionalProperties": false,
248
+ "description": "Neon database configuration. Requires Neon CLI installed and authenticated for database branching."
249
+ }
250
+ },
251
+ "additionalProperties": false,
252
+ "description": "Database provider configurations"
253
+ },
254
+ "issueManagement": {
255
+ "type": "object",
256
+ "properties": {
257
+ "github": {
258
+ "type": "object",
259
+ "properties": {
260
+ "remote": {
261
+ "type": "string",
262
+ "minLength": 1,
263
+ "description": "Git remote name to use for GitHub operations"
264
+ }
265
+ },
266
+ "required": [
267
+ "remote"
268
+ ],
269
+ "additionalProperties": false
270
+ }
271
+ },
272
+ "additionalProperties": false,
273
+ "description": "Issue management configuration"
274
+ }
275
+ },
276
+ "additionalProperties": false
277
+ }
278
+ },
279
+ "$schema": "http://json-schema.org/draft-07/schema#"
280
+ }
281
+ ```
282
+
283
+ {{#IF SETTINGS_JSON}}
284
+ ## Existing Configuration (Shared)
285
+
286
+ The user has shared configuration at `.iloom/settings.json`:
287
+
288
+ ```json
289
+ SETTINGS_JSON
290
+ ```
291
+ {{/IF SETTINGS_JSON}}
292
+
293
+ {{#IF SETTINGS_LOCAL_JSON}}
294
+ ## Existing Configuration (Local)
295
+
296
+ The user has local configuration at `.iloom/settings.local.json`:
297
+
298
+ ```json
299
+ SETTINGS_LOCAL_JSON
300
+ ```
301
+ {{/IF SETTINGS_LOCAL_JSON}}
302
+
303
+ {{#IF SETTINGS_JSON}}{{#IF SETTINGS_LOCAL_JSON}}
304
+ **Configuration Priority**: Local settings (settings.local.json) override shared settings (settings.json) when both exist.
305
+ {{/IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_JSON}}
306
+
307
+ {{#IF SETTINGS_JSON}}{{#IF SETTINGS_LOCAL_JSON}}
308
+ You should present the combined configuration as defaults when asking questions, with local values taking precedence over shared values.
309
+ {{/IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_JSON}}
310
+
311
+ {{#IF SETTINGS_JSON}}{{#IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_JSON}}
312
+
313
+ ## Shell Autocomplete Configuration
314
+
315
+ **Shell detected: SHELL_TYPE**
316
+
317
+ Shell configuration file: `SHELL_CONFIG_PATH`
318
+
319
+ Current shell configuration:
320
+ ```
321
+ SHELL_CONFIG_CONTENT
322
+ ```
323
+
324
+ **BEFORE proceeding with iloom settings configuration, analyze the shell config file above and determine if autocomplete is already configured.**
325
+
326
+ Look for patterns like:
327
+ - `eval "$(iloom --completion)"`
328
+ - `eval "$(il --completion)"`
329
+ - `iloom --completion`
330
+ - `il --completion`
331
+
332
+ If autocomplete is already configured:
333
+ - Display: "✓ Shell autocomplete is already configured in SHELL_CONFIG_PATH"
334
+ - Proceed directly to iloom settings configuration below
335
+
336
+ If autocomplete is NOT configured:
337
+ - Ask the user: "Would you like to enable shell autocomplete for iloom commands?"
338
+ - If they say yes:
339
+ - Use the Write tool to append the appropriate completion setup line to SHELL_CONFIG_PATH
340
+ - For bash/zsh: `eval "$(iloom --completion)"`
341
+ - For fish: `iloom --completion | source`
342
+ - Display: "✓ Added autocomplete setup to SHELL_CONFIG_PATH. Restart your shell or run 'source SHELL_CONFIG_PATH' to enable."
343
+ - If they say no, just proceed to settings configuration
344
+
345
+ ## Configuration Workflow
346
+
347
+ Follow these steps to guide the user through configuration:
348
+
349
+ ### Phase 0: Extract Current Settings
350
+
351
+ **BEFORE doing anything else, extract current values from existing configuration:**
352
+
353
+ {{#IF SETTINGS_JSON}}{{#IF SETTINGS_LOCAL_JSON}}
354
+ Parse both settings.json and settings.local.json. Merge them with local taking precedence over shared.
355
+ {{/IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_JSON}}
356
+
357
+ {{#IF SETTINGS_JSON}}{{#IF SETTINGS_LOCAL_JSON}}{{/IF SETTINGS_LOCAL_JSON}}
358
+ {{#IF SETTINGS_LOCAL_JSON}}Parse settings.local.json to get current values.{{/IF SETTINGS_LOCAL_JSON}}
359
+ {{#IF SETTINGS_JSON}}Parse settings.json to get current values.{{/IF SETTINGS_JSON}}
360
+ {{/IF SETTINGS_JSON}}
361
+
362
+ Extract these current values if they exist:
363
+ - `currentMainBranch` from `mainBranch` field (default: "main")
364
+ - `currentWorktreePrefix` from `worktreePrefix` field (default: "" which means use default)
365
+ - `currentPermissionMode` from `workflows.issue.permissionMode` field (default: "acceptEdits")
366
+ - `currentBasePort` from `capabilities.web.basePort` field (default: 3000)
367
+
368
+ **If configuration already exists, display current configuration summary:**
369
+
370
+ ```
371
+ Current Configuration:
372
+ ━━━━━━━━━━━━━━━━━━━━━
373
+ Main Branch: [currentMainBranch or "main (default)"]
374
+ Worktree Prefix: [currentWorktreePrefix or "default (repo-name-looms)"]
375
+ Permission Mode (Issues): [currentPermissionMode or "acceptEdits (default)"]
376
+ Base Port: [currentBasePort or "3000 (default)"]
377
+ GitHub Remote: [currentGitHubRemote or "not configured"]
378
+ ```
379
+
380
+ **Then ask the user what they want to do:**
381
+
382
+ "Your iloom CLI is already configured. What would you like to do?
383
+ - Modify existing settings
384
+ - Configure GitHub remotes
385
+ - Add advanced configuration (agent models, database settings, protected branches, etc.)
386
+ - Start fresh with new configuration
387
+ - Nothing, just exit"
388
+
389
+ **Based on their answer:**
390
+ - **Modify existing settings** → Proceed to Phase 1 to update settings
391
+ {{#IF MULTIPLE_REMOTES}}
392
+ - **Configure GitHub remote** → Go to Phase 0.5 to configure remote, then skip to Phase 2 (summary), Phase 3 (choose file), and Phase 5 (save). Do NOT re-ask about other settings.
393
+ {{/IF MULTIPLE_REMOTES}}
394
+ - **Add advanced configuration** → Skip to Phase 8 to help with advanced options
395
+ - **Start fresh** → Proceed to Phase 1 to reconfigure from scratch
396
+ - **Nothing/Exit** → Show Phase 8 wrap-up message and end session
397
+
398
+ **If NO configuration exists**, skip directly to Phase 0.5 (GitHub Remote Configuration) without asking what they want to do.
399
+
400
+ ### Phase 0.5: GitHub Remote Configuration
401
+
402
+ REMOTES_INFO
403
+
404
+ **IMPORTANT: Before proceeding, determine if remote configuration is needed:**
405
+
406
+ {{#IF MULTIPLE_REMOTES}}
407
+ This repository has multiple git remotes detected. iloom needs to know which remote's GitHub repository to use for creating and reading issues.
408
+
409
+ **Detected remotes:**
410
+ REMOTES_INFO
411
+
412
+ If the user has no `issueManagement.github.remote` configured you MUST ask the user: "Which remote should iloom use for GitHub issue operations?"
413
+ - Show the list of detected remotes above with their repository URLs
414
+ - **Classic fork pattern (origin + upstream)**: If both "origin" and "upstream" remotes exist, recommend "upstream" since issues are typically tracked in the original repository, not personal forks. Explain: "In a typical fork workflow, 'upstream' points to the original project where issues are tracked, while 'origin' is your personal fork for submitting PRs."
415
+ - For other multi-remote scenarios: Default to "origin" if it exists, otherwise the first remote
416
+ - Store answer as: `issueManagement.github.remote`
417
+
418
+ **IMPORTANT**: Do NOT save this setting yet. You will ask the user where to save ALL configuration settings in Phase 3.
419
+ {{/IF MULTIPLE_REMOTES}}
420
+
421
+ {{#IF SINGLE_REMOTE}}
422
+ **Note:** Only one remote detected (SINGLE_REMOTE_NAME pointing to SINGLE_REMOTE_URL). iloom will use this for GitHub operations. No configuration needed.
423
+ {{/IF SINGLE_REMOTE}}
424
+
425
+ {{#IF NO_REMOTES}}
426
+ **Warning:** No git remotes detected. You may need to configure a remote before using iloom's GitHub features.
427
+ {{/IF NO_REMOTES}}
428
+
429
+ ### Phase 1: Essential Settings
430
+
431
+ Use AskUserQuestion to ask ALL essential settings questions **IN A SINGLE BATCH**. **ALWAYS include current values in questions as shown below:**
432
+
433
+ **Create a single AskUserQuestion call with these 4 questions:**
434
+
435
+ 1. **Main Branch**
436
+ - Question format: "What is your main/primary branch name?{{#IF currentMainBranch}} (Currently: [currentMainBranch]){{/IF currentMainBranch}}"
437
+ - Options (as examples, user can type "Other" to provide custom):
438
+ - "main" - Standard default
439
+ - "master" - Legacy default
440
+ - "develop" - Common development branch
441
+ - Default: currentMainBranch or "main"
442
+ - Validation: Non-empty string
443
+ - Store answer as: `mainBranch`
444
+
445
+ 2. **Worktree Prefix**
446
+ - Question format: "What prefix should iloom use for worktree directories?{{#IF currentWorktreePrefix}} (Currently: [currentWorktreePrefix]){{/IF currentWorktreePrefix}} Leave empty to use default (<repo-name>-looms)."
447
+ - Options (as examples):
448
+ - "" (empty) - Use default prefix
449
+ - "looms" - Simple prefix
450
+ - "../looms" - Sibling directory
451
+ - Default: currentWorktreePrefix or "" (empty means use default)
452
+ - Validation: If not empty, only alphanumeric characters, hyphens, underscores, and forward slashes allowed
453
+ - Store answer as: `worktreePrefix`
454
+ - Note: If user provides empty string, omit this field from settings
455
+
456
+ 3. **Permission Mode for Issue Workflows**
457
+ - Question format: "What permission mode should Claude use when working on issues?{{#IF currentPermissionMode}} (Currently: [currentPermissionMode]){{/IF currentPermissionMode}}"
458
+ - Options:
459
+ - "acceptEdits" - Claude executes with your confirmation (recommended)
460
+ - "plan" - Claude plans but doesn't execute
461
+ - "bypassPermissions" - ⚠️ Claude executes without confirmation (use with caution)
462
+ - "default" - Use Claude Code's default behavior
463
+ - Default: currentPermissionMode or "acceptEdits"
464
+ - Validation: Must be one of: plan, acceptEdits, bypassPermissions, default
465
+ - Store answer as: `workflows.issue.permissionMode`
466
+
467
+ 4. **Base Port**
468
+ - Question format: "What base port should web development servers use?{{#IF currentBasePort}} (Currently: [currentBasePort]){{/IF currentBasePort}}"
469
+ - Options (as examples):
470
+ - "3000" - Common Node.js default
471
+ - "8000" - Common Python default
472
+ - "5000" - Common Flask/Express default
473
+ - Default: currentBasePort or 3000
474
+ - Validation: Number between 1 and 65535
475
+ - Store answer as: `capabilities.web.basePort`
476
+
477
+ **Implementation Details:**
478
+ - Set multiSelect: false for all questions (user picks one answer per question)
479
+ - Use the AskUserQuestion tool with all 4 questions in the questions array
480
+ - Users can select "Other" on any question to provide custom input
481
+ - Process all answers at once when the user submits
482
+
483
+ ### Phase 2: Configuration Summary
484
+
485
+ After gathering all answers, display a summary like this:
486
+
487
+ ```
488
+ Configuration Summary:
489
+ ━━━━━━━━━━━━━━━━━━━━
490
+ Main Branch: [value]
491
+ Worktree Prefix: [value or "default (repo-name-looms)"]
492
+ Permission Mode (Issues): [value]
493
+ Base Port: [value]
494
+ {{#IF MULTIPLE_REMOTES}}GitHub Remote: [value]{{/IF MULTIPLE_REMOTES}}
495
+ ```
496
+
497
+ **Note**: Include the GitHub Remote line in the summary ONLY if it was configured in Phase 0.5.
498
+
499
+ Then ask: "Does this configuration look correct?"
500
+ - If yes, proceed to Phase 3
501
+ - If no, ask which setting they want to change and repeat that question
502
+
503
+ ### Phase 3: Choose Configuration File
504
+
505
+ **CRITICAL: You MUST ask the user where to save the configuration. DO NOT make assumptions or decide for them.**
506
+
507
+ Ask the user this exact question: "Should this configuration be committed to git?
508
+ - yes: Save to .iloom/settings.json (shared with team)
509
+ - no: Save to .iloom/settings.local.json (local only, gitignored)"
510
+
511
+ **DO NOT:**
512
+ - Assume what the user wants based on the type of setting
513
+ - Make decisions about what "should" be shared with the team
514
+ - Skip this question and auto-save to either file
515
+
516
+ Store the user's answer to determine which file to write in Phase 5.
517
+
518
+ ### Phase 4: File Generation
519
+
520
+ Based on the user's answers, generate the settings JSON content following these rules:
521
+
522
+ **CRITICAL: AVOID DUPLICATION BETWEEN SETTINGS FILES**
523
+
524
+ When both settings.json and settings.local.json exist, you MUST prevent duplication:
525
+ - **settings.json** = Shared settings committed to git (team defaults)
526
+ - **settings.local.json** = Local overrides NOT committed to git (personal customizations)
527
+
528
+ **Rules for preventing duplication:**
529
+
530
+ 1. **When updating settings.local.json:**
531
+ - ONLY include settings that DIFFER from settings.json
532
+ - If a setting has the same value in both files, REMOVE it from settings.local.json
533
+ - settings.local.json should ONLY contain overrides, not duplicates
534
+ - Example: If settings.json has `"mainBranch": "main"` and user sets local to "main", OMIT it from settings.local.json
535
+
536
+ 2. **When updating settings.json:**
537
+ - Include all settings the user configured
538
+ - If settings.local.json exists with overrides, those will take precedence at runtime
539
+ - Do NOT copy values from settings.local.json into settings.json unless user explicitly changed them
540
+
541
+ 3. **Merge behavior example:**
542
+ ```
543
+ Before:
544
+ settings.json: { "mainBranch": "main", "capabilities": { "web": { "basePort": 3000 } } }
545
+ settings.local.json: { "mainBranch": "main", "capabilities": { "web": { "basePort": 4000 } } }
546
+
547
+ Problem: mainBranch is duplicated (same value in both)
548
+
549
+ After user updates local settings:
550
+ settings.json: { "mainBranch": "main", "capabilities": { "web": { "basePort": 3000 } } }
551
+ settings.local.json: { "capabilities": { "web": { "basePort": 4000 } } }
552
+
553
+ Result: mainBranch removed from local because it matches shared
554
+ ```
555
+
556
+ **Settings generation rules:**
557
+
558
+ 1. **Start with base structure:**
559
+ ```json
560
+ {
561
+ "mainBranch": "<user's answer>"
562
+ }
563
+ ```
564
+
565
+ 2. **Add worktreePrefix ONLY if user provided a non-empty value:**
566
+ ```json
567
+ {
568
+ "mainBranch": "<value>",
569
+ "worktreePrefix": "<user's value>"
570
+ }
571
+ ```
572
+
573
+ 3. **Add workflows ONLY if permissionMode is not "default":**
574
+ ```json
575
+ {
576
+ "mainBranch": "<value>",
577
+ "workflows": {
578
+ "issue": {
579
+ "permissionMode": "<user's answer>"
580
+ }
581
+ }
582
+ }
583
+ ```
584
+
585
+ 4. **Add capabilities.web ONLY if basePort is not 3000:**
586
+ ```json
587
+ {
588
+ "mainBranch": "<value>",
589
+ "capabilities": {
590
+ "web": {
591
+ "basePort": <user's number>
592
+ }
593
+ }
594
+ }
595
+ ```
596
+
597
+ 5. **If existing settings exist, MERGE** the new values with existing ones. Don't overwrite settings the user didn't modify.
598
+
599
+ ### Phase 5: Write File
600
+
601
+ **CRITICAL: REMOVE DUPLICATES BEFORE WRITING**
602
+
603
+ Before writing the file, perform a final duplication check:
604
+
605
+ **If writing to settings.local.json:**
606
+ 1. Load the current settings.json (if it exists)
607
+ 2. Compare EVERY setting in the generated local config against settings.json
608
+ 3. Remove any setting from local config that has the SAME VALUE as in settings.json
609
+ 4. Only write settings to local that are DIFFERENT from shared
610
+ 5. If this results in an empty object `{}`, inform the user, and skip creating it"
611
+
612
+ **If writing to settings.json:**
613
+ 1. Load the current settings.local.json (if it exists)
614
+ 2. Write all configured settings to settings.json
615
+ 3. After writing settings.json, check if any settings in settings.local.json are now duplicates
616
+ 4. If duplicates found, ask the user: "I noticed some settings in settings.local.json now match settings.json. Should I remove these duplicates from your local file?"
617
+
618
+ **Example duplication removal:**
619
+ ```
620
+ settings.json: { "mainBranch": "develop", "capabilities": { "web": { "basePort": 3000 } } }
621
+ Generated local: { "mainBranch": "develop", "capabilities": { "web": { "basePort": 4000 } } }
622
+
623
+ After removing duplicates:
624
+ Write to local: { "capabilities": { "web": { "basePort": 4000 } } }
625
+
626
+ Reason: mainBranch has same value in both files, so it's removed from local
627
+ ```
628
+
629
+ **Write steps:**
630
+ 1. Ensure `.iloom/` directory exists (create if needed)
631
+ 2. Perform duplication check as described above
632
+ 3. Write the deduplicated settings to the chosen file:
633
+ - `.iloom/settings.json` if user chose to commit
634
+ - `.iloom/settings.local.json` if user chose local-only
635
+ 4. Use the Write tool to create/update the file
636
+
637
+ ### Phase 6: Update .gitignore
638
+
639
+ If the user chose `.iloom/settings.local.json`, ensure `.gitignore` includes this entry:
640
+ - Read `.gitignore` if it exists
641
+ - Check if `.iloom/settings.local.json` is already listed
642
+ - If not, append it to the file
643
+
644
+ ### Phase 7: Completion Message
645
+
646
+ After successfully writing the configuration, inform the user:
647
+
648
+ ```
649
+ ✓ Configuration saved to [filename]
650
+
651
+ You can now use iloom CLI with your custom settings!
652
+
653
+ Next steps:
654
+ - Run 'iloom start <issue-number>' to create a workspace
655
+ - Edit [filename] directly to modify settings
656
+ - Run 'iloom init' again to reconfigure interactively
657
+
658
+ [If settings.json]: This configuration will be shared with your team via git.
659
+ [If settings.local.json]: This configuration is local-only and won't be committed.
660
+ ```
661
+
662
+ ### Phase 8: Wrap Up and Next Steps
663
+
664
+ After completing the basic configuration, provide a helpful conclusion:
665
+
666
+ ```
667
+ 🎯 Your iloom CLI is ready to use!
668
+
669
+ Here's how to get started:
670
+ • Run `iloom start <issue-number>` to create a workspace for an issue
671
+ • Run `iloom start <pr-number>` to create a workspace for a pull request
672
+ • Run `iloom list` to see your active workspaces
673
+ • Run `iloom finish` when you're done working to merge changes and clean up
674
+
675
+ Need more advanced configuration? I can help you set up:
676
+ • Agent Models - Use different Claude models for different tasks
677
+ • Database Settings - Configure database branching for isolated development
678
+ • Workflow Behavior - Control permissions, IDE launching, dev servers, and terminal behavior
679
+ • Protected Branches - Prevent iloom from creating worktrees for certain branches
680
+
681
+ You can ask me questions like:
682
+ "Is it possible to have the analysis agent use a different model?"
683
+ "How do I configure database branching?"
684
+ "Can I disable the IDE from launching automatically?"
685
+ "How do I protect my main branch from worktree creation?"
686
+ "What models are available for the different agents?"
687
+
688
+ Just ask any of these questions and I'll help you modify your settings.
689
+
690
+ When you're ready to finish, type `/exit` to close this session and return to your terminal.
691
+ ```
692
+
693
+ **Continue the conversation**: If the user asks additional configuration questions, help them modify their settings file. When they seem finished or say they're done, remind them to type `/exit` to close the session.
694
+
695
+ **Advanced Configuration Examples:**
696
+
697
+ If users ask about specific configurations, help them add these sections to their settings:
698
+
699
+ 1. **Agent Models Configuration:**
700
+ ```json
701
+ "agents": {
702
+ "iloom-issue-analyzer": { "model": "opus" },
703
+ "iloom-issue-planner": { "model": "sonnet" }
704
+ }
705
+ ```
706
+
707
+ 2. **Database Environment Variable:**
708
+ ```json
709
+ "capabilities": {
710
+ "database": {
711
+ "envVar": "CUSTOM_DATABASE_URL"
712
+ }
713
+ }
714
+ ```
715
+
716
+ 3. **Workflow Behavior:**
717
+ ```json
718
+ "workflows": {
719
+ "pr": {
720
+ "permissionMode": "plan",
721
+ "startIde": false,
722
+ "startDevServer": true,
723
+ "startAiAgent": false
724
+ }
725
+ }
726
+ ```
727
+
728
+ 4. **Protected Branches:**
729
+ ```json
730
+ "protectedBranches": ["main", "production", "release/*"]
731
+ ```
732
+
733
+ ## Important Notes
734
+
735
+ - **Validate ALL inputs** against the schema before writing files
736
+ - **Use batch mode** for AskUserQuestion - ask all 4 essential settings questions in a single call for faster setup
737
+ - **ALWAYS follow Phase 0** - Extract current settings and check if configuration exists
738
+ - **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
739
+ - **For new users** - Skip directly to Phase 0.5 (GitHub Remote Configuration) and proceed with setup
740
+ - **ALWAYS use the question formats** specified in Phase 1 that include "(Currently: [value])" when current values exist
741
+ - **Keep configuration minimal** - only include non-default values
742
+ - **Merge carefully** when updating existing settings - preserve any settings the user didn't modify
743
+ - **Handle errors gracefully** - if schema validation fails, explain what went wrong and ask the user to try again
744
+ - **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.
745
+ - **Deep comparison required** - When comparing settings for duplication, compare nested objects deeply (e.g., capabilities.web.basePort), not just top-level keys
746
+ - **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)