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