@iloom/cli 0.5.0 → 0.5.2
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/dist/{BranchNamingService-GCCWB3LK.js → BranchNamingService-B5PVRR7F.js} +4 -4
- package/dist/ClaudeContextManager-PQ46VILL.js +14 -0
- package/dist/ClaudeService-6OMO552H.js +13 -0
- package/dist/GitHubService-S2OGUTDR.js +12 -0
- package/dist/{LoomLauncher-4UG2E4CD.js → LoomLauncher-ZHDTPKED.js} +15 -79
- package/dist/LoomLauncher-ZHDTPKED.js.map +1 -0
- package/dist/MetadataManager-DFI73J3G.js +10 -0
- package/dist/PRManager-OCSB2HPT.js +14 -0
- package/dist/PromptTemplateManager-5GNF7FCP.js +9 -0
- package/dist/{SettingsManager-XPR4TEQL.js → SettingsManager-CNYBGXDT.js} +3 -3
- package/dist/SettingsMigrationManager-KZKDG66H.js +10 -0
- package/dist/{chunk-OEGECBFS.js → chunk-3PT7RKL5.js} +4 -4
- package/dist/{chunk-WUQQNE63.js → chunk-433MOLAU.js} +44 -7
- package/dist/chunk-433MOLAU.js.map +1 -0
- package/dist/{chunk-LN4H3A6A.js → chunk-53OMUNUN.js} +5 -5
- package/dist/{chunk-THF25ICZ.js → chunk-5F6IWWRS.js} +2 -2
- package/dist/{chunk-P2ZQ5LKB.js → chunk-5IWU3HXE.js} +5 -5
- package/dist/{chunk-QIUJPPJQ.js → chunk-5TXLVEXT.js} +3 -3
- package/dist/{chunk-RFUOIUQF.js → chunk-66BMJ25W.js} +13 -7
- package/dist/chunk-66BMJ25W.js.map +1 -0
- package/dist/{chunk-6UIGZD2N.js → chunk-6MLEBAYZ.js} +2 -2
- package/dist/{chunk-VTXCGKV5.js → chunk-7HIRPCKU.js} +14 -6
- package/dist/chunk-7HIRPCKU.js.map +1 -0
- package/dist/{chunk-UNXRACJ7.js → chunk-7LSSNB7Y.js} +3 -3
- package/dist/{chunk-QHA67Q7A.js → chunk-7Q66W4OH.js} +2 -2
- package/dist/{chunk-RUC7OULH.js → chunk-AEIMYF4P.js} +6 -8
- package/dist/{chunk-RUC7OULH.js.map → chunk-AEIMYF4P.js.map} +1 -1
- package/dist/{chunk-MD6HA5IK.js → chunk-B2UO6EYE.js} +2 -2
- package/dist/{chunk-YZTDGPFB.js → chunk-CFUWQHCJ.js} +2 -2
- package/dist/{chunk-UYWAESOT.js → chunk-F2PWIRV4.js} +3 -3
- package/dist/{chunk-PSFVTBM7.js → chunk-FXDYIV3K.js} +2 -2
- package/dist/{chunk-CDQEK2WD.js → chunk-FXJKNVZW.js} +5 -5
- package/dist/{chunk-3CMGCRB5.js → chunk-HMMO2LDS.js} +3 -3
- package/dist/{chunk-OOU3DKNT.js → chunk-IDUICCZY.js} +2 -2
- package/dist/{chunk-HABINPX2.js → chunk-J7GHNTYK.js} +67 -11
- package/dist/chunk-J7GHNTYK.js.map +1 -0
- package/dist/{chunk-DKQ4SUII.js → chunk-K5G5SFWY.js} +2 -2
- package/dist/chunk-K5G5SFWY.js.map +1 -0
- package/dist/{chunk-KO2FOMHL.js → chunk-LT3SGBR7.js} +2 -2
- package/dist/{chunk-VBFDVGAE.js → chunk-LVLRMP7V.js} +2 -2
- package/dist/{chunk-RNZMHJK7.js → chunk-N4ZJVATC.js} +3 -3
- package/dist/chunk-NXMDEL3F.js +54 -0
- package/dist/chunk-NXMDEL3F.js.map +1 -0
- package/dist/chunk-O7VL5N6S.js +72 -0
- package/dist/chunk-O7VL5N6S.js.map +1 -0
- package/dist/{chunk-S65T4O6I.js → chunk-QPS6TZUW.js} +3 -3
- package/dist/{chunk-RJKMF6BC.js → chunk-SHVB3EFE.js} +3 -3
- package/dist/chunk-VT4PDUYT.js +578 -0
- package/dist/chunk-VT4PDUYT.js.map +1 -0
- package/dist/{chunk-4YTILIIH.js → chunk-VV66DH6T.js} +8 -8
- package/dist/{chunk-GVRO4PWE.js → chunk-XNNXAAZT.js} +6 -6
- package/dist/{chunk-AS2IRKLU.js → chunk-YU5HVI6B.js} +2 -2
- package/dist/{chunk-T5IIUG4Z.js → chunk-Z5BM4JWB.js} +25 -24
- package/dist/chunk-Z5BM4JWB.js.map +1 -0
- package/dist/{chunk-SJ2GZ6RF.js → chunk-ZX3GTM7O.js} +2 -2
- package/dist/{claude-ACVXNB6N.js → claude-H33OQMXO.js} +4 -6
- package/dist/{cleanup-MIDJVSIU.js → cleanup-Y5W3CNUV.js} +20 -22
- package/dist/{cleanup-MIDJVSIU.js.map → cleanup-Y5W3CNUV.js.map} +1 -1
- package/dist/cli.js +125 -81
- package/dist/cli.js.map +1 -1
- package/dist/{color-ZPIIUADB.js → color-4TJ4P5EY.js} +5 -3
- package/dist/{contribute-RS3DO3WP.js → contribute-K7UXBOML.js} +8 -8
- package/dist/{dev-server-ASH7HJVI.js → dev-server-HNBRWGCD.js} +11 -13
- package/dist/{dev-server-ASH7HJVI.js.map → dev-server-HNBRWGCD.js.map} +1 -1
- package/dist/{feedback-RVIGHBJG.js → feedback-567ZH2O7.js} +16 -14
- package/dist/{feedback-RVIGHBJG.js.map → feedback-567ZH2O7.js.map} +1 -1
- package/dist/{git-OQAPUPLP.js → git-OV6ADVO7.js} +6 -6
- package/dist/{ignite-XJALWFAT.js → ignite-3HB3ZBEW.js} +15 -17
- package/dist/{ignite-XJALWFAT.js.map → ignite-3HB3ZBEW.js.map} +1 -1
- package/dist/index.d.ts +54 -35
- package/dist/index.js +377 -276
- package/dist/index.js.map +1 -1
- package/dist/init-CMIRHFSR.js +19 -0
- package/dist/{installation-detector-6R6YOFVZ.js → installation-detector-VXZOCL6P.js} +3 -3
- package/dist/mcp/issue-management-server.js +62 -7
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/neon-helpers-3KBC4A3Y.js +11 -0
- package/dist/{open-KW4NTLXH.js → open-AXE225Z5.js} +11 -13
- package/dist/{open-KW4NTLXH.js.map → open-AXE225Z5.js.map} +1 -1
- package/dist/{projects-QEAEBAT2.js → projects-GVEMCN5R.js} +4 -4
- package/dist/{prompt-A7GGRHSY.js → prompt-3SAZYRUN.js} +3 -3
- package/dist/prompts/session-summary-prompt.txt +58 -4
- package/dist/{rebase-WZHHE5LU.js → rebase-6UIHMUWS.js} +9 -11
- package/dist/{rebase-WZHHE5LU.js.map → rebase-6UIHMUWS.js.map} +1 -1
- package/dist/{recap-33NPZ3ZO.js → recap-XTBNMEMO.js} +12 -19
- package/dist/recap-XTBNMEMO.js.map +1 -0
- package/dist/{remote-73TZ2ADI.js → remote-IJAMOEAP.js} +3 -3
- package/dist/{run-HRYQ7TR7.js → run-H375EYRB.js} +11 -13
- package/dist/{run-HRYQ7TR7.js.map → run-H375EYRB.js.map} +1 -1
- package/dist/{shell-JMU5XTHW.js → shell-33FJCWJQ.js} +9 -11
- package/dist/{shell-JMU5XTHW.js.map → shell-33FJCWJQ.js.map} +1 -1
- package/dist/{summary-4SSGGH7N.js → summary-JUMOCNLR.js} +14 -15
- package/dist/{summary-4SSGGH7N.js.map → summary-JUMOCNLR.js.map} +1 -1
- package/dist/{test-git-6SAIRBUD.js → test-git-CO3BA4BV.js} +6 -6
- package/dist/{test-prefix-RLVRK5ZD.js → test-prefix-HZYSDQYT.js} +6 -6
- package/dist/{test-tabs-3SCJWRKT.js → test-tabs-D3POYOJ5.js} +3 -6
- package/dist/{test-tabs-3SCJWRKT.js.map → test-tabs-D3POYOJ5.js.map} +1 -1
- package/dist/{test-webserver-VPNLAFZ3.js → test-webserver-YVQD42W6.js} +2 -2
- package/dist/{update-LETF5ASC.js → update-5NOHT4SG.js} +4 -4
- package/dist/{update-notifier-H55ZK7NU.js → update-notifier-ARA5SPUW.js} +3 -3
- package/package.json +1 -1
- package/dist/ClaudeContextManager-DQFKIMEP.js +0 -16
- package/dist/ClaudeService-CJS32WG2.js +0 -15
- package/dist/GitHubService-RPM27GWD.js +0 -12
- package/dist/LoomLauncher-4UG2E4CD.js.map +0 -1
- package/dist/MetadataManager-WXUVXKUS.js +0 -10
- package/dist/PRManager-7DSIMCAD.js +0 -16
- package/dist/PromptTemplateManager-72FEOGT6.js +0 -9
- package/dist/SettingsMigrationManager-EH3J2TCN.js +0 -10
- package/dist/chunk-DKQ4SUII.js.map +0 -1
- package/dist/chunk-HABINPX2.js.map +0 -1
- package/dist/chunk-RFUOIUQF.js.map +0 -1
- package/dist/chunk-T5IIUG4Z.js.map +0 -1
- package/dist/chunk-UYVWLISQ.js +0 -113
- package/dist/chunk-UYVWLISQ.js.map +0 -1
- package/dist/chunk-VAYGNQTE.js +0 -234
- package/dist/chunk-VAYGNQTE.js.map +0 -1
- package/dist/chunk-VTXCGKV5.js.map +0 -1
- package/dist/chunk-WUQQNE63.js.map +0 -1
- package/dist/chunk-Z5NXYJIG.js +0 -207
- package/dist/chunk-Z5NXYJIG.js.map +0 -1
- package/dist/init-F6PFMSU5.js +0 -21
- package/dist/neon-helpers-L5CXQ5CT.js +0 -11
- package/dist/recap-33NPZ3ZO.js.map +0 -1
- /package/dist/{BranchNamingService-GCCWB3LK.js.map → BranchNamingService-B5PVRR7F.js.map} +0 -0
- /package/dist/{ClaudeContextManager-DQFKIMEP.js.map → ClaudeContextManager-PQ46VILL.js.map} +0 -0
- /package/dist/{ClaudeService-CJS32WG2.js.map → ClaudeService-6OMO552H.js.map} +0 -0
- /package/dist/{GitHubService-RPM27GWD.js.map → GitHubService-S2OGUTDR.js.map} +0 -0
- /package/dist/{MetadataManager-WXUVXKUS.js.map → MetadataManager-DFI73J3G.js.map} +0 -0
- /package/dist/{PRManager-7DSIMCAD.js.map → PRManager-OCSB2HPT.js.map} +0 -0
- /package/dist/{PromptTemplateManager-72FEOGT6.js.map → PromptTemplateManager-5GNF7FCP.js.map} +0 -0
- /package/dist/{SettingsManager-XPR4TEQL.js.map → SettingsManager-CNYBGXDT.js.map} +0 -0
- /package/dist/{SettingsMigrationManager-EH3J2TCN.js.map → SettingsMigrationManager-KZKDG66H.js.map} +0 -0
- /package/dist/{chunk-OEGECBFS.js.map → chunk-3PT7RKL5.js.map} +0 -0
- /package/dist/{chunk-LN4H3A6A.js.map → chunk-53OMUNUN.js.map} +0 -0
- /package/dist/{chunk-THF25ICZ.js.map → chunk-5F6IWWRS.js.map} +0 -0
- /package/dist/{chunk-P2ZQ5LKB.js.map → chunk-5IWU3HXE.js.map} +0 -0
- /package/dist/{chunk-QIUJPPJQ.js.map → chunk-5TXLVEXT.js.map} +0 -0
- /package/dist/{chunk-6UIGZD2N.js.map → chunk-6MLEBAYZ.js.map} +0 -0
- /package/dist/{chunk-UNXRACJ7.js.map → chunk-7LSSNB7Y.js.map} +0 -0
- /package/dist/{chunk-QHA67Q7A.js.map → chunk-7Q66W4OH.js.map} +0 -0
- /package/dist/{chunk-MD6HA5IK.js.map → chunk-B2UO6EYE.js.map} +0 -0
- /package/dist/{chunk-YZTDGPFB.js.map → chunk-CFUWQHCJ.js.map} +0 -0
- /package/dist/{chunk-UYWAESOT.js.map → chunk-F2PWIRV4.js.map} +0 -0
- /package/dist/{chunk-PSFVTBM7.js.map → chunk-FXDYIV3K.js.map} +0 -0
- /package/dist/{chunk-CDQEK2WD.js.map → chunk-FXJKNVZW.js.map} +0 -0
- /package/dist/{chunk-3CMGCRB5.js.map → chunk-HMMO2LDS.js.map} +0 -0
- /package/dist/{chunk-OOU3DKNT.js.map → chunk-IDUICCZY.js.map} +0 -0
- /package/dist/{chunk-KO2FOMHL.js.map → chunk-LT3SGBR7.js.map} +0 -0
- /package/dist/{chunk-VBFDVGAE.js.map → chunk-LVLRMP7V.js.map} +0 -0
- /package/dist/{chunk-RNZMHJK7.js.map → chunk-N4ZJVATC.js.map} +0 -0
- /package/dist/{chunk-S65T4O6I.js.map → chunk-QPS6TZUW.js.map} +0 -0
- /package/dist/{chunk-RJKMF6BC.js.map → chunk-SHVB3EFE.js.map} +0 -0
- /package/dist/{chunk-4YTILIIH.js.map → chunk-VV66DH6T.js.map} +0 -0
- /package/dist/{chunk-GVRO4PWE.js.map → chunk-XNNXAAZT.js.map} +0 -0
- /package/dist/{chunk-AS2IRKLU.js.map → chunk-YU5HVI6B.js.map} +0 -0
- /package/dist/{chunk-SJ2GZ6RF.js.map → chunk-ZX3GTM7O.js.map} +0 -0
- /package/dist/{claude-ACVXNB6N.js.map → claude-H33OQMXO.js.map} +0 -0
- /package/dist/{color-ZPIIUADB.js.map → color-4TJ4P5EY.js.map} +0 -0
- /package/dist/{contribute-RS3DO3WP.js.map → contribute-K7UXBOML.js.map} +0 -0
- /package/dist/{git-OQAPUPLP.js.map → git-OV6ADVO7.js.map} +0 -0
- /package/dist/{init-F6PFMSU5.js.map → init-CMIRHFSR.js.map} +0 -0
- /package/dist/{installation-detector-6R6YOFVZ.js.map → installation-detector-VXZOCL6P.js.map} +0 -0
- /package/dist/{neon-helpers-L5CXQ5CT.js.map → neon-helpers-3KBC4A3Y.js.map} +0 -0
- /package/dist/{projects-QEAEBAT2.js.map → projects-GVEMCN5R.js.map} +0 -0
- /package/dist/{prompt-A7GGRHSY.js.map → prompt-3SAZYRUN.js.map} +0 -0
- /package/dist/{remote-73TZ2ADI.js.map → remote-IJAMOEAP.js.map} +0 -0
- /package/dist/{test-git-6SAIRBUD.js.map → test-git-CO3BA4BV.js.map} +0 -0
- /package/dist/{test-prefix-RLVRK5ZD.js.map → test-prefix-HZYSDQYT.js.map} +0 -0
- /package/dist/{test-webserver-VPNLAFZ3.js.map → test-webserver-YVQD42W6.js.map} +0 -0
- /package/dist/{update-LETF5ASC.js.map → update-5NOHT4SG.js.map} +0 -0
- /package/dist/{update-notifier-H55ZK7NU.js.map → update-notifier-ARA5SPUW.js.map} +0 -0
|
@@ -3,12 +3,12 @@ import {
|
|
|
3
3
|
ClaudeBranchNameStrategy,
|
|
4
4
|
DefaultBranchNamingService,
|
|
5
5
|
SimpleBranchNameStrategy
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-5TXLVEXT.js";
|
|
7
|
+
import "./chunk-6MLEBAYZ.js";
|
|
8
|
+
import "./chunk-VT4PDUYT.js";
|
|
9
9
|
export {
|
|
10
10
|
ClaudeBranchNameStrategy,
|
|
11
11
|
DefaultBranchNamingService,
|
|
12
12
|
SimpleBranchNameStrategy
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=BranchNamingService-
|
|
14
|
+
//# sourceMappingURL=BranchNamingService-B5PVRR7F.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ClaudeContextManager
|
|
4
|
+
} from "./chunk-QPS6TZUW.js";
|
|
5
|
+
import "./chunk-FXJKNVZW.js";
|
|
6
|
+
import "./chunk-K5G5SFWY.js";
|
|
7
|
+
import "./chunk-IDUICCZY.js";
|
|
8
|
+
import "./chunk-AEIMYF4P.js";
|
|
9
|
+
import "./chunk-6MLEBAYZ.js";
|
|
10
|
+
import "./chunk-VT4PDUYT.js";
|
|
11
|
+
export {
|
|
12
|
+
ClaudeContextManager
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=ClaudeContextManager-PQ46VILL.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ClaudeService
|
|
4
|
+
} from "./chunk-FXJKNVZW.js";
|
|
5
|
+
import "./chunk-K5G5SFWY.js";
|
|
6
|
+
import "./chunk-IDUICCZY.js";
|
|
7
|
+
import "./chunk-AEIMYF4P.js";
|
|
8
|
+
import "./chunk-6MLEBAYZ.js";
|
|
9
|
+
import "./chunk-VT4PDUYT.js";
|
|
10
|
+
export {
|
|
11
|
+
ClaudeService
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=ClaudeService-6OMO552H.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
GitHubService
|
|
4
|
+
} from "./chunk-3PT7RKL5.js";
|
|
5
|
+
import "./chunk-LT3SGBR7.js";
|
|
6
|
+
import "./chunk-ZX3GTM7O.js";
|
|
7
|
+
import "./chunk-6MLEBAYZ.js";
|
|
8
|
+
import "./chunk-VT4PDUYT.js";
|
|
9
|
+
export {
|
|
10
|
+
GitHubService
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=GitHubService-S2OGUTDR.js.map
|
|
@@ -1,97 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
openIdeWindow
|
|
4
|
+
} from "./chunk-O7VL5N6S.js";
|
|
2
5
|
import {
|
|
3
6
|
ClaudeContextManager
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-QPS6TZUW.js";
|
|
8
|
+
import "./chunk-FXJKNVZW.js";
|
|
9
|
+
import "./chunk-K5G5SFWY.js";
|
|
7
10
|
import {
|
|
8
11
|
getExecutablePath
|
|
9
12
|
} from "./chunk-GYCR2LOU.js";
|
|
10
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-IDUICCZY.js";
|
|
11
14
|
import {
|
|
12
15
|
generateColorFromBranchName,
|
|
13
16
|
hexToRgb
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import {
|
|
17
|
-
openMultipleTerminalWindows,
|
|
18
|
-
openTerminalWindow
|
|
19
|
-
} from "./chunk-VAYGNQTE.js";
|
|
20
|
-
import {
|
|
21
|
-
getDotenvFlowFiles
|
|
22
|
-
} from "./chunk-Z5NXYJIG.js";
|
|
17
|
+
} from "./chunk-433MOLAU.js";
|
|
18
|
+
import "./chunk-AEIMYF4P.js";
|
|
23
19
|
import {
|
|
24
20
|
getLogger
|
|
25
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
26
22
|
import {
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
getDotenvFlowFiles,
|
|
24
|
+
openMultipleTerminalWindows,
|
|
25
|
+
openTerminalWindow
|
|
26
|
+
} from "./chunk-VT4PDUYT.js";
|
|
29
27
|
|
|
30
28
|
// src/lib/LoomLauncher.ts
|
|
31
29
|
import { existsSync } from "fs";
|
|
32
30
|
import { join } from "path";
|
|
33
|
-
|
|
34
|
-
// src/utils/ide.ts
|
|
35
|
-
import { execa } from "execa";
|
|
36
|
-
var IDE_PRESETS = {
|
|
37
|
-
vscode: { command: "code", name: "Visual Studio Code", args: [] },
|
|
38
|
-
cursor: { command: "cursor", name: "Cursor", args: [] },
|
|
39
|
-
webstorm: { command: "webstorm", name: "WebStorm", args: ["--nosplash"] },
|
|
40
|
-
sublime: { command: "subl", name: "Sublime Text", args: [] },
|
|
41
|
-
intellij: { command: "idea", name: "IntelliJ IDEA", args: ["--nosplash"] },
|
|
42
|
-
windsurf: { command: "surf", name: "Windsurf", args: [] },
|
|
43
|
-
antigravity: { command: "agy", name: "Antigravity", args: [] }
|
|
44
|
-
};
|
|
45
|
-
function getIdeConfig(ideSettings) {
|
|
46
|
-
const type = (ideSettings == null ? void 0 : ideSettings.type) ?? "vscode";
|
|
47
|
-
const preset = IDE_PRESETS[type];
|
|
48
|
-
return {
|
|
49
|
-
command: preset.command,
|
|
50
|
-
args: [...preset.args],
|
|
51
|
-
name: preset.name
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
async function isIdeAvailable(command) {
|
|
55
|
-
try {
|
|
56
|
-
await execa("command", ["-v", command], { shell: true, timeout: 5e3 });
|
|
57
|
-
return true;
|
|
58
|
-
} catch {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function getInstallHint(type) {
|
|
63
|
-
const hints = {
|
|
64
|
-
vscode: `Install command-line tools: Open VSCode > Command Palette > "Shell Command: Install 'code' command in PATH"`,
|
|
65
|
-
cursor: `Install command-line tools: Open Cursor > Command Palette > "Install 'cursor' command in PATH"`,
|
|
66
|
-
webstorm: "Install via JetBrains Toolbox > Settings > Shell Scripts > Enable",
|
|
67
|
-
sublime: 'Create symlink: ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl',
|
|
68
|
-
intellij: "Install via JetBrains Toolbox > Settings > Shell Scripts > Enable",
|
|
69
|
-
windsurf: "Install command-line tools during Windsurf installation or create symlink manually",
|
|
70
|
-
antigravity: "Install command-line tools during Antigravity installation or create symlink manually"
|
|
71
|
-
};
|
|
72
|
-
return hints[type] ?? `Ensure the IDE command is available in your PATH`;
|
|
73
|
-
}
|
|
74
|
-
async function openIdeWindow(workspacePath, ideSettings) {
|
|
75
|
-
const config = getIdeConfig(ideSettings);
|
|
76
|
-
const available = await isIdeAvailable(config.command);
|
|
77
|
-
if (!available) {
|
|
78
|
-
const type = (ideSettings == null ? void 0 : ideSettings.type) ?? "vscode";
|
|
79
|
-
throw new Error(
|
|
80
|
-
`${config.name} is not available. The "${config.command}" command was not found in PATH.
|
|
81
|
-
` + getInstallHint(type)
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
await execa(config.command, [...config.args, workspacePath]);
|
|
86
|
-
logger.debug(`Opened ${config.name} for workspace: ${workspacePath}`);
|
|
87
|
-
} catch (error) {
|
|
88
|
-
throw new Error(
|
|
89
|
-
`Failed to open ${config.name}: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// src/lib/LoomLauncher.ts
|
|
95
31
|
var LoomLauncher = class {
|
|
96
32
|
constructor(claudeContext, settings) {
|
|
97
33
|
this.claudeContext = claudeContext ?? new ClaudeContextManager();
|
|
@@ -316,4 +252,4 @@ var LoomLauncher = class {
|
|
|
316
252
|
export {
|
|
317
253
|
LoomLauncher
|
|
318
254
|
};
|
|
319
|
-
//# sourceMappingURL=LoomLauncher-
|
|
255
|
+
//# sourceMappingURL=LoomLauncher-ZHDTPKED.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/LoomLauncher.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 { generateColorFromBranchName, hexToRgb } from '../utils/color.js'\nimport { getLogger } from '../utils/logger-context.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'\nimport { getExecutablePath } from '../utils/cli-overrides.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\tgetLogger().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\tgetLogger().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: 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\tgetLogger().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\tgetLogger().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\tgetLogger().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\tgetLogger().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\tgetLogger().info('Claude terminal opened')\n\t}\n\n\t/**\n\t * Launch dev server terminal\n\t * Runs `il dev-server [identifier]` which handles env loading internally\n\t */\n\tprivate async launchDevServerTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\t// Build dev-server command with identifier\n\t\tconst executable = options.executablePath ?? getExecutablePath()\n\t\tconst devServerIdentifier = String(options.identifier)\n\t\tconst devServerCommand = `${executable} dev-server ${devServerIdentifier}`\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\t// il dev-server handles env loading internally, so no includeEnvSetup\n\t\t\tincludeEnvSetup: false,\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t})\n\t\tgetLogger().info('Dev server terminal opened')\n\t}\n\n\t/**\n\t * Launch standalone terminal running `il shell <identifier>`\n\t */\n\tprivate async launchStandaloneTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\t// Build shell command with identifier\n\t\tconst executable = options.executablePath ?? getExecutablePath()\n\t\tconst shellIdentifier = String(options.identifier)\n\t\tconst shellCommand = `${executable} shell ${shellIdentifier}`\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: shellCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\t// il shell handles env loading internally, so we don't need includeEnvSetup\n\t\t\tincludeEnvSetup: false,\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t})\n\t\tgetLogger().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 * Uses `il dev-server [identifier]` which handles env loading internally\n\t */\n\tprivate buildDevServerTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): TerminalWindowOptions {\n\t\t// Build dev-server command with identifier\n\t\tconst executable = options.executablePath ?? getExecutablePath()\n\t\tconst devServerIdentifier = String(options.identifier)\n\t\tconst devServerCommand = `${executable} dev-server ${devServerIdentifier}`\n\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\t// il dev-server handles env loading internally\n\t\t\tincludeEnvSetup: false,\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\n\t * Runs `il shell <identifier>` which handles env loading internally\n\t */\n\tprivate buildStandaloneTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): TerminalWindowOptions {\n\t\tconst terminalTitle = `Terminal - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\t// Build shell command with identifier\n\t\t// Use the same executable path pattern as buildClaudeTerminalOptions\n\t\tconst executable = options.executablePath ?? getExecutablePath()\n\t\tconst shellIdentifier = String(options.identifier)\n\t\tconst shellCommand = `${executable} shell ${shellIdentifier}`\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: shellCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\ttitle: terminalTitle,\n\t\t\t// il shell handles env loading internally, so we don't need includeEnvSetup\n\t\t\tincludeEnvSetup: false,\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\tgetLogger().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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAmCd,IAAM,eAAN,MAAmB;AAAA,EAIzB,YAAY,eAAsC,UAA4B;AAC7E,SAAK,gBAAgB,iBAAiB,IAAI,qBAAqB;AAC/D,QAAI,aAAa,QAAW;AAC3B,WAAK,WAAW;AAAA,IACjB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAA2C;AAC3D,UAAM,EAAE,cAAc,YAAY,iBAAiB,eAAe,IAAI;AAEtE,cAAU,EAAE,MAAM,qCAAqC,YAAY,UAAU,UAAU,eAAe,eAAe,cAAc,cAAc,EAAE;AAEnJ,UAAM,iBAAkC,CAAC;AAGzC,QAAI,YAAY;AACf,gBAAU,EAAE,MAAM,kBAAkB;AACpC,qBAAe,KAAK,KAAK,aAAa,OAAO,CAAC;AAAA,IAC/C;AAGA,UAAM,oBAGD,CAAC;AAEN,QAAI,iBAAiB;AACpB,wBAAkB,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,KAAK,8BAA8B,OAAO;AAAA,MACpD,CAAC;AAAA,IACF;AAEA,QAAI,gBAAgB;AACnB,wBAAkB,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,KAAK,+BAA+B,OAAO;AAAA,MACrD,CAAC;AAAA,IACF;AAEA,QAAI,cAAc;AACjB,wBAAkB,KAAK;AAAA,QACtB,MAAM;AAAA,QACN,SAAS,MAAM,KAAK,2BAA2B,OAAO;AAAA,MACvD,CAAC;AAAA,IACF;AAGA,QAAI,kBAAkB,SAAS,GAAG;AAEjC,gBAAU,EAAE,MAAM,aAAa,kBAAkB,MAAM,6BAA6B;AACpF,qBAAe,KAAK,KAAK,wBAAwB,mBAAmB,OAAO,CAAC;AAAA,IAC7E,WAAW,kBAAkB,WAAW,GAAG;AAE1C,YAAM,WAAW,kBAAkB,CAAC;AACpC,UAAI,CAAC,UAAU;AACd,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACtD;AACA,YAAM,eAAe,SAAS;AAC9B,gBAAU,EAAE,MAAM,oBAAoB,YAAY,WAAW;AAE7D,UAAI,iBAAiB,UAAU;AAC9B,uBAAe,KAAK,KAAK,qBAAqB,OAAO,CAAC;AAAA,MACvD,WAAW,iBAAiB,aAAa;AACxC,uBAAe,KAAK,KAAK,wBAAwB,OAAO,CAAC;AAAA,MAC1D,OAAO;AACN,uBAAe,KAAK,KAAK,yBAAyB,OAAO,CAAC;AAAA,MAC3D;AAAA,IACD;AAGA,UAAM,QAAQ,IAAI,cAAc;AAEhC,cAAU,EAAE,QAAQ,4BAA4B;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAA2C;AA1HvE;AA2HE,UAAM,YAAY,QAAM,UAAK,aAAL,mBAAe,eAAe,KAAK,CAAC,MAAM,EAAE;AACpE,UAAM,cAAc,QAAQ,cAAc,SAAS;AACnD,cAAU,EAAE,KAAK,YAAY;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,SAA2C;AAC7E,UAAM,KAAK,cAAc,kBAAkB;AAAA,MAC1C,eAAe,QAAQ;AAAA,MACvB,MAAM,QAAQ;AAAA,MACd,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,GAAI,QAAQ,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,MAC5C,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,MACvD,SAAS,QAAQ,WAAW;AAAA,MAC5B,GAAI,QAAQ,gBAAgB,EAAE,cAAc,QAAQ,aAAa;AAAA,MACjE,GAAI,QAAQ,kBAAkB,EAAE,gBAAgB,QAAQ,eAAe;AAAA,IACxE,CAAC;AACD,cAAU,EAAE,KAAK,wBAAwB;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,wBAAwB,SAA2C;AAEhF,UAAM,aAAa,QAAQ,kBAAkB,kBAAkB;AAC/D,UAAM,sBAAsB,OAAO,QAAQ,UAAU;AACrD,UAAM,mBAAmB,GAAG,UAAU,eAAe,mBAAmB;AAGxE,UAAM,kBAAmB,QAAQ,iBAAiB,OAC/C,QAAQ,WACP,SAAS,QAAQ,QAAQ,IACzB,4BAA4B,QAAQ,UAAU,EAAE,MACjD;AAEH,UAAM,mBAAmB;AAAA,MACxB,eAAe,QAAQ;AAAA,MACvB,SAAS;AAAA,MACT,GAAI,mBAAmB,EAAE,gBAAgB;AAAA;AAAA,MAEzC,iBAAiB;AAAA,MACjB,mBAAmB,QAAQ,aAAa,SAAS,KAAK;AAAA,MACtD,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,IACxD,CAAC;AACD,cAAU,EAAE,KAAK,4BAA4B;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBAAyB,SAA2C;AAEjF,UAAM,aAAa,QAAQ,kBAAkB,kBAAkB;AAC/D,UAAM,kBAAkB,OAAO,QAAQ,UAAU;AACjD,UAAM,eAAe,GAAG,UAAU,UAAU,eAAe;AAG3D,UAAM,kBAAmB,QAAQ,iBAAiB,OAC/C,QAAQ,WACP,SAAS,QAAQ,QAAQ,IACzB,4BAA4B,QAAQ,UAAU,EAAE,MACjD;AAEH,UAAM,mBAAmB;AAAA,MACxB,eAAe,QAAQ;AAAA,MACvB,SAAS;AAAA,MACT,GAAI,mBAAmB,EAAE,gBAAgB;AAAA;AAAA,MAEzC,iBAAiB;AAAA,MACjB,mBAAmB,QAAQ,aAAa,SAAS,KAAK;AAAA,MACtD,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,IACxD,CAAC;AACD,cAAU,EAAE,KAAK,4BAA4B;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,2BACb,SACiC;AACjC,UAAM,aAAa,KAAK,eAAe,QAAQ,YAAY;AAC3D,UAAM,cAAc,YAAY,KAAK,iBAAiB,QAAQ,cAAc,QAAQ,UAAU,CAAC;AAE/F,UAAM,aAAa,QAAQ,kBAAkB;AAC7C,QAAI,gBAAgB,GAAG,UAAU;AACjC,QAAI,QAAQ,YAAY,UAAa,QAAQ,YAAY,WAAW;AACnE,uBAAiB,eAAe,QAAQ,OAAO;AAAA,IAChD;AACA,QAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC5D,iBAAW,UAAU,QAAQ,cAAc;AAC1C,yBAAiB,UAAU,MAAM;AAAA,MAClC;AAAA,IACD;AAGA,UAAM,kBAAmB,QAAQ,iBAAiB,OAC/C,QAAQ,WACP,SAAS,QAAQ,QAAQ,IACzB,4BAA4B,QAAQ,UAAU,EAAE,MACjD;AAEH,WAAO;AAAA,MACN,eAAe,QAAQ;AAAA,MACvB,SAAS;AAAA,MACT,GAAI,mBAAmB,EAAE,gBAAgB;AAAA,MACzC,OAAO;AAAA,MACP,kBAAkB,QAAQ,oBAAoB,UAAU;AAAA,MACxD,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,MAAM,mBAAmB,KAAK;AAAA,IACjF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,8BACP,SACwB;AAExB,UAAM,aAAa,QAAQ,kBAAkB,kBAAkB;AAC/D,UAAM,sBAAsB,OAAO,QAAQ,UAAU;AACrD,UAAM,mBAAmB,GAAG,UAAU,eAAe,mBAAmB;AAExE,UAAM,iBAAiB,gBAAgB,KAAK,iBAAiB,QAAQ,cAAc,QAAQ,UAAU,CAAC;AAGtG,UAAM,kBAAmB,QAAQ,iBAAiB,OAC/C,QAAQ,WACP,SAAS,QAAQ,QAAQ,IACzB,4BAA4B,QAAQ,UAAU,EAAE,MACjD;AAEH,WAAO;AAAA,MACN,eAAe,QAAQ;AAAA,MACvB,SAAS;AAAA,MACT,GAAI,mBAAmB,EAAE,gBAAgB;AAAA,MACzC,OAAO;AAAA;AAAA,MAEP,iBAAiB;AAAA,MACjB,mBAAmB,QAAQ,aAAa,SAAS,KAAK;AAAA,MACtD,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,IACxD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,+BACP,SACwB;AACxB,UAAM,gBAAgB,cAAc,KAAK,iBAAiB,QAAQ,cAAc,QAAQ,UAAU,CAAC;AAInG,UAAM,aAAa,QAAQ,kBAAkB,kBAAkB;AAC/D,UAAM,kBAAkB,OAAO,QAAQ,UAAU;AACjD,UAAM,eAAe,GAAG,UAAU,UAAU,eAAe;AAG3D,UAAM,kBAAmB,QAAQ,iBAAiB,OAC/C,QAAQ,WACP,SAAS,QAAQ,QAAQ,IACzB,4BAA4B,QAAQ,UAAU,EAAE,MACjD;AAEH,WAAO;AAAA,MACN,eAAe,QAAQ;AAAA,MACvB,SAAS;AAAA,MACT,GAAI,mBAAmB,EAAE,gBAAgB;AAAA,MACzC,OAAO;AAAA;AAAA,MAEP,iBAAiB;AAAA,MACjB,mBAAmB,QAAQ,aAAa,SAAS,KAAK;AAAA,MACtD,GAAI,QAAQ,SAAS,UAAa,EAAE,MAAM,QAAQ,KAAK;AAAA,IACxD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBACb,WACA,UACgB;AAChB,UAAM,kBAAkB,UAAU,IAAI,CAAC,MAAM,EAAE,OAAO;AAEtD,UAAM,4BAA4B,eAAe;AAEjD,UAAM,gBAAgB,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,KAAK;AAC7D,cAAU,EAAE,KAAK,8BAA8B,aAAa,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,eAAgC;AACtD,UAAM,WAAW,mBAAmB;AACpC,WAAO,SAAS,KAAK,UAAQ,WAAW,KAAK,eAAe,IAAI,CAAC,CAAC;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,cAA0C,YAAqC;AACvG,QAAI,iBAAiB,SAAS;AAC7B,aAAO,UAAU,UAAU;AAAA,IAC5B,WAAW,iBAAiB,MAAM;AACjC,aAAO,OAAO,UAAU;AAAA,IACzB,OAAO;AACN,aAAO,WAAW,UAAU;AAAA,IAC7B;AAAA,EACD;AACD;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
PRManager
|
|
4
|
+
} from "./chunk-5IWU3HXE.js";
|
|
5
|
+
import "./chunk-YETJNRQM.js";
|
|
6
|
+
import "./chunk-FXDYIV3K.js";
|
|
7
|
+
import "./chunk-LT3SGBR7.js";
|
|
8
|
+
import "./chunk-AEIMYF4P.js";
|
|
9
|
+
import "./chunk-6MLEBAYZ.js";
|
|
10
|
+
import "./chunk-VT4PDUYT.js";
|
|
11
|
+
export {
|
|
12
|
+
PRManager
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=PRManager-OCSB2HPT.js.map
|
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
WorkflowPermissionSchemaNoDefaults,
|
|
15
15
|
WorkflowsSettingsSchema,
|
|
16
16
|
WorkflowsSettingsSchemaNoDefaults
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-IDUICCZY.js";
|
|
18
|
+
import "./chunk-VT4PDUYT.js";
|
|
19
19
|
export {
|
|
20
20
|
AgentSettingsSchema,
|
|
21
21
|
CapabilitiesSettingsSchema,
|
|
@@ -32,4 +32,4 @@ export {
|
|
|
32
32
|
WorkflowsSettingsSchema,
|
|
33
33
|
WorkflowsSettingsSchemaNoDefaults
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=SettingsManager-
|
|
35
|
+
//# sourceMappingURL=SettingsManager-CNYBGXDT.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
SettingsMigrationManager
|
|
4
|
+
} from "./chunk-F2PWIRV4.js";
|
|
5
|
+
import "./chunk-ZX3GTM7O.js";
|
|
6
|
+
import "./chunk-VT4PDUYT.js";
|
|
7
|
+
export {
|
|
8
|
+
SettingsMigrationManager
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=SettingsMigrationManager-KZKDG66H.js.map
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
fetchProjectList,
|
|
10
10
|
hasProjectScope,
|
|
11
11
|
updateProjectItemField
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-LT3SGBR7.js";
|
|
13
13
|
import {
|
|
14
14
|
promptConfirmation
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-ZX3GTM7O.js";
|
|
16
16
|
import {
|
|
17
17
|
getLogger
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
19
19
|
|
|
20
20
|
// src/lib/GitHubService.ts
|
|
21
21
|
import { execSync } from "child_process";
|
|
@@ -300,4 +300,4 @@ State: ${entity.state}`;
|
|
|
300
300
|
export {
|
|
301
301
|
GitHubService
|
|
302
302
|
};
|
|
303
|
-
//# sourceMappingURL=chunk-
|
|
303
|
+
//# sourceMappingURL=chunk-3PT7RKL5.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
logger_default
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VT4PDUYT.js";
|
|
5
5
|
|
|
6
6
|
// src/utils/color.ts
|
|
7
7
|
import { createHash } from "crypto";
|
|
@@ -41,6 +41,42 @@ function getColorPalette() {
|
|
|
41
41
|
// 15: Soft salmon
|
|
42
42
|
];
|
|
43
43
|
}
|
|
44
|
+
function getDarkColorPalette() {
|
|
45
|
+
return [
|
|
46
|
+
{ r: 30, g: 45, b: 85 },
|
|
47
|
+
// 0: Dark blue
|
|
48
|
+
{ r: 85, g: 30, b: 50 },
|
|
49
|
+
// 1: Dark rose
|
|
50
|
+
{ r: 30, g: 75, b: 40 },
|
|
51
|
+
// 2: Dark green
|
|
52
|
+
{ r: 75, g: 65, b: 30 },
|
|
53
|
+
// 3: Dark olive
|
|
54
|
+
{ r: 60, g: 35, b: 85 },
|
|
55
|
+
// 4: Dark lavender
|
|
56
|
+
{ r: 30, g: 65, b: 75 },
|
|
57
|
+
// 5: Dark cyan
|
|
58
|
+
{ r: 55, g: 55, b: 55 },
|
|
59
|
+
// 6: Dark grey
|
|
60
|
+
{ r: 85, g: 40, b: 40 },
|
|
61
|
+
// 7: Dark coral
|
|
62
|
+
{ r: 35, g: 80, b: 50 },
|
|
63
|
+
// 8: Dark mint
|
|
64
|
+
{ r: 70, g: 50, b: 30 },
|
|
65
|
+
// 9: Dark brown
|
|
66
|
+
{ r: 30, g: 75, b: 75 },
|
|
67
|
+
// 10: Dark aqua
|
|
68
|
+
{ r: 75, g: 30, b: 75 },
|
|
69
|
+
// 11: Dark magenta
|
|
70
|
+
{ r: 75, g: 75, b: 30 },
|
|
71
|
+
// 12: Dark yellow
|
|
72
|
+
{ r: 50, g: 35, b: 85 },
|
|
73
|
+
// 13: Dark violet
|
|
74
|
+
{ r: 30, g: 80, b: 65 },
|
|
75
|
+
// 14: Dark sea green
|
|
76
|
+
{ r: 85, g: 40, b: 30 }
|
|
77
|
+
// 15: Dark rust
|
|
78
|
+
];
|
|
79
|
+
}
|
|
44
80
|
function rgbToHex(r, g, b) {
|
|
45
81
|
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
|
|
46
82
|
throw new Error("RGB values must be between 0 and 255");
|
|
@@ -60,10 +96,10 @@ function hexToRgb(hex) {
|
|
|
60
96
|
const b = parseInt(cleanHex.slice(4, 6), 16);
|
|
61
97
|
return { r, g, b };
|
|
62
98
|
}
|
|
63
|
-
function generateColorFromBranchName(branchName) {
|
|
99
|
+
function generateColorFromBranchName(branchName, themeMode = "light") {
|
|
64
100
|
const hash = createHash("sha256").update(branchName).digest("hex");
|
|
65
101
|
const hashPrefix = hash.slice(0, 8);
|
|
66
|
-
const palette = getColorPalette();
|
|
102
|
+
const palette = themeMode === "dark" ? getDarkColorPalette() : getColorPalette();
|
|
67
103
|
const hashAsInt = parseInt(hashPrefix, 16);
|
|
68
104
|
const index = hashAsInt % palette.length;
|
|
69
105
|
logger_default.debug(`[generateColorFromBranchName] Branch name: ${branchName}, Hash: ${hash}, Hash prefix: ${hashPrefix}, Hash as int: ${hashAsInt}, Index: ${index}`);
|
|
@@ -84,9 +120,9 @@ function colorDistance(a, b) {
|
|
|
84
120
|
);
|
|
85
121
|
}
|
|
86
122
|
var MIN_COLOR_DISTANCE = 20;
|
|
87
|
-
function selectDistinctColor(branchName, usedHexColors) {
|
|
88
|
-
const palette = getColorPalette();
|
|
89
|
-
const hashBasedColor = generateColorFromBranchName(branchName);
|
|
123
|
+
function selectDistinctColor(branchName, usedHexColors, themeMode = "light") {
|
|
124
|
+
const palette = themeMode === "dark" ? getDarkColorPalette() : getColorPalette();
|
|
125
|
+
const hashBasedColor = generateColorFromBranchName(branchName, themeMode);
|
|
90
126
|
if (usedHexColors.length === 0) {
|
|
91
127
|
return hashBasedColor;
|
|
92
128
|
}
|
|
@@ -155,6 +191,7 @@ function calculateForegroundColor(rgb) {
|
|
|
155
191
|
|
|
156
192
|
export {
|
|
157
193
|
getColorPalette,
|
|
194
|
+
getDarkColorPalette,
|
|
158
195
|
rgbToHex,
|
|
159
196
|
hexToRgb,
|
|
160
197
|
generateColorFromBranchName,
|
|
@@ -165,4 +202,4 @@ export {
|
|
|
165
202
|
saturateColor,
|
|
166
203
|
calculateForegroundColor
|
|
167
204
|
};
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
205
|
+
//# sourceMappingURL=chunk-433MOLAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/color.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport logger from './logger'\nimport type { ThemeMode } from './terminal.js'\n\n/**\n * RGB color representation\n */\nexport interface RgbColor {\n\tr: number\n\tg: number\n\tb: number\n}\n\n/**\n * Complete color data with RGB, hex, and palette index\n */\nexport interface ColorData {\n\trgb: RgbColor\n\thex: string\n\tindex: number\n}\n\n/**\n * Get the predefined color palette (16 visually distinct colors)\n * Reduced from 40 colors to ensure minimum euclidean distance >= 30 between all pairs\n * This prevents near-identical colors being assigned to different looms\n *\n * @returns Array of 16 RGB colors\n */\nexport function getColorPalette(): RgbColor[] {\n\treturn [\n\t\t{ r: 220, g: 235, b: 255 }, // 0: Soft blue\n\t\t{ r: 255, g: 220, b: 235 }, // 1: Soft pink\n\t\t{ r: 220, g: 255, b: 235 }, // 2: Soft green\n\t\t{ r: 255, g: 245, b: 220 }, // 3: Soft cream\n\t\t{ r: 245, g: 220, b: 255 }, // 4: Soft lavender\n\t\t{ r: 220, g: 245, b: 255 }, // 5: Soft cyan\n\t\t{ r: 235, g: 235, b: 235 }, // 6: Soft grey\n\t\t{ r: 255, g: 230, b: 230 }, // 7: Soft coral\n\t\t{ r: 230, g: 255, b: 230 }, // 8: Soft mint\n\t\t{ r: 255, g: 245, b: 230 }, // 9: Soft peach\n\t\t{ r: 220, g: 255, b: 255 }, // 10: Soft aqua\n\t\t{ r: 255, g: 220, b: 255 }, // 11: Soft magenta\n\t\t{ r: 255, g: 255, b: 220 }, // 12: Soft yellow\n\t\t{ r: 235, g: 220, b: 255 }, // 13: Soft violet\n\t\t{ r: 220, g: 255, b: 245 }, // 14: Soft sea green\n\t\t{ r: 255, g: 235, b: 220 }, // 15: Soft salmon\n\t]\n}\n\n/**\n * Get the dark mode color palette (16 visually distinct colors)\n * These are dark, muted colors that provide good contrast\n * with light terminal text on dark backgrounds\n *\n * RGB values are in the ~25-85 range for subtle dark backgrounds\n * with enough variation for visual distinctness\n *\n * @returns Array of 16 RGB colors optimized for dark terminal themes\n */\nexport function getDarkColorPalette(): RgbColor[] {\n\treturn [\n\t\t{ r: 30, g: 45, b: 85 }, // 0: Dark blue\n\t\t{ r: 85, g: 30, b: 50 }, // 1: Dark rose\n\t\t{ r: 30, g: 75, b: 40 }, // 2: Dark green\n\t\t{ r: 75, g: 65, b: 30 }, // 3: Dark olive\n\t\t{ r: 60, g: 35, b: 85 }, // 4: Dark lavender\n\t\t{ r: 30, g: 65, b: 75 }, // 5: Dark cyan\n\t\t{ r: 55, g: 55, b: 55 }, // 6: Dark grey\n\t\t{ r: 85, g: 40, b: 40 }, // 7: Dark coral\n\t\t{ r: 35, g: 80, b: 50 }, // 8: Dark mint\n\t\t{ r: 70, g: 50, b: 30 }, // 9: Dark brown\n\t\t{ r: 30, g: 75, b: 75 }, // 10: Dark aqua\n\t\t{ r: 75, g: 30, b: 75 }, // 11: Dark magenta\n\t\t{ r: 75, g: 75, b: 30 }, // 12: Dark yellow\n\t\t{ r: 50, g: 35, b: 85 }, // 13: Dark violet\n\t\t{ r: 30, g: 80, b: 65 }, // 14: Dark sea green\n\t\t{ r: 85, g: 40, b: 30 }, // 15: Dark rust\n\t]\n}\n\n/**\n * Convert RGB values to hex color format\n *\n * @param r - Red value (0-255)\n * @param g - Green value (0-255)\n * @param b - Blue value (0-255)\n * @returns Hex color string (e.g., \"#dcebf8\")\n * @throws Error if RGB values are out of range\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n\t// Validate RGB values\n\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {\n\t\tthrow new Error('RGB values must be between 0 and 255')\n\t}\n\n\t// Convert to hex and pad with zeros\n\tconst rHex = r.toString(16).padStart(2, '0')\n\tconst gHex = g.toString(16).padStart(2, '0')\n\tconst bHex = b.toString(16).padStart(2, '0')\n\n\treturn `#${rHex}${gHex}${bHex}`\n}\n\n/**\n * Convert hex color format to RGB values\n *\n * @param hex - Hex color string (with or without # prefix)\n * @returns RGB color object\n * @throws Error if hex format is invalid\n */\nexport function hexToRgb(hex: string): RgbColor {\n\t// Remove # prefix if present\n\tconst cleanHex = hex.startsWith('#') ? hex.slice(1) : hex\n\n\t// Validate format (must be exactly 6 hex characters)\n\tif (cleanHex.length !== 6 || !/^[0-9a-fA-F]{6}$/.test(cleanHex)) {\n\t\tthrow new Error('Invalid hex color format. Expected format: #RRGGBB or RRGGBB')\n\t}\n\n\t// Parse hex values\n\tconst r = parseInt(cleanHex.slice(0, 2), 16)\n\tconst g = parseInt(cleanHex.slice(2, 4), 16)\n\tconst b = parseInt(cleanHex.slice(4, 6), 16)\n\n\treturn { r, g, b }\n}\n\n/**\n * Generate deterministic color from branch name using SHA256 hash\n * Matches the bash implementation in bash/new-branch-workflow.sh\n *\n * @param branchName - Branch name to generate color from\n * @param themeMode - Theme mode for palette selection ('light' or 'dark')\n * @returns ColorData with RGB, hex, and palette index\n */\nexport function generateColorFromBranchName(\n\tbranchName: string,\n\tthemeMode: ThemeMode = 'light'\n): ColorData {\n\t// Generate SHA256 hash of branch name\n\tconst hash = createHash('sha256').update(branchName).digest('hex')\n\n\t// Take first 8 hex characters and convert to index (0-39)\n\t// Matches bash: local index=$(( 0x$hash % ${#colors[@]} ))\n\tconst hashPrefix = hash.slice(0, 8)\n\tconst palette = themeMode === 'dark' ? getDarkColorPalette() : getColorPalette()\n\tconst hashAsInt = parseInt(hashPrefix, 16)\n\tconst index = hashAsInt % palette.length\n\tlogger.debug(`[generateColorFromBranchName] Branch name: ${branchName}, Hash: ${hash}, Hash prefix: ${hashPrefix}, Hash as int: ${hashAsInt}, Index: ${index}`)\n\n\t// Get color from palette\n\tconst rgb = palette[index]\n\n\t// This should never happen as index is always in range [0, palette.length)\n\tif (!rgb) {\n\t\tthrow new Error(`Invalid color index: ${index}`)\n\t}\n\n\t// Convert to hex format\n\tconst hex = rgbToHex(rgb.r, rgb.g, rgb.b)\n\n\treturn {\n\t\trgb,\n\t\thex,\n\t\tindex,\n\t}\n}\n\n/**\n * Calculate euclidean distance between two RGB colors\n */\nexport function colorDistance(a: RgbColor, b: RgbColor): number {\n\treturn Math.sqrt(\n\t\tMath.pow(a.r - b.r, 2) +\n\t\tMath.pow(a.g - b.g, 2) +\n\t\tMath.pow(a.b - b.b, 2)\n\t)\n}\n\n/**\n * Minimum distance threshold for colors to be considered \"distinct\"\n * Note: With RGB constrained to 220-255 range (subtle backgrounds),\n * the maximum possible distance between any two colors is ~60.6\n * A threshold of 20 ensures colors are visually distinguishable\n * (vs the original palette minimum of 3.61) while allowing enough\n * palette diversity for typical concurrent loom counts (5-10).\n */\nexport const MIN_COLOR_DISTANCE = 20\n\n/**\n * Select a color for a branch, avoiding colors that are too similar to hex colors in use\n * This function is robust against palette changes since it compares hex colors directly.\n *\n * @param branchName - Branch name to generate base color from\n * @param usedHexColors - Array of hex colors (e.g., \"#dcebff\") already in use by active looms\n * @param themeMode - Theme mode for palette selection ('light' for light pastels, 'dark' for darker colors)\n * @returns ColorData with the selected color\n */\nexport function selectDistinctColor(\n\tbranchName: string,\n\tusedHexColors: string[],\n\tthemeMode: ThemeMode = 'light'\n): ColorData {\n\tconst palette = themeMode === 'dark' ? getDarkColorPalette() : getColorPalette()\n\tconst hashBasedColor = generateColorFromBranchName(branchName, themeMode)\n\n\t// If no colors in use, return hash-based selection\n\tif (usedHexColors.length === 0) {\n\t\treturn hashBasedColor\n\t}\n\n\t// Convert used hex colors to RGB for distance calculation\n\tconst usedRgbColors: RgbColor[] = []\n\tfor (const hex of usedHexColors) {\n\t\ttry {\n\t\t\tusedRgbColors.push(hexToRgb(hex))\n\t\t} catch {\n\t\t\t// Skip invalid hex colors\n\t\t\tlogger.debug(`[selectDistinctColor] Skipping invalid hex color: ${hex}`)\n\t\t}\n\t}\n\n\t// If all hex colors were invalid, return hash-based selection\n\tif (usedRgbColors.length === 0) {\n\t\treturn hashBasedColor\n\t}\n\n\t// Check if hash-based color is distinct enough from all used colors\n\tconst isTooSimilar = usedRgbColors.some(usedRgb =>\n\t\tcolorDistance(hashBasedColor.rgb, usedRgb) < MIN_COLOR_DISTANCE\n\t)\n\n\tif (!isTooSimilar) {\n\t\treturn hashBasedColor\n\t}\n\n\t// Find the first available color that's distinct from all used colors\n\tfor (let i = 0; i < palette.length; i++) {\n\t\tconst candidateRgb = palette[i]\n\t\tif (!candidateRgb) continue\n\n\t\tconst isDistinct = usedRgbColors.every(usedRgb =>\n\t\t\tcolorDistance(candidateRgb, usedRgb) >= MIN_COLOR_DISTANCE\n\t\t)\n\n\t\tif (isDistinct) {\n\t\t\treturn {\n\t\t\t\trgb: candidateRgb,\n\t\t\t\thex: rgbToHex(candidateRgb.r, candidateRgb.g, candidateRgb.b),\n\t\t\t\tindex: i,\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fallback: all colors too similar, return hash-based (best effort)\n\tlogger.debug(`[selectDistinctColor] No distinct color found, falling back to hash-based for ${branchName}`)\n\treturn hashBasedColor\n}\n\n/**\n * Lighten a color by a given amount\n * Useful for creating slightly lighter variants for hover states\n *\n * @param rgb - RGB color to lighten\n * @param amount - Amount to lighten (0-1, where 0.1 = 10% lighter)\n * @returns Lightened RGB color\n */\nexport function lightenColor(rgb: RgbColor, amount: number): RgbColor {\n\tconst clamp = (value: number): number => Math.min(255, Math.max(0, Math.round(value)))\n\n\treturn {\n\t\tr: clamp(rgb.r + (255 - rgb.r) * amount),\n\t\tg: clamp(rgb.g + (255 - rgb.g) * amount),\n\t\tb: clamp(rgb.b + (255 - rgb.b) * amount),\n\t}\n}\n\n/**\n * Saturate a color by pushing it away from grey towards its dominant hue\n * Makes subtle colors more vivid while maintaining their hue\n *\n * @param rgb - RGB color to saturate\n * @param amount - Amount to saturate (0-1, where 0.4 = 40% more saturated)\n * @returns Saturated RGB color\n */\nexport function saturateColor(rgb: RgbColor, amount: number): RgbColor {\n\tconst clamp = (value: number): number => Math.min(255, Math.max(0, Math.round(value)))\n\n\t// Calculate average (grey point)\n\tconst avg = (rgb.r + rgb.g + rgb.b) / 3\n\n\t// Push each channel away from grey\n\treturn {\n\t\tr: clamp(rgb.r + (rgb.r - avg) * amount),\n\t\tg: clamp(rgb.g + (rgb.g - avg) * amount),\n\t\tb: clamp(rgb.b + (rgb.b - avg) * amount),\n\t}\n}\n\n/**\n * Calculate appropriate foreground color (black or white) for a given background\n * Uses relative luminance formula from WCAG 2.0\n *\n * @param rgb - Background RGB color\n * @returns '#000000' for light backgrounds, '#ffffff' for dark backgrounds\n */\nexport function calculateForegroundColor(rgb: RgbColor): string {\n\t// Convert RGB to relative luminance (WCAG 2.0 formula)\n\tconst toLinear = (channel: number): number => {\n\t\tconst c = channel / 255\n\t\treturn c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n\t}\n\n\tconst r = toLinear(rgb.r)\n\tconst g = toLinear(rgb.g)\n\tconst b = toLinear(rgb.b)\n\n\tconst luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b\n\n\t// Use black text for light backgrounds (luminance > 0.5)\n\t// Use white text for dark backgrounds\n\treturn luminance > 0.5 ? '#000000' : '#ffffff'\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SettingsManager
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IDUICCZY.js";
|
|
5
5
|
import {
|
|
6
6
|
MetadataManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CFUWQHCJ.js";
|
|
8
8
|
import {
|
|
9
9
|
logger
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-VT4PDUYT.js";
|
|
11
11
|
|
|
12
12
|
// src/utils/git.ts
|
|
13
13
|
import path from "path";
|
|
@@ -358,7 +358,7 @@ async function getDefaultBranch(path2 = process.cwd()) {
|
|
|
358
358
|
}
|
|
359
359
|
async function findAllBranchesForIssue(issueNumber, path2 = process.cwd(), settingsManager) {
|
|
360
360
|
if (!settingsManager) {
|
|
361
|
-
const { SettingsManager: SM } = await import("./SettingsManager-
|
|
361
|
+
const { SettingsManager: SM } = await import("./SettingsManager-CNYBGXDT.js");
|
|
362
362
|
settingsManager = new SM();
|
|
363
363
|
}
|
|
364
364
|
const protectedBranches = await settingsManager.getProtectedBranches(path2);
|
|
@@ -703,4 +703,4 @@ export {
|
|
|
703
703
|
removePlaceholderCommitFromHead,
|
|
704
704
|
removePlaceholderCommitFromHistory
|
|
705
705
|
};
|
|
706
|
-
//# sourceMappingURL=chunk-
|
|
706
|
+
//# sourceMappingURL=chunk-53OMUNUN.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
logger
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VT4PDUYT.js";
|
|
5
5
|
|
|
6
6
|
// src/utils/installation-detector.ts
|
|
7
7
|
import { dirname, join } from "path";
|
|
@@ -72,4 +72,4 @@ export {
|
|
|
72
72
|
detectInstallationMethod,
|
|
73
73
|
shouldShowUpdateNotification
|
|
74
74
|
};
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
75
|
+
//# sourceMappingURL=chunk-5F6IWWRS.js.map
|
|
@@ -6,17 +6,17 @@ import {
|
|
|
6
6
|
getConfiguredRepoFromSettings,
|
|
7
7
|
getEffectivePRTargetRemote,
|
|
8
8
|
parseGitRemotes
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-FXDYIV3K.js";
|
|
10
10
|
import {
|
|
11
11
|
executeGhCommand
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-LT3SGBR7.js";
|
|
13
13
|
import {
|
|
14
14
|
detectClaudeCli,
|
|
15
15
|
launchClaude
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-AEIMYF4P.js";
|
|
17
17
|
import {
|
|
18
18
|
getLogger
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
20
20
|
|
|
21
21
|
// src/lib/PRManager.ts
|
|
22
22
|
var PRManager = class {
|
|
@@ -344,4 +344,4 @@ Then retry: il start`
|
|
|
344
344
|
export {
|
|
345
345
|
PRManager
|
|
346
346
|
};
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
347
|
+
//# sourceMappingURL=chunk-5IWU3HXE.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getLogger
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/BranchNamingService.ts
|
|
7
7
|
var SimpleBranchNameStrategy = class {
|
|
@@ -15,7 +15,7 @@ var ClaudeBranchNameStrategy = class {
|
|
|
15
15
|
this.claudeModel = claudeModel;
|
|
16
16
|
}
|
|
17
17
|
async generate(issueNumber, title) {
|
|
18
|
-
const { generateBranchName } = await import("./claude-
|
|
18
|
+
const { generateBranchName } = await import("./claude-H33OQMXO.js");
|
|
19
19
|
return generateBranchName(title, issueNumber, this.claudeModel);
|
|
20
20
|
}
|
|
21
21
|
};
|
|
@@ -52,4 +52,4 @@ export {
|
|
|
52
52
|
ClaudeBranchNameStrategy,
|
|
53
53
|
DefaultBranchNamingService
|
|
54
54
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-5TXLVEXT.js.map
|
|
@@ -4,22 +4,22 @@ import {
|
|
|
4
4
|
createLinearIssue,
|
|
5
5
|
fetchLinearIssue,
|
|
6
6
|
updateLinearIssueState
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7Q66W4OH.js";
|
|
8
8
|
import {
|
|
9
9
|
GitHubService
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3PT7RKL5.js";
|
|
11
11
|
import {
|
|
12
12
|
getRepoInfo
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-LT3SGBR7.js";
|
|
14
14
|
import {
|
|
15
15
|
promptConfirmation
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ZX3GTM7O.js";
|
|
17
17
|
import {
|
|
18
18
|
getLogger
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-6MLEBAYZ.js";
|
|
20
20
|
import {
|
|
21
21
|
logger
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-VT4PDUYT.js";
|
|
23
23
|
|
|
24
24
|
// src/lib/LinearService.ts
|
|
25
25
|
var LinearService = class {
|
|
@@ -29,6 +29,9 @@ var LinearService = class {
|
|
|
29
29
|
this.supportsPullRequests = false;
|
|
30
30
|
this.config = config ?? {};
|
|
31
31
|
this.prompter = (options == null ? void 0 : options.prompter) ?? promptConfirmation;
|
|
32
|
+
if (this.config.apiToken) {
|
|
33
|
+
process.env.LINEAR_API_TOKEN = this.config.apiToken;
|
|
34
|
+
}
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
37
|
* Detect if input matches Linear identifier format (TEAM-NUMBER)
|
|
@@ -198,6 +201,9 @@ var IssueTrackerFactory = class {
|
|
|
198
201
|
if (linearSettings == null ? void 0 : linearSettings.branchFormat) {
|
|
199
202
|
linearConfig.branchFormat = linearSettings.branchFormat;
|
|
200
203
|
}
|
|
204
|
+
if (linearSettings == null ? void 0 : linearSettings.apiToken) {
|
|
205
|
+
linearConfig.apiToken = linearSettings.apiToken;
|
|
206
|
+
}
|
|
201
207
|
getLogger().debug(`IssueTrackerFactory: Creating LinearService with config:`, JSON.stringify(linearConfig, null, 2));
|
|
202
208
|
return new LinearService(linearConfig);
|
|
203
209
|
}
|
|
@@ -510,4 +516,4 @@ export {
|
|
|
510
516
|
generateIssueManagementMcpConfig,
|
|
511
517
|
generateRecapMcpConfig
|
|
512
518
|
};
|
|
513
|
-
//# sourceMappingURL=chunk-
|
|
519
|
+
//# sourceMappingURL=chunk-66BMJ25W.js.map
|