@iloom/cli 0.3.2 → 0.3.3

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 (111) hide show
  1. package/README.md +3 -3
  2. package/dist/{BranchNamingService-JYO746H7.js → BranchNamingService-A77VI6AI.js} +2 -2
  3. package/dist/ClaudeContextManager-BN7RE5ZQ.js +15 -0
  4. package/dist/ClaudeService-DLYLJUPA.js +14 -0
  5. package/dist/{GitHubService-UAMH7DMF.js → GitHubService-FZHHBOFG.js} +3 -3
  6. package/dist/{LoomLauncher-FVZECY3C.js → LoomLauncher-ZV3ZZIBA.js} +23 -20
  7. package/dist/LoomLauncher-ZV3ZZIBA.js.map +1 -0
  8. package/dist/{PromptTemplateManager-A52RUAMS.js → PromptTemplateManager-6HH3PVXV.js} +2 -2
  9. package/dist/README.md +3 -3
  10. package/dist/{SettingsManager-MTVX57WR.js → SettingsManager-I2LRCW2A.js} +2 -2
  11. package/dist/{SettingsMigrationManager-AGIIIPDQ.js → SettingsMigrationManager-TJ7UWZG5.js} +3 -3
  12. package/dist/agents/iloom-issue-complexity-evaluator.md +18 -3
  13. package/dist/agents/iloom-issue-enhancer.md +1 -1
  14. package/dist/{chunk-OAP6SASD.js → chunk-2CXREBLZ.js} +2 -2
  15. package/dist/{chunk-KG343GSG.js → chunk-2IJEMXOB.js} +359 -99
  16. package/dist/chunk-2IJEMXOB.js.map +1 -0
  17. package/dist/{chunk-FOV7RRQ2.js → chunk-2MAIX45J.js} +4 -4
  18. package/dist/{chunk-5NTD4MCZ.js → chunk-5Q3NDNNV.js} +29 -5
  19. package/dist/chunk-5Q3NDNNV.js.map +1 -0
  20. package/dist/{chunk-GVICXJHW.js → chunk-5VK4NRSF.js} +2 -2
  21. package/dist/{chunk-C7ASXK6J.js → chunk-AKUJXDNW.js} +2 -2
  22. package/dist/{chunk-UCZ24SUE.js → chunk-CDZERT7Z.js} +21 -9
  23. package/dist/chunk-CDZERT7Z.js.map +1 -0
  24. package/dist/{chunk-JKXJ7BGL.js → chunk-CE26YH2U.js} +42 -3
  25. package/dist/chunk-CE26YH2U.js.map +1 -0
  26. package/dist/{chunk-ZZZWQGTS.js → chunk-CFFQ2Z7A.js} +74 -75
  27. package/dist/chunk-CFFQ2Z7A.js.map +1 -0
  28. package/dist/{chunk-FXMLNKLT.js → chunk-DLHA5VQ3.js} +174 -5
  29. package/dist/chunk-DLHA5VQ3.js.map +1 -0
  30. package/dist/{chunk-GOG3ZB7O.js → chunk-IFB4Z76W.js} +23 -4
  31. package/dist/chunk-IFB4Z76W.js.map +1 -0
  32. package/dist/{chunk-F4ENT6AC.js → chunk-M7JJCX53.js} +2 -2
  33. package/dist/{chunk-KLBYVHPK.js → chunk-OSCLCMDG.js} +2 -2
  34. package/dist/{chunk-ZLIHIUDQ.js → chunk-OYF4VIFI.js} +2 -2
  35. package/dist/{chunk-A2P7NZTB.js → chunk-PGPI5LR4.js} +4 -4
  36. package/dist/{chunk-WEN5C5DM.js → chunk-RIEO2WML.js} +4 -1
  37. package/dist/chunk-RIEO2WML.js.map +1 -0
  38. package/dist/{chunk-UERERX6M.js → chunk-SUOXY5WJ.js} +2 -2
  39. package/dist/{init-7IIM35LQ.js → chunk-UAN4A3YU.js} +343 -46
  40. package/dist/chunk-UAN4A3YU.js.map +1 -0
  41. package/dist/{claude-KIZYXTSG.js → claude-W52VKI6L.js} +2 -2
  42. package/dist/{cleanup-6WYUD5SN.js → cleanup-H4VXU3C3.js} +12 -12
  43. package/dist/cli.js +188 -91
  44. package/dist/cli.js.map +1 -1
  45. package/dist/{color-ZVALX37U.js → color-F7RU6B6Z.js} +10 -4
  46. package/dist/{contribute-7YJHZTO7.js → contribute-Y7IQV5QY.js} +4 -4
  47. package/dist/{feedback-752MGDPG.js → feedback-XTUCKJNT.js} +11 -9
  48. package/dist/{feedback-752MGDPG.js.map → feedback-XTUCKJNT.js.map} +1 -1
  49. package/dist/{git-TAFVDB3J.js → git-IYA53VIC.js} +7 -3
  50. package/dist/{ignite-OAMDUN27.js → ignite-T74RYXCA.js} +19 -71
  51. package/dist/ignite-T74RYXCA.js.map +1 -0
  52. package/dist/index.d.ts +52 -8
  53. package/dist/index.js +132 -84
  54. package/dist/index.js.map +1 -1
  55. package/dist/init-4FHTAM3F.js +19 -0
  56. package/dist/{neon-helpers-5HBYO2VP.js → neon-helpers-77PBPGJ5.js} +3 -3
  57. package/dist/{open-FCHKQ77R.js → open-UMXANW5S.js} +4 -4
  58. package/dist/{prompt-7INJ7YRU.js → prompt-QALMYTVC.js} +4 -2
  59. package/dist/prompt-QALMYTVC.js.map +1 -0
  60. package/dist/prompts/init-prompt.txt +82 -8
  61. package/dist/prompts/issue-prompt.txt +18 -11
  62. package/dist/{rebase-Q7WXK566.js → rebase-VJ2VKR6R.js} +11 -11
  63. package/dist/rebase-VJ2VKR6R.js.map +1 -0
  64. package/dist/{run-SJPM6YRI.js → run-MJYY4PUT.js} +4 -4
  65. package/dist/schema/settings.schema.json +21 -3
  66. package/dist/{test-git-DEUE656D.js → test-git-IT5EWQ5C.js} +3 -3
  67. package/dist/{test-prefix-Y6Z6ZHSF.js → test-prefix-NPWDPUUH.js} +3 -3
  68. package/package.json +2 -1
  69. package/dist/ClaudeContextManager-5WPRJIIW.js +0 -15
  70. package/dist/ClaudeService-Z4KA7QOW.js +0 -14
  71. package/dist/LoomLauncher-FVZECY3C.js.map +0 -1
  72. package/dist/chunk-5NTD4MCZ.js.map +0 -1
  73. package/dist/chunk-FXMLNKLT.js.map +0 -1
  74. package/dist/chunk-GOG3ZB7O.js.map +0 -1
  75. package/dist/chunk-JKXJ7BGL.js.map +0 -1
  76. package/dist/chunk-KG343GSG.js.map +0 -1
  77. package/dist/chunk-PRE7KTM4.js +0 -302
  78. package/dist/chunk-PRE7KTM4.js.map +0 -1
  79. package/dist/chunk-UCZ24SUE.js.map +0 -1
  80. package/dist/chunk-WEN5C5DM.js.map +0 -1
  81. package/dist/chunk-ZZZWQGTS.js.map +0 -1
  82. package/dist/ignite-OAMDUN27.js.map +0 -1
  83. package/dist/init-7IIM35LQ.js.map +0 -1
  84. package/dist/rebase-Q7WXK566.js.map +0 -1
  85. /package/dist/{BranchNamingService-JYO746H7.js.map → BranchNamingService-A77VI6AI.js.map} +0 -0
  86. /package/dist/{ClaudeContextManager-5WPRJIIW.js.map → ClaudeContextManager-BN7RE5ZQ.js.map} +0 -0
  87. /package/dist/{ClaudeService-Z4KA7QOW.js.map → ClaudeService-DLYLJUPA.js.map} +0 -0
  88. /package/dist/{GitHubService-UAMH7DMF.js.map → GitHubService-FZHHBOFG.js.map} +0 -0
  89. /package/dist/{PromptTemplateManager-A52RUAMS.js.map → PromptTemplateManager-6HH3PVXV.js.map} +0 -0
  90. /package/dist/{SettingsManager-MTVX57WR.js.map → SettingsManager-I2LRCW2A.js.map} +0 -0
  91. /package/dist/{SettingsMigrationManager-AGIIIPDQ.js.map → SettingsMigrationManager-TJ7UWZG5.js.map} +0 -0
  92. /package/dist/{chunk-OAP6SASD.js.map → chunk-2CXREBLZ.js.map} +0 -0
  93. /package/dist/{chunk-FOV7RRQ2.js.map → chunk-2MAIX45J.js.map} +0 -0
  94. /package/dist/{chunk-GVICXJHW.js.map → chunk-5VK4NRSF.js.map} +0 -0
  95. /package/dist/{chunk-C7ASXK6J.js.map → chunk-AKUJXDNW.js.map} +0 -0
  96. /package/dist/{chunk-F4ENT6AC.js.map → chunk-M7JJCX53.js.map} +0 -0
  97. /package/dist/{chunk-KLBYVHPK.js.map → chunk-OSCLCMDG.js.map} +0 -0
  98. /package/dist/{chunk-ZLIHIUDQ.js.map → chunk-OYF4VIFI.js.map} +0 -0
  99. /package/dist/{chunk-A2P7NZTB.js.map → chunk-PGPI5LR4.js.map} +0 -0
  100. /package/dist/{chunk-UERERX6M.js.map → chunk-SUOXY5WJ.js.map} +0 -0
  101. /package/dist/{claude-KIZYXTSG.js.map → claude-W52VKI6L.js.map} +0 -0
  102. /package/dist/{cleanup-6WYUD5SN.js.map → cleanup-H4VXU3C3.js.map} +0 -0
  103. /package/dist/{color-ZVALX37U.js.map → color-F7RU6B6Z.js.map} +0 -0
  104. /package/dist/{contribute-7YJHZTO7.js.map → contribute-Y7IQV5QY.js.map} +0 -0
  105. /package/dist/{git-TAFVDB3J.js.map → git-IYA53VIC.js.map} +0 -0
  106. /package/dist/{neon-helpers-5HBYO2VP.js.map → init-4FHTAM3F.js.map} +0 -0
  107. /package/dist/{prompt-7INJ7YRU.js.map → neon-helpers-77PBPGJ5.js.map} +0 -0
  108. /package/dist/{open-FCHKQ77R.js.map → open-UMXANW5S.js.map} +0 -0
  109. /package/dist/{run-SJPM6YRI.js.map → run-MJYY4PUT.js.map} +0 -0
  110. /package/dist/{test-git-DEUE656D.js.map → test-git-IT5EWQ5C.js.map} +0 -0
  111. /package/dist/{test-prefix-Y6Z6ZHSF.js.map → test-prefix-NPWDPUUH.js.map} +0 -0
package/README.md CHANGED
@@ -101,7 +101,7 @@ Instead of a single generic prompt, iloom uses a pipeline of agents:
101
101
  * **Implementer:** Executes the plan using the context established in the previous steps.
102
102
 
103
103
 
104
- ### 2\ Interactive Control
104
+ ### 2. Interactive Control
105
105
 
106
106
  You are in the loop at every stage. You can review the AI's analysis, edit the plan in GitHub/Linear, and adjust course before implementation begins.
107
107
 
@@ -238,7 +238,7 @@ iloom supports the tools you already use. Unless you use JIRA.
238
238
  ### IDE Support
239
239
  iloom creates isolated workspace settings for your editor. Color synchronization (visual context) only works best VS Code-based editors.
240
240
 
241
- * **Supported:** VS Code, Cursor, Windsurf, WebStorm, IntelliJ, Sublime Text.
241
+ * **Supported:** VS Code, Cursor, Windsurf, Antigravity, WebStorm, IntelliJ, Sublime Text.
242
242
 
243
243
  * **Config:** Set your preference via `il init` or `il start --set ide.type=cursor`.
244
244
 
@@ -337,4 +337,4 @@ License & Name
337
337
  * Converts to Apache 2.0 on 2029-01-01.
338
338
 
339
339
 
340
- See [LICENSE](https://raw.githubusercontent.com/iloom-ai/iloom-cli/main/LICENSE) for complete terms.
340
+ See [LICENSE](https://raw.githubusercontent.com/iloom-ai/iloom-cli/main/LICENSE) for complete terms.
@@ -3,11 +3,11 @@ import {
3
3
  ClaudeBranchNameStrategy,
4
4
  DefaultBranchNamingService,
5
5
  SimpleBranchNameStrategy
6
- } from "./chunk-UERERX6M.js";
6
+ } from "./chunk-SUOXY5WJ.js";
7
7
  import "./chunk-GEHQXLEI.js";
8
8
  export {
9
9
  ClaudeBranchNameStrategy,
10
10
  DefaultBranchNamingService,
11
11
  SimpleBranchNameStrategy
12
12
  };
13
- //# sourceMappingURL=BranchNamingService-JYO746H7.js.map
13
+ //# sourceMappingURL=BranchNamingService-A77VI6AI.js.map
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ClaudeContextManager
4
+ } from "./chunk-AKUJXDNW.js";
5
+ import "./chunk-PGPI5LR4.js";
6
+ import "./chunk-RIEO2WML.js";
7
+ import "./chunk-CDZERT7Z.js";
8
+ import "./chunk-OYF4VIFI.js";
9
+ import "./chunk-RW54ZMBM.js";
10
+ import "./chunk-UJL4HI2R.js";
11
+ import "./chunk-GEHQXLEI.js";
12
+ export {
13
+ ClaudeContextManager
14
+ };
15
+ //# sourceMappingURL=ClaudeContextManager-BN7RE5ZQ.js.map
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ClaudeService
4
+ } from "./chunk-PGPI5LR4.js";
5
+ import "./chunk-RIEO2WML.js";
6
+ import "./chunk-CDZERT7Z.js";
7
+ import "./chunk-OYF4VIFI.js";
8
+ import "./chunk-RW54ZMBM.js";
9
+ import "./chunk-UJL4HI2R.js";
10
+ import "./chunk-GEHQXLEI.js";
11
+ export {
12
+ ClaudeService
13
+ };
14
+ //# sourceMappingURL=ClaudeService-DLYLJUPA.js.map
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  GitHubService
4
- } from "./chunk-F4ENT6AC.js";
4
+ } from "./chunk-M7JJCX53.js";
5
5
  import "./chunk-3RUPPQRG.js";
6
- import "./chunk-JKXJ7BGL.js";
6
+ import "./chunk-CE26YH2U.js";
7
7
  import "./chunk-GEHQXLEI.js";
8
8
  export {
9
9
  GitHubService
10
10
  };
11
- //# sourceMappingURL=GitHubService-UAMH7DMF.js.map
11
+ //# sourceMappingURL=GitHubService-FZHHBOFG.js.map
@@ -5,14 +5,15 @@ import {
5
5
  import "./chunk-ZT3YZB4K.js";
6
6
  import {
7
7
  ClaudeContextManager
8
- } from "./chunk-C7ASXK6J.js";
9
- import "./chunk-A2P7NZTB.js";
10
- import "./chunk-WEN5C5DM.js";
11
- import "./chunk-UCZ24SUE.js";
8
+ } from "./chunk-AKUJXDNW.js";
9
+ import "./chunk-PGPI5LR4.js";
10
+ import "./chunk-RIEO2WML.js";
11
+ import "./chunk-CDZERT7Z.js";
12
12
  import {
13
- generateColorFromBranchName
14
- } from "./chunk-ZZZWQGTS.js";
15
- import "./chunk-ZLIHIUDQ.js";
13
+ generateColorFromBranchName,
14
+ hexToRgb
15
+ } from "./chunk-CFFQ2Z7A.js";
16
+ import "./chunk-OYF4VIFI.js";
16
17
  import {
17
18
  openMultipleTerminalWindows,
18
19
  openTerminalWindow
@@ -36,7 +37,8 @@ var IDE_PRESETS = {
36
37
  webstorm: { command: "webstorm", name: "WebStorm", args: ["--nosplash"] },
37
38
  sublime: { command: "subl", name: "Sublime Text", args: [] },
38
39
  intellij: { command: "idea", name: "IntelliJ IDEA", args: ["--nosplash"] },
39
- windsurf: { command: "surf", name: "Windsurf", args: [] }
40
+ windsurf: { command: "surf", name: "Windsurf", args: [] },
41
+ antigravity: { command: "agy", name: "Antigravity", args: [] }
40
42
  };
41
43
  function getIdeConfig(ideSettings) {
42
44
  const type = (ideSettings == null ? void 0 : ideSettings.type) ?? "vscode";
@@ -62,7 +64,8 @@ function getInstallHint(type) {
62
64
  webstorm: "Install via JetBrains Toolbox > Settings > Shell Scripts > Enable",
63
65
  sublime: 'Create symlink: ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl',
64
66
  intellij: "Install via JetBrains Toolbox > Settings > Shell Scripts > Enable",
65
- windsurf: "Install command-line tools during Windsurf installation or create symlink manually"
67
+ windsurf: "Install command-line tools during Windsurf installation or create symlink manually",
68
+ antigravity: "Install command-line tools during Antigravity installation or create symlink manually"
66
69
  };
67
70
  return hints[type] ?? `Ensure the IDE command is available in your PATH`;
68
71
  }
@@ -175,16 +178,16 @@ var LoomLauncher = class {
175
178
  * Launch dev server terminal
176
179
  */
177
180
  async launchDevServerTerminal(options) {
178
- const colorData = generateColorFromBranchName(options.branchName);
179
181
  const devServerCommand = await getDevServerLaunchCommand(
180
182
  options.worktreePath,
181
183
  options.port,
182
184
  options.capabilities
183
185
  );
186
+ const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
184
187
  await openTerminalWindow({
185
188
  workspacePath: options.worktreePath,
186
189
  command: devServerCommand,
187
- backgroundColor: colorData.rgb,
190
+ ...backgroundColor && { backgroundColor },
188
191
  includeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),
189
192
  includePortExport: options.capabilities.includes("web"),
190
193
  ...options.port !== void 0 && { port: options.port }
@@ -195,10 +198,10 @@ var LoomLauncher = class {
195
198
  * Launch standalone terminal (no command, just workspace with env vars)
196
199
  */
197
200
  async launchStandaloneTerminal(options) {
198
- const colorData = generateColorFromBranchName(options.branchName);
201
+ const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
199
202
  await openTerminalWindow({
200
203
  workspacePath: options.worktreePath,
201
- backgroundColor: colorData.rgb,
204
+ ...backgroundColor && { backgroundColor },
202
205
  includeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),
203
206
  includePortExport: options.capabilities.includes("web"),
204
207
  ...options.port !== void 0 && { port: options.port }
@@ -209,7 +212,6 @@ var LoomLauncher = class {
209
212
  * Build terminal options for Claude
210
213
  */
211
214
  async buildClaudeTerminalOptions(options) {
212
- const colorData = generateColorFromBranchName(options.branchName);
213
215
  const hasEnvFile = this.hasAnyEnvFiles(options.worktreePath);
214
216
  const claudeTitle = `Claude - ${this.formatIdentifier(options.workflowType, options.identifier)}`;
215
217
  const executable = options.executablePath ?? "iloom";
@@ -222,10 +224,11 @@ var LoomLauncher = class {
222
224
  claudeCommand += ` --set ${setArg}`;
223
225
  }
224
226
  }
227
+ const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
225
228
  return {
226
229
  workspacePath: options.worktreePath,
227
230
  command: claudeCommand,
228
- backgroundColor: colorData.rgb,
231
+ ...backgroundColor && { backgroundColor },
229
232
  title: claudeTitle,
230
233
  includeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,
231
234
  ...options.port !== void 0 && { port: options.port, includePortExport: true }
@@ -235,7 +238,6 @@ var LoomLauncher = class {
235
238
  * Build terminal options for dev server
236
239
  */
237
240
  async buildDevServerTerminalOptions(options) {
238
- const colorData = generateColorFromBranchName(options.branchName);
239
241
  const devServerCommand = await getDevServerLaunchCommand(
240
242
  options.worktreePath,
241
243
  options.port,
@@ -243,10 +245,11 @@ var LoomLauncher = class {
243
245
  );
244
246
  const hasEnvFile = this.hasAnyEnvFiles(options.worktreePath);
245
247
  const devServerTitle = `Dev Server - ${this.formatIdentifier(options.workflowType, options.identifier)}`;
248
+ const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
246
249
  return {
247
250
  workspacePath: options.worktreePath,
248
251
  command: devServerCommand,
249
- backgroundColor: colorData.rgb,
252
+ ...backgroundColor && { backgroundColor },
250
253
  title: devServerTitle,
251
254
  includeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,
252
255
  includePortExport: options.capabilities.includes("web"),
@@ -257,12 +260,12 @@ var LoomLauncher = class {
257
260
  * Build terminal options for standalone terminal (no command)
258
261
  */
259
262
  buildStandaloneTerminalOptions(options) {
260
- const colorData = generateColorFromBranchName(options.branchName);
261
263
  const hasEnvFile = this.hasAnyEnvFiles(options.worktreePath);
262
264
  const terminalTitle = `Terminal - ${this.formatIdentifier(options.workflowType, options.identifier)}`;
265
+ const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
263
266
  return {
264
267
  workspacePath: options.worktreePath,
265
- backgroundColor: colorData.rgb,
268
+ ...backgroundColor && { backgroundColor },
266
269
  title: terminalTitle,
267
270
  includeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,
268
271
  includePortExport: options.capabilities.includes("web"),
@@ -302,4 +305,4 @@ var LoomLauncher = class {
302
305
  export {
303
306
  LoomLauncher
304
307
  };
305
- //# sourceMappingURL=LoomLauncher-FVZECY3C.js.map
308
+ //# sourceMappingURL=LoomLauncher-ZV3ZZIBA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/LoomLauncher.ts","../src/utils/ide.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { openTerminalWindow, openMultipleTerminalWindows } from '../utils/terminal.js'\nimport type { TerminalWindowOptions } from '../utils/terminal.js'\nimport { openIdeWindow } from '../utils/ide.js'\nimport { getDevServerLaunchCommand } from '../utils/dev-server.js'\nimport { generateColorFromBranchName, hexToRgb } from '../utils/color.js'\nimport { logger } from '../utils/logger.js'\nimport { ClaudeContextManager } from './ClaudeContextManager.js'\nimport type { SettingsManager } from './SettingsManager.js'\nimport type { Capability } from '../types/loom.js'\nimport { getDotenvFlowFiles } from '../utils/env.js'\n\nexport interface LaunchLoomOptions {\n\tenableClaude: boolean\n\tenableCode: boolean\n\tenableDevServer: boolean\n\tenableTerminal: boolean\n\tworktreePath: string\n\tbranchName: string\n\tport?: number\n\tcapabilities: Capability[]\n\tworkflowType: 'issue' | 'pr' | 'regular'\n\tidentifier: string | number\n\ttitle?: string\n\toneShot?: import('../types/index.js').OneShotMode\n\tsetArguments?: string[] // Raw --set arguments to forward\n\texecutablePath?: string // Executable path to use for spin command\n\tsourceEnvOnStart?: boolean // defaults to false if undefined\n\tcolorTerminal?: boolean // defaults to true if undefined\n\tcolorHex?: string // Pre-calculated hex color from metadata, avoids recalculation\n}\n\n/**\n * LoomLauncher orchestrates opening loom components\n */\nexport class LoomLauncher {\n\tprivate claudeContext: ClaudeContextManager\n\tprivate settings?: SettingsManager\n\n\tconstructor(claudeContext?: ClaudeContextManager, settings?: SettingsManager) {\n\t\tthis.claudeContext = claudeContext ?? new ClaudeContextManager()\n\t\tif (settings !== undefined) {\n\t\t\tthis.settings = settings\n\t\t}\n\t}\n\n\t/**\n\t * Launch loom components based on individual flags\n\t */\n\tasync launchLoom(options: LaunchLoomOptions): Promise<void> {\n\t\tconst { enableClaude, enableCode, enableDevServer, enableTerminal } = options\n\n\t\tlogger.debug(`Launching loom components: Claude=${enableClaude}, Code=${enableCode}, DevServer=${enableDevServer}, Terminal=${enableTerminal}`)\n\n\t\tconst launchPromises: Promise<void>[] = []\n\n\t\t// Launch VSCode if enabled\n\t\tif (enableCode) {\n\t\t\tlogger.debug('Launching VSCode')\n\t\t\tlaunchPromises.push(this.launchVSCode(options))\n\t\t}\n\n\t\t// Build array of terminals to launch\n\t\tconst terminalsToLaunch: Array<{\n\t\t\ttype: 'claude' | 'devServer' | 'terminal'\n\t\t\toptions: TerminalWindowOptions\n\t\t}> = []\n\n\t\tif (enableDevServer) {\n\t\t\tterminalsToLaunch.push({\n\t\t\t\ttype: 'devServer',\n\t\t\t\toptions: await this.buildDevServerTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\tif (enableTerminal) {\n\t\t\tterminalsToLaunch.push({\n\t\t\t\ttype: 'terminal',\n\t\t\t\toptions: this.buildStandaloneTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\tif (enableClaude) {\n\t\t\tterminalsToLaunch.push({\n\t\t\t\ttype: 'claude',\n\t\t\t\toptions: await this.buildClaudeTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\t// Launch terminals based on count\n\t\tif (terminalsToLaunch.length > 1) {\n\t\t\t// Multiple terminals - launch as tabs in single window\n\t\t\tlogger.debug(`Launching ${terminalsToLaunch.length} terminals in single window`)\n\t\t\tlaunchPromises.push(this.launchMultipleTerminals(terminalsToLaunch, options))\n\t\t} else if (terminalsToLaunch.length === 1) {\n\t\t\t// Single terminal - launch standalone\n\t\t\tconst terminal = terminalsToLaunch[0]\n\t\t\tif (!terminal) {\n\t\t\t\tthrow new Error('Terminal configuration is undefined')\n\t\t\t}\n\t\t\tconst terminalType = terminal.type\n\t\t\tlogger.debug(`Launching single ${terminalType} terminal`)\n\n\t\t\tif (terminalType === 'claude') {\n\t\t\t\tlaunchPromises.push(this.launchClaudeTerminal(options))\n\t\t\t} else if (terminalType === 'devServer') {\n\t\t\t\tlaunchPromises.push(this.launchDevServerTerminal(options))\n\t\t\t} else {\n\t\t\t\tlaunchPromises.push(this.launchStandaloneTerminal(options))\n\t\t\t}\n\t\t}\n\n\t\t// Wait for all components to launch\n\t\tawait Promise.all(launchPromises)\n\n\t\tlogger.success('loom launched successfully')\n\t}\n\n\t/**\n\t * Launch IDE (VSCode or configured alternative)\n\t */\n\tprivate async launchVSCode(options: LaunchLoomOptions): Promise<void> {\n\t\tconst ideConfig = await this.settings?.loadSettings().then((s) => s.ide)\n\t\tawait openIdeWindow(options.worktreePath, ideConfig)\n\t\tlogger.info('IDE opened')\n\t}\n\n\t/**\n\t * Launch Claude terminal\n\t */\n\tprivate async launchClaudeTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\tawait this.claudeContext.launchWithContext({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\ttype: options.workflowType,\n\t\t\tidentifier: options.identifier,\n\t\t\tbranchName: options.branchName,\n\t\t\t...(options.title && { title: options.title }),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t\toneShot: options.oneShot ?? 'default',\n\t\t\t...(options.setArguments && { setArguments: options.setArguments }),\n\t\t\t...(options.executablePath && { executablePath: options.executablePath }),\n\t\t})\n\t\tlogger.info('Claude terminal opened')\n\t}\n\n\t/**\n\t * Launch dev server terminal\n\t */\n\tprivate async launchDevServerTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\tconst devServerCommand = await getDevServerLaunchCommand(\n\t\t\toptions.worktreePath,\n\t\t\toptions.port,\n\t\t\toptions.capabilities\n\t\t)\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\tawait openTerminalWindow({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t})\n\t\tlogger.info('Dev server terminal opened')\n\t}\n\n\t/**\n\t * Launch standalone terminal (no command, just workspace with env vars)\n\t */\n\tprivate async launchStandaloneTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\tawait openTerminalWindow({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t})\n\t\tlogger.info('Standalone terminal opened')\n\t}\n\n\t/**\n\t * Build terminal options for Claude\n\t */\n\tprivate async buildClaudeTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): Promise<TerminalWindowOptions> {\n\t\tconst hasEnvFile = this.hasAnyEnvFiles(options.worktreePath)\n\t\tconst claudeTitle = `Claude - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\tconst executable = options.executablePath ?? 'iloom'\n\t\tlet claudeCommand = `${executable} spin`\n\t\tif (options.oneShot !== undefined && options.oneShot !== 'default') {\n\t\t\tclaudeCommand += ` --one-shot=${options.oneShot}`\n\t\t}\n\t\tif (options.setArguments && options.setArguments.length > 0) {\n\t\t\tfor (const setArg of options.setArguments) {\n\t\t\t\tclaudeCommand += ` --set ${setArg}`\n\t\t\t}\n\t\t}\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: claudeCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\ttitle: claudeTitle,\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,\n\t\t\t...(options.port !== undefined && { port: options.port, includePortExport: true }),\n\t\t}\n\t}\n\n\t/**\n\t * Build terminal options for dev server\n\t */\n\tprivate async buildDevServerTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): Promise<TerminalWindowOptions> {\n\t\tconst devServerCommand = await getDevServerLaunchCommand(\n\t\t\toptions.worktreePath,\n\t\t\toptions.port,\n\t\t\toptions.capabilities\n\t\t)\n\t\tconst hasEnvFile = this.hasAnyEnvFiles(options.worktreePath)\n\t\tconst devServerTitle = `Dev Server - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\ttitle: devServerTitle,\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t}\n\t}\n\n\t/**\n\t * Build terminal options for standalone terminal (no command)\n\t */\n\tprivate buildStandaloneTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): TerminalWindowOptions {\n\t\tconst hasEnvFile = this.hasAnyEnvFiles(options.worktreePath)\n\t\tconst terminalTitle = `Terminal - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\ttitle: terminalTitle,\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t}\n\t}\n\n\t/**\n\t * Launch multiple terminals (2+) as tabs in single window\n\t */\n\tprivate async launchMultipleTerminals(\n\t\tterminals: Array<{ type: string; options: TerminalWindowOptions }>,\n\t\t_options: LaunchLoomOptions\n\t): Promise<void> {\n\t\tconst terminalOptions = terminals.map((t) => t.options)\n\n\t\tawait openMultipleTerminalWindows(terminalOptions)\n\n\t\tconst terminalTypes = terminals.map((t) => t.type).join(' + ')\n\t\tlogger.info(`Multiple terminals opened: ${terminalTypes}`)\n\t}\n\n\t/**\n\t * Check if any dotenv-flow files exist in the workspace\n\t * Checks all files: .env, .env.local, .env.{NODE_ENV}, .env.{NODE_ENV}.local\n\t */\n\tprivate hasAnyEnvFiles(workspacePath: string): boolean {\n\t\tconst envFiles = getDotenvFlowFiles()\n\t\treturn envFiles.some(file => existsSync(join(workspacePath, file)))\n\t}\n\n\t/**\n\t * Format identifier for terminal tab titles\n\t */\n\tprivate formatIdentifier(workflowType: 'issue' | 'pr' | 'regular', identifier: string | number): string {\n\t\tif (workflowType === 'issue') {\n\t\t\treturn `Issue #${identifier}`\n\t\t} else if (workflowType === 'pr') {\n\t\t\treturn `PR #${identifier}`\n\t\t} else {\n\t\t\treturn `Branch: ${identifier}`\n\t\t}\n\t}\n}\n","import { execa } from 'execa'\nimport { logger } from './logger.js'\nimport type { IdeSettings } from '../lib/SettingsManager.js'\n\n// IDE preset configuration\nconst IDE_PRESETS = {\n\tvscode: { command: 'code', name: 'Visual Studio Code', args: [] },\n\tcursor: { command: 'cursor', name: 'Cursor', args: [] },\n\twebstorm: { command: 'webstorm', name: 'WebStorm', args: ['--nosplash'] },\n\tsublime: { command: 'subl', name: 'Sublime Text', args: [] },\n\tintellij: { command: 'idea', name: 'IntelliJ IDEA', args: ['--nosplash'] },\n\twindsurf: { command: 'surf', name: 'Windsurf', args: [] },\n\tantigravity: { command: 'agy', name: 'Antigravity', args: [] },\n} as const\n\ntype IdePreset = keyof typeof IDE_PRESETS\n\n// Resolve IDE configuration to command and args\nexport function getIdeConfig(ideSettings?: IdeSettings): {\n\tcommand: string\n\targs: string[]\n\tname: string\n} {\n\t// Default to vscode if not configured\n\tconst type = ideSettings?.type ?? 'vscode'\n\n\tconst preset = IDE_PRESETS[type as IdePreset]\n\treturn {\n\t\tcommand: preset.command,\n\t\targs: [...preset.args],\n\t\tname: preset.name,\n\t}\n}\n\n// Check if IDE is available\nexport async function isIdeAvailable(command: string): Promise<boolean> {\n\ttry {\n\t\tawait execa('command', ['-v', command], { shell: true, timeout: 5000 })\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Get installation hint for IDE\nfunction getInstallHint(type: string): string {\n\tconst hints: Record<string, string> = {\n\t\tvscode:\n\t\t\t'Install command-line tools: Open VSCode > Command Palette > \"Shell Command: Install \\'code\\' command in PATH\"',\n\t\tcursor:\n\t\t\t'Install command-line tools: Open Cursor > Command Palette > \"Install \\'cursor\\' command in PATH\"',\n\t\twebstorm: 'Install via JetBrains Toolbox > Settings > Shell Scripts > Enable',\n\t\tsublime:\n\t\t\t'Create symlink: ln -s \"/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl\" /usr/local/bin/subl',\n\t\tintellij: 'Install via JetBrains Toolbox > Settings > Shell Scripts > Enable',\n\t\twindsurf:\n\t\t\t'Install command-line tools during Windsurf installation or create symlink manually',\n\t\tantigravity:\n\t\t\t'Install command-line tools during Antigravity installation or create symlink manually',\n\t}\n\treturn hints[type] ?? `Ensure the IDE command is available in your PATH`\n}\n\n// Open IDE window for workspace\nexport async function openIdeWindow(\n\tworkspacePath: string,\n\tideSettings?: IdeSettings\n): Promise<void> {\n\tconst config = getIdeConfig(ideSettings)\n\tconst available = await isIdeAvailable(config.command)\n\n\tif (!available) {\n\t\tconst type = ideSettings?.type ?? 'vscode'\n\t\tthrow new Error(\n\t\t\t`${config.name} is not available. The \"${config.command}\" command was not found in PATH.\\n` +\n\t\t\t\tgetInstallHint(type)\n\t\t)\n\t}\n\n\ttry {\n\t\tawait execa(config.command, [...config.args, workspacePath])\n\t\tlogger.debug(`Opened ${config.name} for workspace: ${workspacePath}`)\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to open ${config.name}: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t)\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  PromptTemplateManager
4
- } from "./chunk-WEN5C5DM.js";
4
+ } from "./chunk-RIEO2WML.js";
5
5
  import "./chunk-GEHQXLEI.js";
6
6
  export {
7
7
  PromptTemplateManager
8
8
  };
9
- //# sourceMappingURL=PromptTemplateManager-A52RUAMS.js.map
9
+ //# sourceMappingURL=PromptTemplateManager-6HH3PVXV.js.map
package/dist/README.md CHANGED
@@ -101,7 +101,7 @@ Instead of a single generic prompt, iloom uses a pipeline of agents:
101
101
  * **Implementer:** Executes the plan using the context established in the previous steps.
102
102
 
103
103
 
104
- ### 2\ Interactive Control
104
+ ### 2. Interactive Control
105
105
 
106
106
  You are in the loop at every stage. You can review the AI's analysis, edit the plan in GitHub/Linear, and adjust course before implementation begins.
107
107
 
@@ -238,7 +238,7 @@ iloom supports the tools you already use. Unless you use JIRA.
238
238
  ### IDE Support
239
239
  iloom creates isolated workspace settings for your editor. Color synchronization (visual context) only works best VS Code-based editors.
240
240
 
241
- * **Supported:** VS Code, Cursor, Windsurf, WebStorm, IntelliJ, Sublime Text.
241
+ * **Supported:** VS Code, Cursor, Windsurf, Antigravity, WebStorm, IntelliJ, Sublime Text.
242
242
 
243
243
  * **Config:** Set your preference via `il init` or `il start --set ide.type=cursor`.
244
244
 
@@ -337,4 +337,4 @@ License & Name
337
337
  * Converts to Apache 2.0 on 2029-01-01.
338
338
 
339
339
 
340
- See [LICENSE](https://raw.githubusercontent.com/iloom-ai/iloom-cli/main/LICENSE) for complete terms.
340
+ See [LICENSE](https://raw.githubusercontent.com/iloom-ai/iloom-cli/main/LICENSE) for complete terms.
@@ -12,7 +12,7 @@ import {
12
12
  WorkflowPermissionSchemaNoDefaults,
13
13
  WorkflowsSettingsSchema,
14
14
  WorkflowsSettingsSchemaNoDefaults
15
- } from "./chunk-UCZ24SUE.js";
15
+ } from "./chunk-CDZERT7Z.js";
16
16
  import "./chunk-GEHQXLEI.js";
17
17
  export {
18
18
  AgentSettingsSchema,
@@ -28,4 +28,4 @@ export {
28
28
  WorkflowsSettingsSchema,
29
29
  WorkflowsSettingsSchemaNoDefaults
30
30
  };
31
- //# sourceMappingURL=SettingsManager-MTVX57WR.js.map
31
+ //# sourceMappingURL=SettingsManager-I2LRCW2A.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SettingsMigrationManager
4
- } from "./chunk-KLBYVHPK.js";
5
- import "./chunk-JKXJ7BGL.js";
4
+ } from "./chunk-OSCLCMDG.js";
5
+ import "./chunk-CE26YH2U.js";
6
6
  import "./chunk-GEHQXLEI.js";
7
7
  export {
8
8
  SettingsMigrationManager
9
9
  };
10
- //# sourceMappingURL=SettingsMigrationManager-AGIIIPDQ.js.map
10
+ //# sourceMappingURL=SettingsMigrationManager-TJ7UWZG5.js.map
@@ -6,7 +6,7 @@ color: orange
6
6
  model: haiku
7
7
  ---
8
8
 
9
- You are Claude, an AI assistant specialized in rapid complexity assessment for issues. Your role is to perform a quick evaluation to determine whether an issue should follow a SIMPLE or COMPLEX workflow.
9
+ You are Claude, an AI assistant specialized in rapid complexity assessment for issues. Your role is to perform a quick evaluation to determine whether an issue should follow a TRIVIAL, SIMPLE, or COMPLEX workflow.
10
10
 
11
11
  **Your Core Mission**: Perform a fast, deterministic complexity assessment (NOT deep analysis) to route the issue to the appropriate workflow. Speed and accuracy are both critical.
12
12
 
@@ -116,6 +116,21 @@ Estimate the following metrics:
116
116
  - CRITICAL risks: Data loss potential, system-wide failures, irreversible operations
117
117
 
118
118
  **Classification Logic:**
119
+
120
+ - **TRIVIAL**: ALL conditions must be met:
121
+ - Files affected <= 4
122
+ - LOC <= 75
123
+ - No breaking changes
124
+ - No database migrations
125
+ - No cross-cutting changes
126
+ - Risk level = LOW only
127
+ - All modified files <500 LOC UNLESS changes are isolated to specific functions/handlers in larger files
128
+ - NOT security/authentication/login related
129
+ - NOT payment/billing related
130
+ - Change is purely additive or minor modification (no deletions of core logic)
131
+ - Pattern bonus: If task follows "create reusable utility + apply at call sites" pattern, count utility creation (not each application) toward complexity
132
+ - Confirmation Heuristic: If the complexity agent output resembles a plan to largely or fully implement the solution, then it's likely a TRIVIAL issue.
133
+
119
134
  - **SIMPLE**: ALL conditions met:
120
135
  - Files affected < 5
121
136
  - LOC < 200
@@ -197,7 +212,7 @@ await mcp__issue_management__update_comment({
197
212
  ```markdown
198
213
  ## Complexity Assessment
199
214
 
200
- **Classification**: [SIMPLE / COMPLEX]
215
+ **Classification**: [TRIVIAL / SIMPLE / COMPLEX]
201
216
 
202
217
  **Metrics**:
203
218
  - Estimated files affected: [N]
@@ -213,7 +228,7 @@ await mcp__issue_management__update_comment({
213
228
 
214
229
  **IMPORTANT:**
215
230
  - Use EXACTLY the format above - the orchestrator parses this deterministically
216
- - Classification MUST be either "SIMPLE" or "COMPLEX" (no other values)
231
+ - Classification MUST be "TRIVIAL", "SIMPLE", or "COMPLEX" (no other values)
217
232
  - Metrics MUST use the exact field names shown
218
233
  - Keep reasoning concise (1-2 sentences maximum)
219
234
  - This is the ONLY content your comment should contain (after your todo list is complete)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: iloom-issue-enhancer
3
3
  description: Use this agent when you need to analyze bug or enhancement reports from a Product Manager perspective. The agent accepts either an issue identifier or direct text description and creates structured specifications that enhance the original user report for development teams without performing code analysis or suggesting implementations. Ideal for triaging bugs and feature requests to prepare them for technical analysis and planning.\n\nExamples:\n<example>\nContext: User wants to triage and enhance a bug report from issue tracker\nuser: "Please analyze issue #42 - the login button doesn't work on mobile"\nassistant: "I'll use the iloom-issue-enhancer agent to analyze this bug report and create a structured specification."\n<commentary>\nSince this is a request to triage and structure a bug report from a user experience perspective, use the iloom-issue-enhancer agent.\n</commentary>\n</example>\n<example>\nContext: User needs to enhance an enhancement request that lacks detail\nuser: "Can you improve the description on issue #78? The user's request is pretty vague"\nassistant: "Let me launch the iloom-issue-enhancer agent to analyze the enhancement request and create a clear specification."\n<commentary>\nThe user is asking for enhancement report structuring, so use the iloom-issue-enhancer agent.\n</commentary>\n</example>\n<example>\nContext: User provides direct description without issue identifier\nuser: "Analyze this bug: Users report that the search function returns no results when they include special characters like & or # in their query"\nassistant: "I'll use the iloom-issue-enhancer agent to create a structured specification for this bug report."\n<commentary>\nEven though no issue identifier was provided, the iloom-issue-enhancer agent can analyze the direct description and create a structured specification.\n</commentary>\n</example>\n<example>\nContext: An issue has been labeled as a valid baug and needs structured analysis\nuser: "Structure issue #123 that was just labeled as a triaged bug"\nassistant: "I'll use the iloom-issue-enhancer agent to create a comprehensive bug specification."\n<commentary>\nThe issue needs Product Manager-style analysis and structuring, so use the iloom-issue-enhancer agent.\n</commentary>\n</example>
4
- tools: Bash, Glob, Grep, Read, WebFetch, WebSearch, BashOutput, KillShell, SlashCommand, ListMcpResourcesTool, ReadMcpResourceTool, mcp__context7__resolve-library-id, mcp__context7__get-library-docs, mcp__issue_management__get_issue, mcp__issue_management__get_comment, mcp__issue_management__create_comment
4
+ tools: Bash, Glob, Grep, Read, WebFetch, WebSearch, BashOutput, KillShell, SlashCommand, ListMcpResourcesTool, ReadMcpResourceTool, mcp__context7__resolve-library-id, mcp__context7__get-library-docs, mcp__issue_management__get_issue, mcp__issue_management__get_comment, mcp__issue_management__create_comment, mcp__issue_management__update_comment
5
5
  color: purple
6
6
  model: sonnet
7
7
  ---
@@ -11,7 +11,7 @@ import {
11
11
  isPRBranch,
12
12
  isValidGitRepo,
13
13
  parseWorktreeList
14
- } from "./chunk-5NTD4MCZ.js";
14
+ } from "./chunk-5Q3NDNNV.js";
15
15
 
16
16
  // src/lib/GitWorktreeManager.ts
17
17
  import path from "path";
@@ -386,4 +386,4 @@ var GitWorktreeManager = class {
386
386
  export {
387
387
  GitWorktreeManager
388
388
  };
389
- //# sourceMappingURL=chunk-OAP6SASD.js.map
389
+ //# sourceMappingURL=chunk-2CXREBLZ.js.map