@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.
Files changed (172) hide show
  1. package/dist/{BranchNamingService-GCCWB3LK.js → BranchNamingService-B5PVRR7F.js} +4 -4
  2. package/dist/ClaudeContextManager-PQ46VILL.js +14 -0
  3. package/dist/ClaudeService-6OMO552H.js +13 -0
  4. package/dist/GitHubService-S2OGUTDR.js +12 -0
  5. package/dist/{LoomLauncher-4UG2E4CD.js → LoomLauncher-ZHDTPKED.js} +15 -79
  6. package/dist/LoomLauncher-ZHDTPKED.js.map +1 -0
  7. package/dist/MetadataManager-DFI73J3G.js +10 -0
  8. package/dist/PRManager-OCSB2HPT.js +14 -0
  9. package/dist/PromptTemplateManager-5GNF7FCP.js +9 -0
  10. package/dist/{SettingsManager-XPR4TEQL.js → SettingsManager-CNYBGXDT.js} +3 -3
  11. package/dist/SettingsMigrationManager-KZKDG66H.js +10 -0
  12. package/dist/{chunk-OEGECBFS.js → chunk-3PT7RKL5.js} +4 -4
  13. package/dist/{chunk-WUQQNE63.js → chunk-433MOLAU.js} +44 -7
  14. package/dist/chunk-433MOLAU.js.map +1 -0
  15. package/dist/{chunk-LN4H3A6A.js → chunk-53OMUNUN.js} +5 -5
  16. package/dist/{chunk-THF25ICZ.js → chunk-5F6IWWRS.js} +2 -2
  17. package/dist/{chunk-P2ZQ5LKB.js → chunk-5IWU3HXE.js} +5 -5
  18. package/dist/{chunk-QIUJPPJQ.js → chunk-5TXLVEXT.js} +3 -3
  19. package/dist/{chunk-RFUOIUQF.js → chunk-66BMJ25W.js} +13 -7
  20. package/dist/chunk-66BMJ25W.js.map +1 -0
  21. package/dist/{chunk-6UIGZD2N.js → chunk-6MLEBAYZ.js} +2 -2
  22. package/dist/{chunk-VTXCGKV5.js → chunk-7HIRPCKU.js} +14 -6
  23. package/dist/chunk-7HIRPCKU.js.map +1 -0
  24. package/dist/{chunk-UNXRACJ7.js → chunk-7LSSNB7Y.js} +3 -3
  25. package/dist/{chunk-QHA67Q7A.js → chunk-7Q66W4OH.js} +2 -2
  26. package/dist/{chunk-RUC7OULH.js → chunk-AEIMYF4P.js} +6 -8
  27. package/dist/{chunk-RUC7OULH.js.map → chunk-AEIMYF4P.js.map} +1 -1
  28. package/dist/{chunk-MD6HA5IK.js → chunk-B2UO6EYE.js} +2 -2
  29. package/dist/{chunk-YZTDGPFB.js → chunk-CFUWQHCJ.js} +2 -2
  30. package/dist/{chunk-UYWAESOT.js → chunk-F2PWIRV4.js} +3 -3
  31. package/dist/{chunk-PSFVTBM7.js → chunk-FXDYIV3K.js} +2 -2
  32. package/dist/{chunk-CDQEK2WD.js → chunk-FXJKNVZW.js} +5 -5
  33. package/dist/{chunk-3CMGCRB5.js → chunk-HMMO2LDS.js} +3 -3
  34. package/dist/{chunk-OOU3DKNT.js → chunk-IDUICCZY.js} +2 -2
  35. package/dist/{chunk-HABINPX2.js → chunk-J7GHNTYK.js} +67 -11
  36. package/dist/chunk-J7GHNTYK.js.map +1 -0
  37. package/dist/{chunk-DKQ4SUII.js → chunk-K5G5SFWY.js} +2 -2
  38. package/dist/chunk-K5G5SFWY.js.map +1 -0
  39. package/dist/{chunk-KO2FOMHL.js → chunk-LT3SGBR7.js} +2 -2
  40. package/dist/{chunk-VBFDVGAE.js → chunk-LVLRMP7V.js} +2 -2
  41. package/dist/{chunk-RNZMHJK7.js → chunk-N4ZJVATC.js} +3 -3
  42. package/dist/chunk-NXMDEL3F.js +54 -0
  43. package/dist/chunk-NXMDEL3F.js.map +1 -0
  44. package/dist/chunk-O7VL5N6S.js +72 -0
  45. package/dist/chunk-O7VL5N6S.js.map +1 -0
  46. package/dist/{chunk-S65T4O6I.js → chunk-QPS6TZUW.js} +3 -3
  47. package/dist/{chunk-RJKMF6BC.js → chunk-SHVB3EFE.js} +3 -3
  48. package/dist/chunk-VT4PDUYT.js +578 -0
  49. package/dist/chunk-VT4PDUYT.js.map +1 -0
  50. package/dist/{chunk-4YTILIIH.js → chunk-VV66DH6T.js} +8 -8
  51. package/dist/{chunk-GVRO4PWE.js → chunk-XNNXAAZT.js} +6 -6
  52. package/dist/{chunk-AS2IRKLU.js → chunk-YU5HVI6B.js} +2 -2
  53. package/dist/{chunk-T5IIUG4Z.js → chunk-Z5BM4JWB.js} +25 -24
  54. package/dist/chunk-Z5BM4JWB.js.map +1 -0
  55. package/dist/{chunk-SJ2GZ6RF.js → chunk-ZX3GTM7O.js} +2 -2
  56. package/dist/{claude-ACVXNB6N.js → claude-H33OQMXO.js} +4 -6
  57. package/dist/{cleanup-MIDJVSIU.js → cleanup-Y5W3CNUV.js} +20 -22
  58. package/dist/{cleanup-MIDJVSIU.js.map → cleanup-Y5W3CNUV.js.map} +1 -1
  59. package/dist/cli.js +125 -81
  60. package/dist/cli.js.map +1 -1
  61. package/dist/{color-ZPIIUADB.js → color-4TJ4P5EY.js} +5 -3
  62. package/dist/{contribute-RS3DO3WP.js → contribute-K7UXBOML.js} +8 -8
  63. package/dist/{dev-server-ASH7HJVI.js → dev-server-HNBRWGCD.js} +11 -13
  64. package/dist/{dev-server-ASH7HJVI.js.map → dev-server-HNBRWGCD.js.map} +1 -1
  65. package/dist/{feedback-RVIGHBJG.js → feedback-567ZH2O7.js} +16 -14
  66. package/dist/{feedback-RVIGHBJG.js.map → feedback-567ZH2O7.js.map} +1 -1
  67. package/dist/{git-OQAPUPLP.js → git-OV6ADVO7.js} +6 -6
  68. package/dist/{ignite-XJALWFAT.js → ignite-3HB3ZBEW.js} +15 -17
  69. package/dist/{ignite-XJALWFAT.js.map → ignite-3HB3ZBEW.js.map} +1 -1
  70. package/dist/index.d.ts +54 -35
  71. package/dist/index.js +377 -276
  72. package/dist/index.js.map +1 -1
  73. package/dist/init-CMIRHFSR.js +19 -0
  74. package/dist/{installation-detector-6R6YOFVZ.js → installation-detector-VXZOCL6P.js} +3 -3
  75. package/dist/mcp/issue-management-server.js +62 -7
  76. package/dist/mcp/issue-management-server.js.map +1 -1
  77. package/dist/neon-helpers-3KBC4A3Y.js +11 -0
  78. package/dist/{open-KW4NTLXH.js → open-AXE225Z5.js} +11 -13
  79. package/dist/{open-KW4NTLXH.js.map → open-AXE225Z5.js.map} +1 -1
  80. package/dist/{projects-QEAEBAT2.js → projects-GVEMCN5R.js} +4 -4
  81. package/dist/{prompt-A7GGRHSY.js → prompt-3SAZYRUN.js} +3 -3
  82. package/dist/prompts/session-summary-prompt.txt +58 -4
  83. package/dist/{rebase-WZHHE5LU.js → rebase-6UIHMUWS.js} +9 -11
  84. package/dist/{rebase-WZHHE5LU.js.map → rebase-6UIHMUWS.js.map} +1 -1
  85. package/dist/{recap-33NPZ3ZO.js → recap-XTBNMEMO.js} +12 -19
  86. package/dist/recap-XTBNMEMO.js.map +1 -0
  87. package/dist/{remote-73TZ2ADI.js → remote-IJAMOEAP.js} +3 -3
  88. package/dist/{run-HRYQ7TR7.js → run-H375EYRB.js} +11 -13
  89. package/dist/{run-HRYQ7TR7.js.map → run-H375EYRB.js.map} +1 -1
  90. package/dist/{shell-JMU5XTHW.js → shell-33FJCWJQ.js} +9 -11
  91. package/dist/{shell-JMU5XTHW.js.map → shell-33FJCWJQ.js.map} +1 -1
  92. package/dist/{summary-4SSGGH7N.js → summary-JUMOCNLR.js} +14 -15
  93. package/dist/{summary-4SSGGH7N.js.map → summary-JUMOCNLR.js.map} +1 -1
  94. package/dist/{test-git-6SAIRBUD.js → test-git-CO3BA4BV.js} +6 -6
  95. package/dist/{test-prefix-RLVRK5ZD.js → test-prefix-HZYSDQYT.js} +6 -6
  96. package/dist/{test-tabs-3SCJWRKT.js → test-tabs-D3POYOJ5.js} +3 -6
  97. package/dist/{test-tabs-3SCJWRKT.js.map → test-tabs-D3POYOJ5.js.map} +1 -1
  98. package/dist/{test-webserver-VPNLAFZ3.js → test-webserver-YVQD42W6.js} +2 -2
  99. package/dist/{update-LETF5ASC.js → update-5NOHT4SG.js} +4 -4
  100. package/dist/{update-notifier-H55ZK7NU.js → update-notifier-ARA5SPUW.js} +3 -3
  101. package/package.json +1 -1
  102. package/dist/ClaudeContextManager-DQFKIMEP.js +0 -16
  103. package/dist/ClaudeService-CJS32WG2.js +0 -15
  104. package/dist/GitHubService-RPM27GWD.js +0 -12
  105. package/dist/LoomLauncher-4UG2E4CD.js.map +0 -1
  106. package/dist/MetadataManager-WXUVXKUS.js +0 -10
  107. package/dist/PRManager-7DSIMCAD.js +0 -16
  108. package/dist/PromptTemplateManager-72FEOGT6.js +0 -9
  109. package/dist/SettingsMigrationManager-EH3J2TCN.js +0 -10
  110. package/dist/chunk-DKQ4SUII.js.map +0 -1
  111. package/dist/chunk-HABINPX2.js.map +0 -1
  112. package/dist/chunk-RFUOIUQF.js.map +0 -1
  113. package/dist/chunk-T5IIUG4Z.js.map +0 -1
  114. package/dist/chunk-UYVWLISQ.js +0 -113
  115. package/dist/chunk-UYVWLISQ.js.map +0 -1
  116. package/dist/chunk-VAYGNQTE.js +0 -234
  117. package/dist/chunk-VAYGNQTE.js.map +0 -1
  118. package/dist/chunk-VTXCGKV5.js.map +0 -1
  119. package/dist/chunk-WUQQNE63.js.map +0 -1
  120. package/dist/chunk-Z5NXYJIG.js +0 -207
  121. package/dist/chunk-Z5NXYJIG.js.map +0 -1
  122. package/dist/init-F6PFMSU5.js +0 -21
  123. package/dist/neon-helpers-L5CXQ5CT.js +0 -11
  124. package/dist/recap-33NPZ3ZO.js.map +0 -1
  125. /package/dist/{BranchNamingService-GCCWB3LK.js.map → BranchNamingService-B5PVRR7F.js.map} +0 -0
  126. /package/dist/{ClaudeContextManager-DQFKIMEP.js.map → ClaudeContextManager-PQ46VILL.js.map} +0 -0
  127. /package/dist/{ClaudeService-CJS32WG2.js.map → ClaudeService-6OMO552H.js.map} +0 -0
  128. /package/dist/{GitHubService-RPM27GWD.js.map → GitHubService-S2OGUTDR.js.map} +0 -0
  129. /package/dist/{MetadataManager-WXUVXKUS.js.map → MetadataManager-DFI73J3G.js.map} +0 -0
  130. /package/dist/{PRManager-7DSIMCAD.js.map → PRManager-OCSB2HPT.js.map} +0 -0
  131. /package/dist/{PromptTemplateManager-72FEOGT6.js.map → PromptTemplateManager-5GNF7FCP.js.map} +0 -0
  132. /package/dist/{SettingsManager-XPR4TEQL.js.map → SettingsManager-CNYBGXDT.js.map} +0 -0
  133. /package/dist/{SettingsMigrationManager-EH3J2TCN.js.map → SettingsMigrationManager-KZKDG66H.js.map} +0 -0
  134. /package/dist/{chunk-OEGECBFS.js.map → chunk-3PT7RKL5.js.map} +0 -0
  135. /package/dist/{chunk-LN4H3A6A.js.map → chunk-53OMUNUN.js.map} +0 -0
  136. /package/dist/{chunk-THF25ICZ.js.map → chunk-5F6IWWRS.js.map} +0 -0
  137. /package/dist/{chunk-P2ZQ5LKB.js.map → chunk-5IWU3HXE.js.map} +0 -0
  138. /package/dist/{chunk-QIUJPPJQ.js.map → chunk-5TXLVEXT.js.map} +0 -0
  139. /package/dist/{chunk-6UIGZD2N.js.map → chunk-6MLEBAYZ.js.map} +0 -0
  140. /package/dist/{chunk-UNXRACJ7.js.map → chunk-7LSSNB7Y.js.map} +0 -0
  141. /package/dist/{chunk-QHA67Q7A.js.map → chunk-7Q66W4OH.js.map} +0 -0
  142. /package/dist/{chunk-MD6HA5IK.js.map → chunk-B2UO6EYE.js.map} +0 -0
  143. /package/dist/{chunk-YZTDGPFB.js.map → chunk-CFUWQHCJ.js.map} +0 -0
  144. /package/dist/{chunk-UYWAESOT.js.map → chunk-F2PWIRV4.js.map} +0 -0
  145. /package/dist/{chunk-PSFVTBM7.js.map → chunk-FXDYIV3K.js.map} +0 -0
  146. /package/dist/{chunk-CDQEK2WD.js.map → chunk-FXJKNVZW.js.map} +0 -0
  147. /package/dist/{chunk-3CMGCRB5.js.map → chunk-HMMO2LDS.js.map} +0 -0
  148. /package/dist/{chunk-OOU3DKNT.js.map → chunk-IDUICCZY.js.map} +0 -0
  149. /package/dist/{chunk-KO2FOMHL.js.map → chunk-LT3SGBR7.js.map} +0 -0
  150. /package/dist/{chunk-VBFDVGAE.js.map → chunk-LVLRMP7V.js.map} +0 -0
  151. /package/dist/{chunk-RNZMHJK7.js.map → chunk-N4ZJVATC.js.map} +0 -0
  152. /package/dist/{chunk-S65T4O6I.js.map → chunk-QPS6TZUW.js.map} +0 -0
  153. /package/dist/{chunk-RJKMF6BC.js.map → chunk-SHVB3EFE.js.map} +0 -0
  154. /package/dist/{chunk-4YTILIIH.js.map → chunk-VV66DH6T.js.map} +0 -0
  155. /package/dist/{chunk-GVRO4PWE.js.map → chunk-XNNXAAZT.js.map} +0 -0
  156. /package/dist/{chunk-AS2IRKLU.js.map → chunk-YU5HVI6B.js.map} +0 -0
  157. /package/dist/{chunk-SJ2GZ6RF.js.map → chunk-ZX3GTM7O.js.map} +0 -0
  158. /package/dist/{claude-ACVXNB6N.js.map → claude-H33OQMXO.js.map} +0 -0
  159. /package/dist/{color-ZPIIUADB.js.map → color-4TJ4P5EY.js.map} +0 -0
  160. /package/dist/{contribute-RS3DO3WP.js.map → contribute-K7UXBOML.js.map} +0 -0
  161. /package/dist/{git-OQAPUPLP.js.map → git-OV6ADVO7.js.map} +0 -0
  162. /package/dist/{init-F6PFMSU5.js.map → init-CMIRHFSR.js.map} +0 -0
  163. /package/dist/{installation-detector-6R6YOFVZ.js.map → installation-detector-VXZOCL6P.js.map} +0 -0
  164. /package/dist/{neon-helpers-L5CXQ5CT.js.map → neon-helpers-3KBC4A3Y.js.map} +0 -0
  165. /package/dist/{projects-QEAEBAT2.js.map → projects-GVEMCN5R.js.map} +0 -0
  166. /package/dist/{prompt-A7GGRHSY.js.map → prompt-3SAZYRUN.js.map} +0 -0
  167. /package/dist/{remote-73TZ2ADI.js.map → remote-IJAMOEAP.js.map} +0 -0
  168. /package/dist/{test-git-6SAIRBUD.js.map → test-git-CO3BA4BV.js.map} +0 -0
  169. /package/dist/{test-prefix-RLVRK5ZD.js.map → test-prefix-HZYSDQYT.js.map} +0 -0
  170. /package/dist/{test-webserver-VPNLAFZ3.js.map → test-webserver-YVQD42W6.js.map} +0 -0
  171. /package/dist/{update-LETF5ASC.js.map → update-5NOHT4SG.js.map} +0 -0
  172. /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-QIUJPPJQ.js";
7
- import "./chunk-6UIGZD2N.js";
8
- import "./chunk-UYVWLISQ.js";
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-GCCWB3LK.js.map
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-S65T4O6I.js";
5
- import "./chunk-CDQEK2WD.js";
6
- import "./chunk-DKQ4SUII.js";
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-OOU3DKNT.js";
13
+ import "./chunk-IDUICCZY.js";
11
14
  import {
12
15
  generateColorFromBranchName,
13
16
  hexToRgb
14
- } from "./chunk-WUQQNE63.js";
15
- import "./chunk-RUC7OULH.js";
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-6UIGZD2N.js";
21
+ } from "./chunk-6MLEBAYZ.js";
26
22
  import {
27
- logger
28
- } from "./chunk-UYVWLISQ.js";
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-4UG2E4CD.js.map
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":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ MetadataManager
4
+ } from "./chunk-CFUWQHCJ.js";
5
+ import "./chunk-6MLEBAYZ.js";
6
+ import "./chunk-VT4PDUYT.js";
7
+ export {
8
+ MetadataManager
9
+ };
10
+ //# sourceMappingURL=MetadataManager-DFI73J3G.js.map
@@ -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
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ PromptTemplateManager
4
+ } from "./chunk-K5G5SFWY.js";
5
+ import "./chunk-VT4PDUYT.js";
6
+ export {
7
+ PromptTemplateManager
8
+ };
9
+ //# sourceMappingURL=PromptTemplateManager-5GNF7FCP.js.map
@@ -14,8 +14,8 @@ import {
14
14
  WorkflowPermissionSchemaNoDefaults,
15
15
  WorkflowsSettingsSchema,
16
16
  WorkflowsSettingsSchemaNoDefaults
17
- } from "./chunk-OOU3DKNT.js";
18
- import "./chunk-UYVWLISQ.js";
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-XPR4TEQL.js.map
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-KO2FOMHL.js";
12
+ } from "./chunk-LT3SGBR7.js";
13
13
  import {
14
14
  promptConfirmation
15
- } from "./chunk-SJ2GZ6RF.js";
15
+ } from "./chunk-ZX3GTM7O.js";
16
16
  import {
17
17
  getLogger
18
- } from "./chunk-6UIGZD2N.js";
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-OEGECBFS.js.map
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-UYVWLISQ.js";
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-WUQQNE63.js.map
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-OOU3DKNT.js";
4
+ } from "./chunk-IDUICCZY.js";
5
5
  import {
6
6
  MetadataManager
7
- } from "./chunk-YZTDGPFB.js";
7
+ } from "./chunk-CFUWQHCJ.js";
8
8
  import {
9
9
  logger
10
- } from "./chunk-UYVWLISQ.js";
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-XPR4TEQL.js");
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-LN4H3A6A.js.map
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-UYVWLISQ.js";
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-THF25ICZ.js.map
75
+ //# sourceMappingURL=chunk-5F6IWWRS.js.map
@@ -6,17 +6,17 @@ import {
6
6
  getConfiguredRepoFromSettings,
7
7
  getEffectivePRTargetRemote,
8
8
  parseGitRemotes
9
- } from "./chunk-PSFVTBM7.js";
9
+ } from "./chunk-FXDYIV3K.js";
10
10
  import {
11
11
  executeGhCommand
12
- } from "./chunk-KO2FOMHL.js";
12
+ } from "./chunk-LT3SGBR7.js";
13
13
  import {
14
14
  detectClaudeCli,
15
15
  launchClaude
16
- } from "./chunk-RUC7OULH.js";
16
+ } from "./chunk-AEIMYF4P.js";
17
17
  import {
18
18
  getLogger
19
- } from "./chunk-6UIGZD2N.js";
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-P2ZQ5LKB.js.map
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-6UIGZD2N.js";
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-ACVXNB6N.js");
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-QIUJPPJQ.js.map
55
+ //# sourceMappingURL=chunk-5TXLVEXT.js.map
@@ -4,22 +4,22 @@ import {
4
4
  createLinearIssue,
5
5
  fetchLinearIssue,
6
6
  updateLinearIssueState
7
- } from "./chunk-QHA67Q7A.js";
7
+ } from "./chunk-7Q66W4OH.js";
8
8
  import {
9
9
  GitHubService
10
- } from "./chunk-OEGECBFS.js";
10
+ } from "./chunk-3PT7RKL5.js";
11
11
  import {
12
12
  getRepoInfo
13
- } from "./chunk-KO2FOMHL.js";
13
+ } from "./chunk-LT3SGBR7.js";
14
14
  import {
15
15
  promptConfirmation
16
- } from "./chunk-SJ2GZ6RF.js";
16
+ } from "./chunk-ZX3GTM7O.js";
17
17
  import {
18
18
  getLogger
19
- } from "./chunk-6UIGZD2N.js";
19
+ } from "./chunk-6MLEBAYZ.js";
20
20
  import {
21
21
  logger
22
- } from "./chunk-UYVWLISQ.js";
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-RFUOIUQF.js.map
519
+ //# sourceMappingURL=chunk-66BMJ25W.js.map