@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.
- package/README.md +3 -3
- package/dist/{BranchNamingService-JYO746H7.js → BranchNamingService-A77VI6AI.js} +2 -2
- package/dist/ClaudeContextManager-BN7RE5ZQ.js +15 -0
- package/dist/ClaudeService-DLYLJUPA.js +14 -0
- package/dist/{GitHubService-UAMH7DMF.js → GitHubService-FZHHBOFG.js} +3 -3
- package/dist/{LoomLauncher-FVZECY3C.js → LoomLauncher-ZV3ZZIBA.js} +23 -20
- package/dist/LoomLauncher-ZV3ZZIBA.js.map +1 -0
- package/dist/{PromptTemplateManager-A52RUAMS.js → PromptTemplateManager-6HH3PVXV.js} +2 -2
- package/dist/README.md +3 -3
- package/dist/{SettingsManager-MTVX57WR.js → SettingsManager-I2LRCW2A.js} +2 -2
- package/dist/{SettingsMigrationManager-AGIIIPDQ.js → SettingsMigrationManager-TJ7UWZG5.js} +3 -3
- package/dist/agents/iloom-issue-complexity-evaluator.md +18 -3
- package/dist/agents/iloom-issue-enhancer.md +1 -1
- package/dist/{chunk-OAP6SASD.js → chunk-2CXREBLZ.js} +2 -2
- package/dist/{chunk-KG343GSG.js → chunk-2IJEMXOB.js} +359 -99
- package/dist/chunk-2IJEMXOB.js.map +1 -0
- package/dist/{chunk-FOV7RRQ2.js → chunk-2MAIX45J.js} +4 -4
- package/dist/{chunk-5NTD4MCZ.js → chunk-5Q3NDNNV.js} +29 -5
- package/dist/chunk-5Q3NDNNV.js.map +1 -0
- package/dist/{chunk-GVICXJHW.js → chunk-5VK4NRSF.js} +2 -2
- package/dist/{chunk-C7ASXK6J.js → chunk-AKUJXDNW.js} +2 -2
- package/dist/{chunk-UCZ24SUE.js → chunk-CDZERT7Z.js} +21 -9
- package/dist/chunk-CDZERT7Z.js.map +1 -0
- package/dist/{chunk-JKXJ7BGL.js → chunk-CE26YH2U.js} +42 -3
- package/dist/chunk-CE26YH2U.js.map +1 -0
- package/dist/{chunk-ZZZWQGTS.js → chunk-CFFQ2Z7A.js} +74 -75
- package/dist/chunk-CFFQ2Z7A.js.map +1 -0
- package/dist/{chunk-FXMLNKLT.js → chunk-DLHA5VQ3.js} +174 -5
- package/dist/chunk-DLHA5VQ3.js.map +1 -0
- package/dist/{chunk-GOG3ZB7O.js → chunk-IFB4Z76W.js} +23 -4
- package/dist/chunk-IFB4Z76W.js.map +1 -0
- package/dist/{chunk-F4ENT6AC.js → chunk-M7JJCX53.js} +2 -2
- package/dist/{chunk-KLBYVHPK.js → chunk-OSCLCMDG.js} +2 -2
- package/dist/{chunk-ZLIHIUDQ.js → chunk-OYF4VIFI.js} +2 -2
- package/dist/{chunk-A2P7NZTB.js → chunk-PGPI5LR4.js} +4 -4
- package/dist/{chunk-WEN5C5DM.js → chunk-RIEO2WML.js} +4 -1
- package/dist/chunk-RIEO2WML.js.map +1 -0
- package/dist/{chunk-UERERX6M.js → chunk-SUOXY5WJ.js} +2 -2
- package/dist/{init-7IIM35LQ.js → chunk-UAN4A3YU.js} +343 -46
- package/dist/chunk-UAN4A3YU.js.map +1 -0
- package/dist/{claude-KIZYXTSG.js → claude-W52VKI6L.js} +2 -2
- package/dist/{cleanup-6WYUD5SN.js → cleanup-H4VXU3C3.js} +12 -12
- package/dist/cli.js +188 -91
- package/dist/cli.js.map +1 -1
- package/dist/{color-ZVALX37U.js → color-F7RU6B6Z.js} +10 -4
- package/dist/{contribute-7YJHZTO7.js → contribute-Y7IQV5QY.js} +4 -4
- package/dist/{feedback-752MGDPG.js → feedback-XTUCKJNT.js} +11 -9
- package/dist/{feedback-752MGDPG.js.map → feedback-XTUCKJNT.js.map} +1 -1
- package/dist/{git-TAFVDB3J.js → git-IYA53VIC.js} +7 -3
- package/dist/{ignite-OAMDUN27.js → ignite-T74RYXCA.js} +19 -71
- package/dist/ignite-T74RYXCA.js.map +1 -0
- package/dist/index.d.ts +52 -8
- package/dist/index.js +132 -84
- package/dist/index.js.map +1 -1
- package/dist/init-4FHTAM3F.js +19 -0
- package/dist/{neon-helpers-5HBYO2VP.js → neon-helpers-77PBPGJ5.js} +3 -3
- package/dist/{open-FCHKQ77R.js → open-UMXANW5S.js} +4 -4
- package/dist/{prompt-7INJ7YRU.js → prompt-QALMYTVC.js} +4 -2
- package/dist/prompt-QALMYTVC.js.map +1 -0
- package/dist/prompts/init-prompt.txt +82 -8
- package/dist/prompts/issue-prompt.txt +18 -11
- package/dist/{rebase-Q7WXK566.js → rebase-VJ2VKR6R.js} +11 -11
- package/dist/rebase-VJ2VKR6R.js.map +1 -0
- package/dist/{run-SJPM6YRI.js → run-MJYY4PUT.js} +4 -4
- package/dist/schema/settings.schema.json +21 -3
- package/dist/{test-git-DEUE656D.js → test-git-IT5EWQ5C.js} +3 -3
- package/dist/{test-prefix-Y6Z6ZHSF.js → test-prefix-NPWDPUUH.js} +3 -3
- package/package.json +2 -1
- package/dist/ClaudeContextManager-5WPRJIIW.js +0 -15
- package/dist/ClaudeService-Z4KA7QOW.js +0 -14
- package/dist/LoomLauncher-FVZECY3C.js.map +0 -1
- package/dist/chunk-5NTD4MCZ.js.map +0 -1
- package/dist/chunk-FXMLNKLT.js.map +0 -1
- package/dist/chunk-GOG3ZB7O.js.map +0 -1
- package/dist/chunk-JKXJ7BGL.js.map +0 -1
- package/dist/chunk-KG343GSG.js.map +0 -1
- package/dist/chunk-PRE7KTM4.js +0 -302
- package/dist/chunk-PRE7KTM4.js.map +0 -1
- package/dist/chunk-UCZ24SUE.js.map +0 -1
- package/dist/chunk-WEN5C5DM.js.map +0 -1
- package/dist/chunk-ZZZWQGTS.js.map +0 -1
- package/dist/ignite-OAMDUN27.js.map +0 -1
- package/dist/init-7IIM35LQ.js.map +0 -1
- package/dist/rebase-Q7WXK566.js.map +0 -1
- /package/dist/{BranchNamingService-JYO746H7.js.map → BranchNamingService-A77VI6AI.js.map} +0 -0
- /package/dist/{ClaudeContextManager-5WPRJIIW.js.map → ClaudeContextManager-BN7RE5ZQ.js.map} +0 -0
- /package/dist/{ClaudeService-Z4KA7QOW.js.map → ClaudeService-DLYLJUPA.js.map} +0 -0
- /package/dist/{GitHubService-UAMH7DMF.js.map → GitHubService-FZHHBOFG.js.map} +0 -0
- /package/dist/{PromptTemplateManager-A52RUAMS.js.map → PromptTemplateManager-6HH3PVXV.js.map} +0 -0
- /package/dist/{SettingsManager-MTVX57WR.js.map → SettingsManager-I2LRCW2A.js.map} +0 -0
- /package/dist/{SettingsMigrationManager-AGIIIPDQ.js.map → SettingsMigrationManager-TJ7UWZG5.js.map} +0 -0
- /package/dist/{chunk-OAP6SASD.js.map → chunk-2CXREBLZ.js.map} +0 -0
- /package/dist/{chunk-FOV7RRQ2.js.map → chunk-2MAIX45J.js.map} +0 -0
- /package/dist/{chunk-GVICXJHW.js.map → chunk-5VK4NRSF.js.map} +0 -0
- /package/dist/{chunk-C7ASXK6J.js.map → chunk-AKUJXDNW.js.map} +0 -0
- /package/dist/{chunk-F4ENT6AC.js.map → chunk-M7JJCX53.js.map} +0 -0
- /package/dist/{chunk-KLBYVHPK.js.map → chunk-OSCLCMDG.js.map} +0 -0
- /package/dist/{chunk-ZLIHIUDQ.js.map → chunk-OYF4VIFI.js.map} +0 -0
- /package/dist/{chunk-A2P7NZTB.js.map → chunk-PGPI5LR4.js.map} +0 -0
- /package/dist/{chunk-UERERX6M.js.map → chunk-SUOXY5WJ.js.map} +0 -0
- /package/dist/{claude-KIZYXTSG.js.map → claude-W52VKI6L.js.map} +0 -0
- /package/dist/{cleanup-6WYUD5SN.js.map → cleanup-H4VXU3C3.js.map} +0 -0
- /package/dist/{color-ZVALX37U.js.map → color-F7RU6B6Z.js.map} +0 -0
- /package/dist/{contribute-7YJHZTO7.js.map → contribute-Y7IQV5QY.js.map} +0 -0
- /package/dist/{git-TAFVDB3J.js.map → git-IYA53VIC.js.map} +0 -0
- /package/dist/{neon-helpers-5HBYO2VP.js.map → init-4FHTAM3F.js.map} +0 -0
- /package/dist/{prompt-7INJ7YRU.js.map → neon-helpers-77PBPGJ5.js.map} +0 -0
- /package/dist/{open-FCHKQ77R.js.map → open-UMXANW5S.js.map} +0 -0
- /package/dist/{run-SJPM6YRI.js.map → run-MJYY4PUT.js.map} +0 -0
- /package/dist/{test-git-DEUE656D.js.map → test-git-IT5EWQ5C.js.map} +0 -0
- /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-
|
|
5
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
28
|
+
} from "./chunk-5Q3NDNNV.js";
|
|
29
29
|
import {
|
|
30
30
|
SettingsManager
|
|
31
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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. **
|
|
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
|
-
|
|
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.
|
|
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-
|
|
4
|
+
} from "./chunk-2MAIX45J.js";
|
|
5
5
|
import {
|
|
6
6
|
GitWorktreeManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2CXREBLZ.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
9
|
+
getWorktreeRoot,
|
|
10
10
|
isValidGitRepo
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5Q3NDNNV.js";
|
|
12
12
|
import {
|
|
13
13
|
SettingsManager
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
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
|
|
51
|
-
if (!
|
|
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 ===
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
28
|
+
} from "./chunk-5Q3NDNNV.js";
|
|
29
29
|
import {
|
|
30
30
|
SettingsManager
|
|
31
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
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-
|
|
4
|
+
} from "./chunk-5Q3NDNNV.js";
|
|
5
5
|
import {
|
|
6
6
|
SettingsManager
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-5Q3NDNNV.js";
|
|
5
5
|
import {
|
|
6
6
|
SettingsManager
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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.
|
|
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":[]}
|