@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
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ InitCommand
4
+ } from "./chunk-UAN4A3YU.js";
5
+ import "./chunk-PA6Q6AWM.js";
6
+ import "./chunk-OSCLCMDG.js";
7
+ import "./chunk-2CXREBLZ.js";
8
+ import "./chunk-RIEO2WML.js";
9
+ import "./chunk-5Q3NDNNV.js";
10
+ import "./chunk-CDZERT7Z.js";
11
+ import "./chunk-CE26YH2U.js";
12
+ import "./chunk-OYF4VIFI.js";
13
+ import "./chunk-RW54ZMBM.js";
14
+ import "./chunk-UJL4HI2R.js";
15
+ import "./chunk-GEHQXLEI.js";
16
+ export {
17
+ InitCommand
18
+ };
19
+ //# sourceMappingURL=init-4FHTAM3F.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createNeonProviderFromSettings
4
- } from "./chunk-GVICXJHW.js";
5
- import "./chunk-JKXJ7BGL.js";
4
+ } from "./chunk-5VK4NRSF.js";
5
+ import "./chunk-CE26YH2U.js";
6
6
  import "./chunk-GEHQXLEI.js";
7
7
  export {
8
8
  createNeonProviderFromSettings
9
9
  };
10
- //# sourceMappingURL=neon-helpers-5HBYO2VP.js.map
10
+ //# sourceMappingURL=neon-helpers-77PBPGJ5.js.map
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-YETJNRQM.js";
15
15
  import {
16
16
  GitWorktreeManager
17
- } from "./chunk-OAP6SASD.js";
17
+ } from "./chunk-2CXREBLZ.js";
18
18
  import "./chunk-ZT3YZB4K.js";
19
19
  import {
20
20
  ProjectCapabilityDetector
@@ -25,10 +25,10 @@ import {
25
25
  } from "./chunk-GYCR2LOU.js";
26
26
  import {
27
27
  extractIssueNumber
28
- } from "./chunk-5NTD4MCZ.js";
28
+ } from "./chunk-5Q3NDNNV.js";
29
29
  import {
30
30
  SettingsManager
31
- } from "./chunk-UCZ24SUE.js";
31
+ } from "./chunk-CDZERT7Z.js";
32
32
  import {
33
33
  extractPort,
34
34
  findEnvFileContainingVariable,
@@ -289,4 +289,4 @@ Make sure the project is built (run 'il start' first)`
289
289
  export {
290
290
  OpenCommand
291
291
  };
292
- //# sourceMappingURL=open-FCHKQ77R.js.map
292
+ //# sourceMappingURL=open-UMXANW5S.js.map
@@ -1,15 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  isInteractiveEnvironment,
4
+ promptCommitAction,
4
5
  promptConfirmation,
5
6
  promptInput,
6
7
  waitForKeypress
7
- } from "./chunk-JKXJ7BGL.js";
8
+ } from "./chunk-CE26YH2U.js";
8
9
  import "./chunk-GEHQXLEI.js";
9
10
  export {
10
11
  isInteractiveEnvironment,
12
+ promptCommitAction,
11
13
  promptConfirmation,
12
14
  promptInput,
13
15
  waitForKeypress
14
16
  };
15
- //# sourceMappingURL=prompt-7INJ7YRU.js.map
17
+ //# sourceMappingURL=prompt-QALMYTVC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -417,14 +417,32 @@ The following JSON Schema defines valid iloom settings:
417
417
  "webstorm",
418
418
  "sublime",
419
419
  "intellij",
420
- "windsurf"
420
+ "windsurf",
421
+ "antigravity"
421
422
  ],
422
423
  "default": "vscode",
423
- "description": "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor)."
424
+ "description": "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor), antigravity (Antigravity IDE)."
424
425
  }
425
426
  },
426
427
  "additionalProperties": false,
427
- "description": "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, and Windsurf. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf)."
428
+ "description": "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, Windsurf, and Antigravity. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity)."
429
+ },
430
+ "colors": {
431
+ "type": "object",
432
+ "properties": {
433
+ "terminal": {
434
+ "type": "boolean",
435
+ "default": true,
436
+ "description": "Apply terminal background colors based on branch name (macOS only)"
437
+ },
438
+ "vscode": {
439
+ "type": "boolean",
440
+ "default": false,
441
+ "description": "Apply VSCode/Cursor title bar colors based on branch name. Note: This modifies .vscode/settings.json which may be in source control. Default is false for safety; enable via init or explicitly if .vscode is gitignored."
442
+ }
443
+ },
444
+ "additionalProperties": false,
445
+ "description": "Color synchronization settings for workspace identification"
428
446
  }
429
447
  },
430
448
  "additionalProperties": false
@@ -647,7 +665,7 @@ Use AskUserQuestion to ask ALL local development settings questions **IN A SINGL
647
665
  - "bypassPermissions" - Claude executes without confirmation (use with caution)
648
666
  - Default: currentPermissionMode or "acceptEdits"
649
667
  - Validation: Must be one of: default, plan, acceptEdits, bypassPermissions
650
- - Store answer as: `workflows.issue.permissionMode`
668
+ - Store answer as: `workflows.issue.permissionMode` - NOTE: this is a personal preference - recommend it be stored in the gitignored local settings file.
651
669
 
652
670
  4. **Base Port**
653
671
  - Question format: "What base port should web development servers use?{{#IF currentBasePort}} (Currently: [currentBasePort]){{/IF currentBasePort}}"
@@ -754,10 +772,11 @@ REMOTES_INFO
754
772
  - "sublime" - Sublime Text
755
773
  - "intellij" - JetBrains IntelliJ IDEA
756
774
  - "windsurf" - Windsurf editor
775
+ - "antigravity" - Antigravity IDE
757
776
  - Default: currentIdeType or "vscode"
758
777
  - Validation: Must be one of the listed options
759
778
  - Store answer as: `ide.type`
760
- - Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf). Other IDEs will launch without color theming.
779
+ - Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity). Other IDEs will launch without color theming.
761
780
 
762
781
  **Step 4: Merge Mode** (only ask if multiple remotes detected OR user requests advanced config)
763
782
 
@@ -780,6 +799,40 @@ REMOTES_INFO
780
799
  - Set multiSelect: false for all questions
781
800
  - Process answers sequentially as they depend on each other
782
801
 
802
+ ### Phase 2.5: Color Synchronization Settings - ONLY IF USER HAS CHOSEN the vscode, cursor, windsurf, or antigravity IDE
803
+
804
+ After Phase 2, handle color settings based on gitignore status.
805
+
806
+ Analyis of system: Is VSCode Settings ignore? VSCODE_SETTINGS_GITIGNORED
807
+
808
+ **IMPORTANT DISTINCTION:**
809
+ - Schema defaults are: terminal=true, vscode=false (for safety)
810
+ - Your job in init is to RECOMMEND optimal settings based on the project
811
+ - IMPORTANT: This is a per-project setting - recommend to save it in shared project settings (not globally). EVEN IF OTHER SETTINGS ARE SAVED ELSEHWERE
812
+
813
+ **Terminal Color Recommendation:**
814
+ - Always recommend `true` - terminal colors only affect macOS Terminal.app, no file changes
815
+
816
+ **VSCode Color Recommendation:**
817
+
818
+ **If "VSCODE_SETTINGS_GITIGNORED" == "true":**
819
+ - Recommend `colors.vscode: true` (safe since file is gitignored)
820
+ - Explain: "VSCode title bar coloring is safe to enable since .vscode/settings.json is gitignored"
821
+
822
+ **If "VSCODE_SETTINGS_GITIGNORED" == "false":**
823
+ - Warn user: "VSCode/Cursor title bar coloring modifies .vscode/settings.json which is tracked in git."
824
+ - Ask user: "Would you like to:
825
+ 1. Add .vscode/settings.json to .gitignore (recommended - enables color sync without git pollution)
826
+ 2. Keep VSCode color sync disabled (default - keeps .vscode/settings.json in source control unchanged)
827
+ 3. Enable anyway (Please don't do this - colors will appear in git diffs)"
828
+
829
+ Based on the users answer:
830
+ - Option 1: Add to .gitignore, set `colors.vscode: true`
831
+ - Option 2: Set `colors.vscode: false` (matches safe default)
832
+ - Option 3: Set `colors.vscode: true` (with warning noted)
833
+
834
+ **Note:** Terminal colors default to `true` (always recommend unless user explicitly disables).
835
+
783
836
  ### Phase 3: Configuration Summary
784
837
 
785
838
  After gathering all answers from Phase 1 and Phase 2, display a summary like this:
@@ -953,9 +1006,24 @@ When both settings.json and settings.local.json exist, you MUST prevent duplicat
953
1006
  }
954
1007
  ```
955
1008
 
956
- 7. **Combine all applicable sections** into a single JSON object. Only include sections where the value differs from the default.
1009
+ 7. **Add colors settings based on Phase 2.5 recommendations (if vscode or cursor IDE):**
1010
+ ```json
1011
+ {
1012
+ "colors": {
1013
+ "terminal": true, // Always recommend true unless user explicitly disabled
1014
+ "vscode": <based on gitignore status and user choice>
1015
+ }
1016
+ }
1017
+ ```
1018
+ - Default behavior: Only include if vscode differs from default (false) or terminal is disabled
1019
+ - If "VSCODE_SETTINGS_GITIGNORED" == "true" (note: variable has been subsituted) and user accepted recommendation: `"vscode": true`
1020
+ - If user chose to add .vscode/settings.json to .gitignore: `"vscode": true`
1021
+ - If user chose to keep disabled or enable anyway: set accordingly
1022
+ - Terminal should be true unless user explicitly disabled it
1023
+
1024
+ 8. **Combine all applicable sections** into a single JSON object. Only include sections where the value differs from the default.
957
1025
 
958
- 8. **If existing settings exist, MERGE** the new values with existing ones. Don't overwrite settings the user didn't modify.
1026
+ 9. **If existing settings exist, MERGE** the new values with existing ones. Don't overwrite settings the user didn't modify.
959
1027
 
960
1028
  ### Phase 6: Write File
961
1029
 
@@ -963,6 +1031,8 @@ When both settings.json and settings.local.json exist, you MUST prevent duplicat
963
1031
 
964
1032
  Before writing the file, perform a final duplication check:
965
1033
 
1034
+ **You might need to create/update multiple files - if some settigns should be not commitedd (ie. API Keys, permissionMode etc), then recommend create a local settings file for those settings and a shared one for others.
1035
+
966
1036
  **If writing to settings.local.json:**
967
1037
  1. Load the current settings.json (if it exists)
968
1038
  2. Compare EVERY setting in the generated local config against settings.json
@@ -992,7 +1062,7 @@ Reason: mainBranch has same value in both files, so it's removed from local
992
1062
  - For global: Ensure `~/.config/iloom-ai/` directory exists (create if needed)
993
1063
  - For project/local: Ensure `.iloom/` directory exists (create if needed)
994
1064
  2. Perform duplication check as described above
995
- 3. Write the deduplicated settings to the chosen file:
1065
+ 3. For each settings file you need to update, write the deduplicated settings to the chosen file:
996
1066
  - `~/.config/iloom-ai/settings.json` if user chose Global
997
1067
  - `.iloom/settings.json` if user chose Project
998
1068
  - `.iloom/settings.local.json` if user chose Local
@@ -1073,9 +1143,12 @@ Would you like to commit these changes?
1073
1143
  - **NEVER stage or commit unrelated files** - even if they appear in `git status`
1074
1144
  - **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
1075
1145
  - **Do NOT commit settings.local.json** - it should be gitignored, not committed
1146
+ - **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.
1076
1147
 
1077
1148
  **Step 3: If user says yes, commit the changes**
1078
1149
 
1150
+ VERIFY YOU'RE NOT BUNDLING ALL CHANGES IN ONE FILE DESPITE GUIDANCE TO SPLIT ACCORDING TO RULES/RECOMMENDATIONS ABOVE
1151
+
1079
1152
  Stage ONLY the iloom-related files that should be committed:
1080
1153
  ```bash
1081
1154
  git add .iloom/settings.json .gitignore 2>/dev/null || true
@@ -1219,6 +1292,7 @@ If users ask about specific configurations, help them add these sections to thei
1219
1292
  - **Phase 1 = Local dev settings** (main branch, worktree prefix, permission mode, base port)
1220
1293
  - **Phase 2 = Tooling integrations** (issue tracker provider, provider-specific config, IDE, merge mode)
1221
1294
  - **Keep configuration minimal** - only include non-default values
1295
+ - **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)
1222
1296
  - **Merge carefully** when updating existing settings - preserve any settings the user didn't modify
1223
1297
  - **Handle errors gracefully** - if schema validation fails, explain what went wrong and ask the user to try again
1224
1298
  - **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.
@@ -30,7 +30,7 @@ This is the user's first time running through the `iloom` workflow. You have add
30
30
  iloom is a CLI tool for scaling a human's understanding of the AI's work, as the AI's output scales. It does this by managing isolated Git worktrees in a guided workflow, with significant AI integration. It orchestrates multi-phase workflows:
31
31
 
32
32
  1. **Enhancement** - Expands brief issues into detailed requirements
33
- 2. **Complexity Evaluation** - Categorizes as SIMPLE or COMPLEX based on scope
33
+ 2. **Complexity Evaluation** - Categorizes as TRIVIAL, SIMPLE, or COMPLEX based on scope
34
34
  3. **Analysis** - Investigates root causes and technical constraints
35
35
  4. **Planning** - Creates implementation roadmap with file specifications
36
36
  5. **Implementation** - Executes the plan with validation
@@ -121,7 +121,7 @@ You are orchestrating a set of agents through a development process, with human
121
121
  5. Run complexity evaluation for ISSUE_NUMBER using @agent-iloom-issue-complexity-evaluator
122
122
  6. Extract issue link that includes comment id from agent output, display complexity assessment to user
123
123
  7. WAIT for human confirmation of complexity classification before proceeding to next phase
124
- 8. Route to appropriate workflow based on confirmed complexity (SIMPLE or COMPLEX)
124
+ 8. Route to appropriate workflow based on confirmed complexity (TRIVIAL, SIMPLE, or COMPLEX)
125
125
  9. If SIMPLE: Run combined analysis and planning for ISSUE_NUMBER using @agent-iloom-issue-analyze-and-plan
126
126
  10. If COMPLEX: Run separate analysis for ISSUE_NUMBER using @agent-iloom-issue-analyzer
127
127
  11. Extract issue link that includes comment id from agent output, display to user
@@ -152,10 +152,10 @@ Perform ONE comprehensive scan to determine which agents need to run:
152
152
  **Complexity Evaluation Decision:**
153
153
  - Search ALL comments for existing complexity evaluation. Consider "already evaluated" if ANY comment has:
154
154
  * Header containing "Complexity Assessment" or "Complexity Evaluation"
155
- * Section with "**Classification**: [SIMPLE / COMPLEX]"
155
+ * Section with "**Classification**: [TRIVIAL / SIMPLE / COMPLEX]"
156
156
  * Metrics section with estimated files, LOC, breaking changes, DB migrations, and risk level
157
157
  - Decision: NEEDS_COMPLEXITY_EVAL or SKIP_COMPLEXITY_EVAL
158
- - If skipping, log: "Issue #ISSUE_NUMBER already has complexity evaluation by @[author] from [date] showing [SIMPLE/COMPLEX] classification, skipping evaluation"
158
+ - If skipping, log: "Issue #ISSUE_NUMBER already has complexity evaluation by @[author] from [date] showing [TRIVIAL/SIMPLE/COMPLEX] classification, skipping evaluation"
159
159
 
160
160
  **Analysis Decision:**
161
161
  - Search ALL comments for existing analysis. Consider "already analyzed" if ANY comment has ALL:
@@ -227,13 +227,13 @@ Only execute if workflow plan determined NEEDS_COMPLEXITY_EVAL:
227
227
  2. Upon completion: Extract issue+comment link from agent output and provide link to issue comment (including comment ID)
228
228
  3. Extract complexity classification from evaluator output:
229
229
  - Search the evaluator's output for the "Complexity Assessment" section
230
- - Extract: Classification (SIMPLE/COMPLEX), Metrics (files, LOC, breaking changes, DB migrations, risk level), and Reasoning
230
+ - Extract: Classification (TRIVIAL/SIMPLE/COMPLEX), Metrics (files, LOC, breaking changes, DB migrations, risk level), and Reasoning
231
231
  - The evaluator uses deterministic format - parse exactly as specified
232
232
  4. Display complexity assessment to user:
233
233
  Display the extracted assessment in this format:
234
234
  ```
235
235
  Complexity Assessment from Evaluator:
236
- - Classification: [SIMPLE/COMPLEX]
236
+ - Classification: [TRIVIAL/SIMPLE/COMPLEX]
237
237
  - Estimated files: [N]
238
238
  - Estimated LOC: [N]
239
239
  - Breaking changes: [Yes/No]
@@ -243,9 +243,10 @@ Only execute if workflow plan determined NEEDS_COMPLEXITY_EVAL:
243
243
  Reasoning: [reasoning text from evaluator]
244
244
  ```
245
245
  5. Use AskUserQuestion tool with a single question:
246
- - Question: "Complexity evaluated as [SIMPLE/COMPLEX]. See assessment at: [issue comment URL]. Do you agree with this classification?"
246
+ - Question: "Complexity evaluated as [TRIVIAL/SIMPLE/COMPLEX]. See assessment at: [issue comment URL]. Do you agree with this classification?"
247
247
  - Options:
248
- - "Yes, proceed with [SIMPLE/COMPLEX] workflow" (default)
248
+ - "Yes, proceed with [TRIVIAL/SIMPLE/COMPLEX] workflow" (default)
249
+ - "No, reclassify as TRIVIAL"
249
250
  - "No, reclassify as SIMPLE"
250
251
  - "No, reclassify as COMPLEX"
251
252
  - "Provide feedback before deciding"
@@ -260,11 +261,11 @@ Only execute if workflow plan determined NEEDS_COMPLEXITY_EVAL:
260
261
  If workflow plan determined SKIP_COMPLEXITY_EVAL:
261
262
  1. Mark todos #5, #6, and #7 as completed
262
263
  2. Extract complexity from existing evaluation comment:
263
- - Search ALL issue comments for "**Classification**: [SIMPLE / COMPLEX]"
264
- - If found: Extract the classification (SIMPLE or COMPLEX)
264
+ - Search ALL issue comments for "**Classification**: [TRIVIAL / SIMPLE / COMPLEX]"
265
+ - If found: Extract the classification (TRIVIAL, SIMPLE, or COMPLEX)
265
266
  - If not found: Default to COMPLEX workflow
266
267
  3. Display classification to user:
267
- If complexity found: "Previous evaluation classified this as [SIMPLE/COMPLEX]. Proceeding with [SIMPLE/COMPLEX] workflow."
268
+ If complexity found: "Previous evaluation classified this as [TRIVIAL/SIMPLE/COMPLEX]. Proceeding with [TRIVIAL/SIMPLE/COMPLEX] workflow."
268
269
  If not found: "No complexity classification found - defaulting to COMPLEX workflow."
269
270
  4. Proceed to ROUTING DECISION POINT with extracted complexity (no confirmation needed)
270
271
 
@@ -297,6 +298,12 @@ After STEP 1.5 completes and complexity is confirmed, determine which workflow p
297
298
 
298
299
  **Check the confirmed complexity:**
299
300
 
301
+ **IF TRIVIAL complexity confirmed:**
302
+ 1. Display to user: "Using TRIVIAL workflow: Skipping analysis and planning, proceeding directly to implementation"
303
+ 2. Mark todo #8 as completed
304
+ 3. Mark todos #9, #10, #11, #12, #13, #14, and #15 as completed (analysis/planning steps that will not execute)
305
+ 4. Skip directly to **STEP 4** (Implementation Phase)
306
+
300
307
  **IF SIMPLE complexity confirmed:**
301
308
  1. Display to user: "✓ Using SIMPLE workflow: Combined analysis and planning via @agent-iloom-issue-analyze-and-plan, then implementation"
302
309
  2. Mark todo #8 as completed
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MergeManager
4
- } from "./chunk-FOV7RRQ2.js";
4
+ } from "./chunk-2MAIX45J.js";
5
5
  import {
6
6
  GitWorktreeManager
7
- } from "./chunk-OAP6SASD.js";
7
+ } from "./chunk-2CXREBLZ.js";
8
8
  import {
9
- getRepoRoot,
9
+ getWorktreeRoot,
10
10
  isValidGitRepo
11
- } from "./chunk-5NTD4MCZ.js";
11
+ } from "./chunk-5Q3NDNNV.js";
12
12
  import {
13
13
  SettingsManager
14
- } from "./chunk-UCZ24SUE.js";
15
- import "./chunk-ZLIHIUDQ.js";
14
+ } from "./chunk-CDZERT7Z.js";
15
+ import "./chunk-OYF4VIFI.js";
16
16
  import "./chunk-RW54ZMBM.js";
17
17
  import "./chunk-UJL4HI2R.js";
18
18
  import {
@@ -47,15 +47,15 @@ var RebaseCommand = class {
47
47
  "Run 'il rebase' from within an iloom worktree created by 'il start'."
48
48
  );
49
49
  }
50
- const repoRoot = await getRepoRoot(currentDir);
51
- if (!repoRoot) {
50
+ const worktreeRoot = await getWorktreeRoot(currentDir);
51
+ if (!worktreeRoot) {
52
52
  throw new WorktreeValidationError(
53
53
  "Could not determine repository root.",
54
54
  "Run 'il rebase' from within an iloom worktree created by 'il start'."
55
55
  );
56
56
  }
57
57
  const worktrees = await this.gitWorktreeManager.listWorktrees();
58
- const currentWorktree = worktrees.find((wt) => wt.path === repoRoot);
58
+ const currentWorktree = worktrees.find((wt) => wt.path === worktreeRoot);
59
59
  if (!currentWorktree) {
60
60
  throw new WorktreeValidationError(
61
61
  "This directory is not an iloom worktree.",
@@ -69,7 +69,7 @@ var RebaseCommand = class {
69
69
  "Navigate to a feature worktree created by 'il start <issue>' and run 'il rebase' from there."
70
70
  );
71
71
  }
72
- return repoRoot;
72
+ return worktreeRoot;
73
73
  }
74
74
  async execute(options = {}) {
75
75
  let worktreePath;
@@ -94,4 +94,4 @@ export {
94
94
  RebaseCommand,
95
95
  WorktreeValidationError
96
96
  };
97
- //# sourceMappingURL=rebase-Q7WXK566.js.map
97
+ //# sourceMappingURL=rebase-VJ2VKR6R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/rebase.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport { MergeManager } from '../lib/MergeManager.js'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { SettingsManager } from '../lib/SettingsManager.js'\nimport { isValidGitRepo, getWorktreeRoot } from '../utils/git.js'\nimport type { MergeOptions } from '../types/index.js'\n\nexport interface RebaseOptions {\n\tforce?: boolean\n\tdryRun?: boolean\n}\n\n/**\n * Error thrown when the rebase command is run from an invalid location\n */\nexport class WorktreeValidationError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly suggestion: string\n\t) {\n\t\tsuper(message)\n\t\tthis.name = 'WorktreeValidationError'\n\t}\n}\n\n/**\n * RebaseCommand: Rebase current branch on main with Claude-assisted conflict resolution\n *\n * This command:\n * 1. Validates the current directory is an iloom-managed worktree\n * 2. Detects the worktree root (supports running from subdirectories)\n * 3. Delegates to MergeManager.rebaseOnMain() which handles:\n * - Checking main branch exists\n * - Detecting uncommitted changes (throws if found)\n * - Checking if already up-to-date\n * - Executing rebase\n * - Claude-assisted conflict resolution\n * 4. Reports success\n */\nexport class RebaseCommand {\n\tprivate mergeManager: MergeManager\n\tprivate gitWorktreeManager: GitWorktreeManager\n\tprivate settingsManager: SettingsManager\n\n\tconstructor(mergeManager?: MergeManager, gitWorktreeManager?: GitWorktreeManager, settingsManager?: SettingsManager) {\n\t\tthis.mergeManager = mergeManager ?? new MergeManager()\n\t\tthis.gitWorktreeManager = gitWorktreeManager ?? new GitWorktreeManager()\n\t\tthis.settingsManager = settingsManager ?? new SettingsManager()\n\t}\n\n\t/**\n\t * Validate that the current directory is within an iloom-managed worktree\n\t * Returns the worktree root path if valid\n\t * @throws WorktreeValidationError if validation fails\n\t */\n\tprivate async validateWorktreeContext(): Promise<string> {\n\t\tconst currentDir = process.cwd()\n\n\t\t// Step 1: Check if we're in a git repository at all\n\t\tconst isGitRepo = await isValidGitRepo(currentDir)\n\t\tif (!isGitRepo) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Not a git repository.',\n\t\t\t\t\"Run 'il rebase' from within an iloom worktree created by 'il start'.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 2: Get the worktree root (handles subdirectories)\n\t\tconst worktreeRoot = await getWorktreeRoot(currentDir)\n\t\tif (!worktreeRoot) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Could not determine repository root.',\n\t\t\t\t\"Run 'il rebase' from within an iloom worktree created by 'il start'.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 3: Check if this path is a registered git worktree\n\t\tconst worktrees = await this.gitWorktreeManager.listWorktrees()\n\t\tconst currentWorktree = worktrees.find(wt => wt.path === worktreeRoot)\n\n\t\tif (!currentWorktree) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'This directory is not an iloom worktree.',\n\t\t\t\t\"Run 'il rebase' from within a worktree created by 'il start <issue>'. Use 'il list' to see available worktrees.\"\n\t\t\t)\n\t\t}\n\n\t\t// Step 4: Check if this is the main worktree (we shouldn't rebase from main)\n\t\tconst isMain = await this.gitWorktreeManager.isMainWorktree(currentWorktree, this.settingsManager)\n\t\tif (isMain) {\n\t\t\tthrow new WorktreeValidationError(\n\t\t\t\t'Cannot rebase from the main worktree.',\n\t\t\t\t\"Navigate to a feature worktree created by 'il start <issue>' and run 'il rebase' from there.\"\n\t\t\t)\n\t\t}\n\n\t\treturn worktreeRoot\n\t}\n\n\tasync execute(options: RebaseOptions = {}): Promise<void> {\n\t\t// Step 1: Validate we're in a valid iloom worktree\n\t\tlet worktreePath: string\n\t\ttry {\n\t\t\tworktreePath = await this.validateWorktreeContext()\n\t\t} catch (error) {\n\t\t\tif (error instanceof WorktreeValidationError) {\n\t\t\t\tlogger.error(error.message)\n\t\t\t\tlogger.info(error.suggestion)\n\t\t\t\tthrow error\n\t\t\t}\n\t\t\tthrow error\n\t\t}\n\n\t\tconst mergeOptions: MergeOptions = {\n\t\t\tdryRun: options.dryRun ?? false,\n\t\t\tforce: options.force ?? false,\n\t\t}\n\n\t\t// MergeManager.rebaseOnMain() handles:\n\t\t// - Checking main branch exists\n\t\t// - Detecting uncommitted changes (throws if found)\n\t\t// - Checking if already up-to-date\n\t\t// - Executing rebase\n\t\t// - Claude-assisted conflict resolution\n\t\tawait this.mergeManager.rebaseOnMain(worktreePath, mergeOptions)\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAeO,IAAM,0BAAN,cAAsC,MAAM;AAAA,EAClD,YACC,SACgB,YACf;AACD,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACb;AACD;AAgBO,IAAM,gBAAN,MAAoB;AAAA,EAK1B,YAAY,cAA6B,oBAAyC,iBAAmC;AACpH,SAAK,eAAe,gBAAgB,IAAI,aAAa;AACrD,SAAK,qBAAqB,sBAAsB,IAAI,mBAAmB;AACvE,SAAK,kBAAkB,mBAAmB,IAAI,gBAAgB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,0BAA2C;AACxD,UAAM,aAAa,QAAQ,IAAI;AAG/B,UAAM,YAAY,MAAM,eAAe,UAAU;AACjD,QAAI,CAAC,WAAW;AACf,YAAM,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAGA,UAAM,eAAe,MAAM,gBAAgB,UAAU;AACrD,QAAI,CAAC,cAAc;AAClB,YAAM,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAGA,UAAM,YAAY,MAAM,KAAK,mBAAmB,cAAc;AAC9D,UAAM,kBAAkB,UAAU,KAAK,QAAM,GAAG,SAAS,YAAY;AAErE,QAAI,CAAC,iBAAiB;AACrB,YAAM,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAGA,UAAM,SAAS,MAAM,KAAK,mBAAmB,eAAe,iBAAiB,KAAK,eAAe;AACjG,QAAI,QAAQ;AACX,YAAM,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAQ,UAAyB,CAAC,GAAkB;AAEzD,QAAI;AACJ,QAAI;AACH,qBAAe,MAAM,KAAK,wBAAwB;AAAA,IACnD,SAAS,OAAO;AACf,UAAI,iBAAiB,yBAAyB;AAC7C,eAAO,MAAM,MAAM,OAAO;AAC1B,eAAO,KAAK,MAAM,UAAU;AAC5B,cAAM;AAAA,MACP;AACA,YAAM;AAAA,IACP;AAEA,UAAM,eAA6B;AAAA,MAClC,QAAQ,QAAQ,UAAU;AAAA,MAC1B,OAAO,QAAQ,SAAS;AAAA,IACzB;AAQA,UAAM,KAAK,aAAa,aAAa,cAAc,YAAY;AAAA,EAChE;AACD;","names":[]}
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-YETJNRQM.js";
15
15
  import {
16
16
  GitWorktreeManager
17
- } from "./chunk-OAP6SASD.js";
17
+ } from "./chunk-2CXREBLZ.js";
18
18
  import "./chunk-ZT3YZB4K.js";
19
19
  import {
20
20
  ProjectCapabilityDetector
@@ -25,10 +25,10 @@ import {
25
25
  } from "./chunk-GYCR2LOU.js";
26
26
  import {
27
27
  extractIssueNumber
28
- } from "./chunk-5NTD4MCZ.js";
28
+ } from "./chunk-5Q3NDNNV.js";
29
29
  import {
30
30
  SettingsManager
31
- } from "./chunk-UCZ24SUE.js";
31
+ } from "./chunk-CDZERT7Z.js";
32
32
  import {
33
33
  extractPort,
34
34
  findEnvFileContainingVariable,
@@ -289,4 +289,4 @@ Make sure the project is built (run 'il start' first)`
289
289
  export {
290
290
  RunCommand
291
291
  };
292
- //# sourceMappingURL=run-SJPM6YRI.js.map
292
+ //# sourceMappingURL=run-MJYY4PUT.js.map
@@ -328,14 +328,32 @@
328
328
  "webstorm",
329
329
  "sublime",
330
330
  "intellij",
331
- "windsurf"
331
+ "windsurf",
332
+ "antigravity"
332
333
  ],
333
334
  "default": "vscode",
334
- "description": "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor)."
335
+ "description": "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor), antigravity (Antigravity IDE)."
335
336
  }
336
337
  },
337
338
  "additionalProperties": false,
338
- "description": "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, and Windsurf. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf)."
339
+ "description": "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, Windsurf, and Antigravity. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity)."
340
+ },
341
+ "colors": {
342
+ "type": "object",
343
+ "properties": {
344
+ "terminal": {
345
+ "type": "boolean",
346
+ "default": true,
347
+ "description": "Apply terminal background colors based on branch name (macOS only)"
348
+ },
349
+ "vscode": {
350
+ "type": "boolean",
351
+ "default": false,
352
+ "description": "Apply VSCode/Cursor title bar colors based on branch name. Note: This modifies .vscode/settings.json which may be in source control. Default is false for safety; enable via init or explicitly if .vscode is gitignored."
353
+ }
354
+ },
355
+ "additionalProperties": false,
356
+ "description": "Color synchronization settings for workspace identification"
339
357
  }
340
358
  },
341
359
  "additionalProperties": false
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  findMainWorktreePath
4
- } from "./chunk-5NTD4MCZ.js";
4
+ } from "./chunk-5Q3NDNNV.js";
5
5
  import {
6
6
  SettingsManager
7
- } from "./chunk-UCZ24SUE.js";
7
+ } from "./chunk-CDZERT7Z.js";
8
8
  import {
9
9
  logger
10
10
  } from "./chunk-GEHQXLEI.js";
@@ -49,4 +49,4 @@ var TestGitCommand = class {
49
49
  export {
50
50
  TestGitCommand
51
51
  };
52
- //# sourceMappingURL=test-git-DEUE656D.js.map
52
+ //# sourceMappingURL=test-git-IT5EWQ5C.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  generateWorktreePath
4
- } from "./chunk-5NTD4MCZ.js";
4
+ } from "./chunk-5Q3NDNNV.js";
5
5
  import {
6
6
  SettingsManager
7
- } from "./chunk-UCZ24SUE.js";
7
+ } from "./chunk-CDZERT7Z.js";
8
8
  import {
9
9
  logger
10
10
  } from "./chunk-GEHQXLEI.js";
@@ -65,4 +65,4 @@ var TestPrefixCommand = class {
65
65
  export {
66
66
  TestPrefixCommand
67
67
  };
68
- //# sourceMappingURL=test-prefix-Y6Z6ZHSF.js.map
68
+ //# sourceMappingURL=test-prefix-NPWDPUUH.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iloom/cli",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Control plane for maintaining alignment between you and Claude Code as you work across multiple issues using isolated environments, visible context, and multi-agent workflows to scale understanding, not just output",
5
5
  "keywords": [
6
6
  "ai",
@@ -53,6 +53,7 @@
53
53
  "test": "vitest run",
54
54
  "test:watch": "vitest --watch",
55
55
  "test:coverage": "vitest run --coverage",
56
+ "test:hanging": "vitest run --reporter=hanging-process",
56
57
  "test:ui": "vitest --ui",
57
58
  "lint": "eslint . --ext .ts,.tsx --report-unused-disable-directives --max-warnings 0",
58
59
  "lint:fix": "eslint . --ext .ts,.tsx --fix",
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ClaudeContextManager
4
- } from "./chunk-C7ASXK6J.js";
5
- import "./chunk-A2P7NZTB.js";
6
- import "./chunk-WEN5C5DM.js";
7
- import "./chunk-UCZ24SUE.js";
8
- import "./chunk-ZLIHIUDQ.js";
9
- import "./chunk-RW54ZMBM.js";
10
- import "./chunk-UJL4HI2R.js";
11
- import "./chunk-GEHQXLEI.js";
12
- export {
13
- ClaudeContextManager
14
- };
15
- //# sourceMappingURL=ClaudeContextManager-5WPRJIIW.js.map
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ClaudeService
4
- } from "./chunk-A2P7NZTB.js";
5
- import "./chunk-WEN5C5DM.js";
6
- import "./chunk-UCZ24SUE.js";
7
- import "./chunk-ZLIHIUDQ.js";
8
- import "./chunk-RW54ZMBM.js";
9
- import "./chunk-UJL4HI2R.js";
10
- import "./chunk-GEHQXLEI.js";
11
- export {
12
- ClaudeService
13
- };
14
- //# sourceMappingURL=ClaudeService-Z4KA7QOW.js.map
@@ -1 +0,0 @@
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 } 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}\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 colorData = generateColorFromBranchName(options.branchName)\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\tawait openTerminalWindow({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\tbackgroundColor: colorData.rgb,\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\tconst colorData = generateColorFromBranchName(options.branchName)\n\n\t\tawait openTerminalWindow({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tbackgroundColor: colorData.rgb,\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 colorData = generateColorFromBranchName(options.branchName)\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\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: claudeCommand,\n\t\t\tbackgroundColor: colorData.rgb,\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 colorData = generateColorFromBranchName(options.branchName)\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\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\tbackgroundColor: colorData.rgb,\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 colorData = generateColorFromBranchName(options.branchName)\n\t\tconst hasEnvFile = this.hasAnyEnvFiles(options.worktreePath)\n\t\tconst terminalTitle = `Terminal - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tbackgroundColor: colorData.rgb,\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} 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}\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":[]}