@iloom/cli 0.1.19 → 0.2.0

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 (97) hide show
  1. package/README.md +16 -0
  2. package/dist/ClaudeContextManager-LVCYRM6Q.js +13 -0
  3. package/dist/ClaudeService-WVTWB3DK.js +12 -0
  4. package/dist/{GitHubService-LWP4GKGH.js → GitHubService-7E2S5NNZ.js} +3 -3
  5. package/dist/{LoomLauncher-UMMLPIZO.js → LoomLauncher-CTSWJL35.js} +6 -6
  6. package/dist/README.md +16 -0
  7. package/dist/{SettingsManager-SKLUVE3K.js → SettingsManager-XOYCLH3D.js} +2 -2
  8. package/dist/{add-issue-X56V3XPB.js → add-issue-OBI325W7.js} +7 -7
  9. package/dist/{chunk-DEPYQRRB.js → chunk-2PLUQT6J.js} +2 -2
  10. package/dist/{chunk-VVH3ANF2.js → chunk-4IV6W4U5.js} +4 -4
  11. package/dist/{chunk-PV3GAXQO.js → chunk-6LEQW46Y.js} +2 -2
  12. package/dist/{chunk-VCMMAFXQ.js → chunk-CVLAZRNB.js} +2 -2
  13. package/dist/{chunk-FXV24OYZ.js → chunk-DJUGYNQE.js} +9 -2
  14. package/dist/{chunk-FXV24OYZ.js.map → chunk-DJUGYNQE.js.map} +1 -1
  15. package/dist/{chunk-KOCQAD2E.js → chunk-HBVFXN7R.js} +3 -3
  16. package/dist/{chunk-ELFT36PV.js → chunk-LHP6ROUM.js} +3 -3
  17. package/dist/{chunk-PXZBAC2M.js → chunk-MFU53H6J.js} +2 -2
  18. package/dist/{chunk-PR7FKQBG.js → chunk-RF2YI2XJ.js} +2 -2
  19. package/dist/{chunk-JXQXSC45.js → chunk-SWCRXDZC.js} +2 -2
  20. package/dist/{chunk-Q2KYPAH2.js → chunk-SYOSCMIT.js} +6 -6
  21. package/dist/{chunk-VYQLLHZ7.js → chunk-T3KEIB4D.js} +6 -2
  22. package/dist/{chunk-VYQLLHZ7.js.map → chunk-T3KEIB4D.js.map} +1 -1
  23. package/dist/{chunk-ZWXJBSUW.js → chunk-TS6DL67T.js} +2 -2
  24. package/dist/{chunk-IO4WFTL2.js → chunk-VETG35MF.js} +2 -2
  25. package/dist/{chunk-RSRO7564.js → chunk-ZE74H5BR.js} +28 -3
  26. package/dist/chunk-ZE74H5BR.js.map +1 -0
  27. package/dist/{claude-7LUVDZZ4.js → claude-ZIWDG4XG.js} +2 -2
  28. package/dist/{cleanup-ZHROIBSQ.js → cleanup-FEIVZSIV.js} +5 -5
  29. package/dist/cli.js +29 -29
  30. package/dist/cli.js.map +1 -1
  31. package/dist/{contribute-3MQJ3XAQ.js → contribute-EMZKCAC6.js} +6 -3
  32. package/dist/{contribute-3MQJ3XAQ.js.map → contribute-EMZKCAC6.js.map} +1 -1
  33. package/dist/{enhance-VGWUX474.js → enhance-MNA4ZGXW.js} +7 -7
  34. package/dist/{feedback-ZOUCCHN4.js → feedback-LFNMQBAZ.js} +6 -6
  35. package/dist/{finish-QJSK6Z7J.js → finish-TX5CJICB.js} +411 -17
  36. package/dist/finish-TX5CJICB.js.map +1 -0
  37. package/dist/{git-OUYMVYJX.js → git-WC6HZLOT.js} +2 -2
  38. package/dist/{ignite-HICLZEYU.js → ignite-MQWVJEAB.js} +7 -7
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.js +32 -3
  41. package/dist/index.js.map +1 -1
  42. package/dist/{init-UMKNHNV5.js → init-GJDYN2IK.js} +6 -6
  43. package/dist/mcp/{claude-YHHHLSXH.js → claude-NDFOCQQQ.js} +2 -2
  44. package/dist/mcp/{terminal-SDCMDVD7.js → terminal-OMNRFWB3.js} +28 -3
  45. package/dist/mcp/terminal-OMNRFWB3.js.map +1 -0
  46. package/dist/{open-ETZUFSE4.js → open-NXSN7XOC.js} +4 -4
  47. package/dist/prompts/init-prompt.txt +29 -0
  48. package/dist/{rebase-KBWFDZCN.js → rebase-DUNFOJVS.js} +6 -6
  49. package/dist/{remote-GJEZWRCC.js → remote-ZCXJVVNW.js} +4 -2
  50. package/dist/{run-4SVQ3WEU.js → run-O7ZK7CKA.js} +4 -4
  51. package/dist/schema/settings.schema.json +18 -0
  52. package/dist/{start-CT2ZEFP2.js → start-73I5W7WW.js} +15 -15
  53. package/dist/{terminal-3D6TUAKJ.js → terminal-BIRBZ4AZ.js} +2 -2
  54. package/dist/{test-git-MKZATGZN.js → test-git-T76HOTIA.js} +3 -3
  55. package/dist/{test-prefix-ZNLWDI3K.js → test-prefix-6HJUVQMH.js} +3 -3
  56. package/dist/{test-tabs-JRKY3QMM.js → test-tabs-RXDBZ6J7.js} +2 -2
  57. package/package.json +1 -1
  58. package/dist/ClaudeContextManager-JKR4WGNU.js +0 -13
  59. package/dist/ClaudeService-55DQGB7T.js +0 -12
  60. package/dist/chunk-RSRO7564.js.map +0 -1
  61. package/dist/finish-QJSK6Z7J.js.map +0 -1
  62. package/dist/mcp/terminal-SDCMDVD7.js.map +0 -1
  63. /package/dist/{ClaudeContextManager-JKR4WGNU.js.map → ClaudeContextManager-LVCYRM6Q.js.map} +0 -0
  64. /package/dist/{ClaudeService-55DQGB7T.js.map → ClaudeService-WVTWB3DK.js.map} +0 -0
  65. /package/dist/{GitHubService-LWP4GKGH.js.map → GitHubService-7E2S5NNZ.js.map} +0 -0
  66. /package/dist/{LoomLauncher-UMMLPIZO.js.map → LoomLauncher-CTSWJL35.js.map} +0 -0
  67. /package/dist/{SettingsManager-SKLUVE3K.js.map → SettingsManager-XOYCLH3D.js.map} +0 -0
  68. /package/dist/{add-issue-X56V3XPB.js.map → add-issue-OBI325W7.js.map} +0 -0
  69. /package/dist/{chunk-DEPYQRRB.js.map → chunk-2PLUQT6J.js.map} +0 -0
  70. /package/dist/{chunk-VVH3ANF2.js.map → chunk-4IV6W4U5.js.map} +0 -0
  71. /package/dist/{chunk-PV3GAXQO.js.map → chunk-6LEQW46Y.js.map} +0 -0
  72. /package/dist/{chunk-VCMMAFXQ.js.map → chunk-CVLAZRNB.js.map} +0 -0
  73. /package/dist/{chunk-KOCQAD2E.js.map → chunk-HBVFXN7R.js.map} +0 -0
  74. /package/dist/{chunk-ELFT36PV.js.map → chunk-LHP6ROUM.js.map} +0 -0
  75. /package/dist/{chunk-PXZBAC2M.js.map → chunk-MFU53H6J.js.map} +0 -0
  76. /package/dist/{chunk-PR7FKQBG.js.map → chunk-RF2YI2XJ.js.map} +0 -0
  77. /package/dist/{chunk-JXQXSC45.js.map → chunk-SWCRXDZC.js.map} +0 -0
  78. /package/dist/{chunk-Q2KYPAH2.js.map → chunk-SYOSCMIT.js.map} +0 -0
  79. /package/dist/{chunk-ZWXJBSUW.js.map → chunk-TS6DL67T.js.map} +0 -0
  80. /package/dist/{chunk-IO4WFTL2.js.map → chunk-VETG35MF.js.map} +0 -0
  81. /package/dist/{claude-7LUVDZZ4.js.map → claude-ZIWDG4XG.js.map} +0 -0
  82. /package/dist/{cleanup-ZHROIBSQ.js.map → cleanup-FEIVZSIV.js.map} +0 -0
  83. /package/dist/{enhance-VGWUX474.js.map → enhance-MNA4ZGXW.js.map} +0 -0
  84. /package/dist/{feedback-ZOUCCHN4.js.map → feedback-LFNMQBAZ.js.map} +0 -0
  85. /package/dist/{git-OUYMVYJX.js.map → git-WC6HZLOT.js.map} +0 -0
  86. /package/dist/{ignite-HICLZEYU.js.map → ignite-MQWVJEAB.js.map} +0 -0
  87. /package/dist/{init-UMKNHNV5.js.map → init-GJDYN2IK.js.map} +0 -0
  88. /package/dist/mcp/{claude-YHHHLSXH.js.map → claude-NDFOCQQQ.js.map} +0 -0
  89. /package/dist/{open-ETZUFSE4.js.map → open-NXSN7XOC.js.map} +0 -0
  90. /package/dist/{rebase-KBWFDZCN.js.map → rebase-DUNFOJVS.js.map} +0 -0
  91. /package/dist/{remote-GJEZWRCC.js.map → remote-ZCXJVVNW.js.map} +0 -0
  92. /package/dist/{run-4SVQ3WEU.js.map → run-O7ZK7CKA.js.map} +0 -0
  93. /package/dist/{start-CT2ZEFP2.js.map → start-73I5W7WW.js.map} +0 -0
  94. /package/dist/{terminal-3D6TUAKJ.js.map → terminal-BIRBZ4AZ.js.map} +0 -0
  95. /package/dist/{test-git-MKZATGZN.js.map → test-git-T76HOTIA.js.map} +0 -0
  96. /package/dist/{test-prefix-ZNLWDI3K.js.map → test-prefix-6HJUVQMH.js.map} +0 -0
  97. /package/dist/{test-tabs-JRKY3QMM.js.map → test-tabs-RXDBZ6J7.js.map} +0 -0
@@ -2,15 +2,15 @@
2
2
  import {
3
3
  detectClaudeCli,
4
4
  launchClaude
5
- } from "./chunk-PXZBAC2M.js";
5
+ } from "./chunk-MFU53H6J.js";
6
6
  import {
7
7
  PromptTemplateManager
8
8
  } from "./chunk-PVAVNJKS.js";
9
9
  import {
10
10
  ShellCompletion
11
- } from "./chunk-PV3GAXQO.js";
12
- import "./chunk-IO4WFTL2.js";
13
- import "./chunk-KOCQAD2E.js";
11
+ } from "./chunk-6LEQW46Y.js";
12
+ import "./chunk-VETG35MF.js";
13
+ import "./chunk-HBVFXN7R.js";
14
14
  import {
15
15
  logger
16
16
  } from "./chunk-GEHQXLEI.js";
@@ -258,7 +258,7 @@ var InitCommand = class {
258
258
  logger.debug("Unknown shell detected, skipping config read");
259
259
  }
260
260
  logger.debug("Detecting git remotes for GitHub configuration");
261
- const { parseGitRemotes } = await import("./remote-GJEZWRCC.js");
261
+ const { parseGitRemotes } = await import("./remote-ZCXJVVNW.js");
262
262
  const remotes = await parseGitRemotes();
263
263
  logger.debug("Git remotes detected", { count: remotes.length, remotes });
264
264
  let remotesInfo = "";
@@ -336,4 +336,4 @@ var InitCommand = class {
336
336
  export {
337
337
  InitCommand
338
338
  };
339
- //# sourceMappingURL=init-UMKNHNV5.js.map
339
+ //# sourceMappingURL=init-GJDYN2IK.js.map
@@ -161,7 +161,7 @@ async function launchClaudeInNewTerminalWindow(_prompt, options) {
161
161
  if (!workspacePath) {
162
162
  throw new Error("workspacePath is required for terminal window launch");
163
163
  }
164
- const { openTerminalWindow } = await import("./terminal-SDCMDVD7.js");
164
+ const { openTerminalWindow } = await import("./terminal-OMNRFWB3.js");
165
165
  const executable = executablePath ?? "iloom";
166
166
  let launchCommand = `${executable} spin`;
167
167
  if (oneShot !== "default") {
@@ -246,4 +246,4 @@ export {
246
246
  launchClaude,
247
247
  launchClaudeInNewTerminalWindow
248
248
  };
249
- //# sourceMappingURL=claude-YHHHLSXH.js.map
249
+ //# sourceMappingURL=claude-NDFOCQQQ.js.map
@@ -22,10 +22,13 @@ async function openTerminalWindow(options) {
22
22
  `Terminal window launching not yet supported on ${platform}. Currently only macOS is supported.`
23
23
  );
24
24
  }
25
- const applescript = buildAppleScript(options);
25
+ const hasITerm2 = await detectITerm2();
26
+ const applescript = hasITerm2 ? buildITerm2SingleTabScript(options) : buildAppleScript(options);
26
27
  try {
27
28
  await execa("osascript", ["-e", applescript]);
28
- await execa("osascript", ["-e", 'tell application "Terminal" to activate']);
29
+ if (!hasITerm2) {
30
+ await execa("osascript", ["-e", 'tell application "Terminal" to activate']);
31
+ }
29
32
  } catch (error) {
30
33
  throw new Error(
31
34
  `Failed to open terminal window: ${error instanceof Error ? error.message : "Unknown error"}`
@@ -74,6 +77,28 @@ function escapePathForAppleScript(path) {
74
77
  function escapeForAppleScript(command) {
75
78
  return command.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
76
79
  }
80
+ function buildITerm2SingleTabScript(options) {
81
+ const command = buildCommandSequence(options);
82
+ let script = 'tell application id "com.googlecode.iterm2"\n';
83
+ script += " create window with default profile\n";
84
+ script += " set s1 to current session of current window\n\n";
85
+ if (options.backgroundColor) {
86
+ const { r, g, b } = options.backgroundColor;
87
+ script += ` set background color of s1 to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}
88
+ `;
89
+ }
90
+ script += ` tell s1 to write text "${escapeForAppleScript(command)}"
91
+
92
+ `;
93
+ if (options.title) {
94
+ script += ` set name of s1 to "${escapeForAppleScript(options.title)}"
95
+
96
+ `;
97
+ }
98
+ script += " activate\n";
99
+ script += "end tell";
100
+ return script;
101
+ }
77
102
  function buildCommandSequence(options) {
78
103
  const {
79
104
  workspacePath,
@@ -199,4 +224,4 @@ export {
199
224
  openMultipleTerminalWindows,
200
225
  openTerminalWindow
201
226
  };
202
- //# sourceMappingURL=terminal-SDCMDVD7.js.map
227
+ //# sourceMappingURL=terminal-OMNRFWB3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/terminal.ts"],"sourcesContent":["import { execa } from 'execa'\nimport { existsSync } from 'node:fs'\nimport type { Platform } from '../types/index.js'\n\nexport interface TerminalWindowOptions {\n\tworkspacePath?: string\n\tcommand?: string\n\tbackgroundColor?: { r: number; g: number; b: number }\n\tport?: number\n\tincludeEnvSetup?: boolean // source .env\n\tincludePortExport?: boolean // export PORT=<port>\n\ttitle?: string // Terminal tab title\n}\n\n/**\n * Detect current platform\n */\nexport function detectPlatform(): Platform {\n\tconst platform = process.platform\n\tif (platform === 'darwin') return 'darwin'\n\tif (platform === 'linux') return 'linux'\n\tif (platform === 'win32') return 'win32'\n\treturn 'unsupported'\n}\n\n/**\n * Detect if iTerm2 is installed on macOS\n * Returns false on non-macOS platforms\n */\nexport async function detectITerm2(): Promise<boolean> {\n\tconst platform = detectPlatform()\n\tif (platform !== 'darwin') return false\n\n\t// Check if iTerm.app exists at standard location\n\treturn existsSync('/Applications/iTerm.app')\n}\n\n/**\n * Open new terminal window with specified options\n * Currently supports macOS only\n */\nexport async function openTerminalWindow(\n\toptions: TerminalWindowOptions\n): Promise<void> {\n\tconst platform = detectPlatform()\n\n\tif (platform !== 'darwin') {\n\t\tthrow new Error(\n\t\t\t`Terminal window launching not yet supported on ${platform}. ` +\n\t\t\t\t`Currently only macOS is supported.`\n\t\t)\n\t}\n\n\t// Detect if iTerm2 is available\n\tconst hasITerm2 = await detectITerm2()\n\n\t// Build appropriate AppleScript based on terminal availability\n\tconst applescript = hasITerm2\n\t\t? buildITerm2SingleTabScript(options)\n\t\t: buildAppleScript(options)\n\n\ttry {\n\t\tawait execa('osascript', ['-e', applescript])\n\n\t\t// Activate the appropriate terminal application (only needed for Terminal.app)\n\t\t// iTerm2 script includes its own activation\n\t\tif (!hasITerm2) {\n\t\t\tawait execa('osascript', ['-e', 'tell application \"Terminal\" to activate'])\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to open terminal window: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t)\n\t}\n}\n\n/**\n * Build AppleScript for macOS Terminal.app\n */\nfunction buildAppleScript(options: TerminalWindowOptions): string {\n\tconst {\n\t\tworkspacePath,\n\t\tcommand,\n\t\tbackgroundColor,\n\t\tport,\n\t\tincludeEnvSetup,\n\t\tincludePortExport,\n\t} = options\n\n\t// Build command sequence\n\tconst commands: string[] = []\n\n\t// Navigate to workspace\n\tif (workspacePath) {\n\t\tcommands.push(`cd '${escapePathForAppleScript(workspacePath)}'`)\n\t}\n\n\t// Source .env file\n\tif (includeEnvSetup) {\n\t\tcommands.push('source .env')\n\t}\n\n\t// Export PORT variable\n\tif (includePortExport && port !== undefined) {\n\t\tcommands.push(`export PORT=${port}`)\n\t}\n\n\t// Add custom command\n\tif (command) {\n\t\tcommands.push(command)\n\t}\n\n\t// Join with &&\n\tconst fullCommand = commands.join(' && ')\n\n\t// Prefix with space to prevent shell history pollution\n\t// Most shells (bash/zsh) ignore commands starting with space when HISTCONTROL=ignorespace\n\tconst historyFreeCommand = ` ${fullCommand}`\n\n\t// Build AppleScript\n\tlet script = `tell application \"Terminal\"\\n`\n\tscript += ` set newTab to do script \"${escapeForAppleScript(historyFreeCommand)}\"\\n`\n\n\t// Apply background color if provided\n\tif (backgroundColor) {\n\t\tconst { r, g, b } = backgroundColor\n\t\t// Convert 8-bit RGB (0-255) to 16-bit RGB (0-65535)\n\t\tscript += ` set background color of newTab to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t}\n\n\tscript += `end tell`\n\n\treturn script\n}\n\n/**\n * Escape path for AppleScript string\n * Single quotes in path need special escaping\n */\nfunction escapePathForAppleScript(path: string): string {\n\t// Replace single quote with '\\''\n\treturn path.replace(/'/g, \"'\\\\''\")\n}\n\n/**\n * Escape command for AppleScript do script\n * Must handle double quotes and backslashes\n */\nfunction escapeForAppleScript(command: string): string {\n\treturn (\n\t\tcommand\n\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\n\t)\n}\n\n/**\n * Build iTerm2 AppleScript for single tab\n */\nfunction buildITerm2SingleTabScript(options: TerminalWindowOptions): string {\n\tconst command = buildCommandSequence(options)\n\n\tlet script = 'tell application id \"com.googlecode.iterm2\"\\n'\n\tscript += ' create window with default profile\\n'\n\tscript += ' set s1 to current session of current window\\n\\n'\n\n\t// Set background color\n\tif (options.backgroundColor) {\n\t\tconst { r, g, b } = options.backgroundColor\n\t\tscript += ` set background color of s1 to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t}\n\n\t// Execute command\n\tscript += ` tell s1 to write text \"${escapeForAppleScript(command)}\"\\n\\n`\n\n\t// Set session name (tab title)\n\tif (options.title) {\n\t\tscript += ` set name of s1 to \"${escapeForAppleScript(options.title)}\"\\n\\n`\n\t}\n\n\t// Activate iTerm2\n\tscript += ' activate\\n'\n\tscript += 'end tell'\n\n\treturn script\n}\n\n/**\n * Build command sequence for terminal\n */\nfunction buildCommandSequence(options: TerminalWindowOptions): string {\n\tconst {\n\t\tworkspacePath,\n\t\tcommand,\n\t\tport,\n\t\tincludeEnvSetup,\n\t\tincludePortExport,\n\t} = options\n\n\tconst commands: string[] = []\n\n\t// Navigate to workspace\n\tif (workspacePath) {\n\t\tcommands.push(`cd '${escapePathForAppleScript(workspacePath)}'`)\n\t}\n\n\t// Source .env file\n\tif (includeEnvSetup) {\n\t\tcommands.push('source .env')\n\t}\n\n\t// Export PORT variable\n\tif (includePortExport && port !== undefined) {\n\t\tcommands.push(`export PORT=${port}`)\n\t}\n\n\t// Add custom command\n\tif (command) {\n\t\tcommands.push(command)\n\t}\n\n\t// Join with &&\n\tconst fullCommand = commands.join(' && ')\n\n\t// Prefix with space to prevent shell history pollution\n\treturn ` ${fullCommand}`\n}\n\n/**\n * Build iTerm2 AppleScript for multiple tabs (2+) in single window\n */\nfunction buildITerm2MultiTabScript(\n\toptionsArray: TerminalWindowOptions[]\n): string {\n\tif (optionsArray.length < 2) {\n\t\tthrow new Error('buildITerm2MultiTabScript requires at least 2 terminal options')\n\t}\n\n\tlet script = 'tell application id \"com.googlecode.iterm2\"\\n'\n\tscript += ' create window with default profile\\n'\n\tscript += ' set newWindow to current window\\n'\n\n\t// First tab\n\tconst options1 = optionsArray[0]\n\tif (!options1) {\n\t\tthrow new Error('First terminal option is undefined')\n\t}\n\tconst command1 = buildCommandSequence(options1)\n\n\tscript += ' set s1 to current session of newWindow\\n\\n'\n\n\t// Set background color for first tab\n\tif (options1.backgroundColor) {\n\t\tconst { r, g, b } = options1.backgroundColor\n\t\tscript += ` set background color of s1 to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t}\n\n\t// Execute command in first tab\n\tscript += ` tell s1 to write text \"${escapeForAppleScript(command1)}\"\\n\\n`\n\n\t// Set tab title for first tab\n\tif (options1.title) {\n\t\tscript += ` set name of s1 to \"${escapeForAppleScript(options1.title)}\"\\n\\n`\n\t}\n\n\t// Subsequent tabs (2, 3, ...)\n\tfor (let i = 1; i < optionsArray.length; i++) {\n\t\tconst options = optionsArray[i]\n\t\tif (!options) {\n\t\t\tthrow new Error(`Terminal option at index ${i} is undefined`)\n\t\t}\n\t\tconst command = buildCommandSequence(options)\n\t\tconst sessionVar = `s${i + 1}`\n\n\t\t// Create tab\n\t\tscript += ' tell newWindow\\n'\n\t\tscript += ` set newTab${i} to (create tab with default profile)\\n`\n\t\tscript += ' end tell\\n'\n\t\tscript += ` set ${sessionVar} to current session of newTab${i}\\n\\n`\n\n\t\t// Set background color\n\t\tif (options.backgroundColor) {\n\t\t\tconst { r, g, b } = options.backgroundColor\n\t\t\tscript += ` set background color of ${sessionVar} to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t\t}\n\n\t\t// Execute command\n\t\tscript += ` tell ${sessionVar} to write text \"${escapeForAppleScript(command)}\"\\n\\n`\n\n\t\t// Set tab title\n\t\tif (options.title) {\n\t\t\tscript += ` set name of ${sessionVar} to \"${escapeForAppleScript(options.title)}\"\\n\\n`\n\t\t}\n\t}\n\n\t// Activate iTerm2\n\tscript += ' activate\\n'\n\tscript += 'end tell'\n\n\treturn script\n}\n\n/**\n * Open multiple terminal windows/tabs (2+) with specified options\n * If iTerm2 is available on macOS, creates single window with multiple tabs\n * Otherwise falls back to multiple separate Terminal.app windows\n */\nexport async function openMultipleTerminalWindows(\n\toptionsArray: TerminalWindowOptions[]\n): Promise<void> {\n\tif (optionsArray.length < 2) {\n\t\tthrow new Error('openMultipleTerminalWindows requires at least 2 terminal options. Use openTerminalWindow for single terminal.')\n\t}\n\n\tconst platform = detectPlatform()\n\n\tif (platform !== 'darwin') {\n\t\tthrow new Error(\n\t\t\t`Terminal window launching not yet supported on ${platform}. ` +\n\t\t\t\t`Currently only macOS is supported.`\n\t\t)\n\t}\n\n\t// Detect if iTerm2 is available\n\tconst hasITerm2 = await detectITerm2()\n\n\tif (hasITerm2) {\n\t\t// Use iTerm2 with multiple tabs in single window\n\t\tconst applescript = buildITerm2MultiTabScript(optionsArray)\n\n\t\ttry {\n\t\t\tawait execa('osascript', ['-e', applescript])\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to open iTerm2 window: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Fall back to multiple Terminal.app windows\n\t\tfor (let i = 0; i < optionsArray.length; i++) {\n\t\t\tconst options = optionsArray[i]\n\t\t\tif (!options) {\n\t\t\t\tthrow new Error(`Terminal option at index ${i} is undefined`)\n\t\t\t}\n\t\t\tawait openTerminalWindow(options)\n\n\t\t\t// Brief pause between terminals (except after last one)\n\t\t\tif (i < optionsArray.length - 1) {\n\t\t\t\t// eslint-disable-next-line no-undef\n\t\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 1000))\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Open dual terminal windows/tabs with specified options\n * If iTerm2 is available on macOS, creates single window with two tabs\n * Otherwise falls back to two separate Terminal.app windows\n */\nexport async function openDualTerminalWindow(\n\toptions1: TerminalWindowOptions,\n\toptions2: TerminalWindowOptions\n): Promise<void> {\n\t// Delegate to openMultipleTerminalWindows for consistency\n\tawait openMultipleTerminalWindows([options1, options2])\n}\n"],"mappings":"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","names":[]}
@@ -25,11 +25,11 @@ import {
25
25
  } from "./chunk-YETJNRQM.js";
26
26
  import {
27
27
  GitWorktreeManager
28
- } from "./chunk-IO4WFTL2.js";
28
+ } from "./chunk-VETG35MF.js";
29
29
  import {
30
30
  SettingsManager
31
- } from "./chunk-VYQLLHZ7.js";
32
- import "./chunk-KOCQAD2E.js";
31
+ } from "./chunk-T3KEIB4D.js";
32
+ import "./chunk-HBVFXN7R.js";
33
33
  import {
34
34
  logger
35
35
  } from "./chunk-GEHQXLEI.js";
@@ -273,4 +273,4 @@ Make sure the project is built (run 'il start' first)`
273
273
  export {
274
274
  OpenCommand
275
275
  };
276
- //# sourceMappingURL=open-ETZUFSE4.js.map
276
+ //# sourceMappingURL=open-NXSN7XOC.js.map
@@ -271,6 +271,24 @@ The following JSON Schema defines valid iloom settings:
271
271
  },
272
272
  "additionalProperties": false,
273
273
  "description": "Issue management configuration"
274
+ },
275
+ "mergeBehavior": {
276
+ "type": "object",
277
+ "properties": {
278
+ "mode": {
279
+ "type": "string",
280
+ "enum": [
281
+ "local",
282
+ "github-pr"
283
+ ],
284
+ "default": "local"
285
+ },
286
+ "remote": {
287
+ "type": "string"
288
+ }
289
+ },
290
+ "additionalProperties": false,
291
+ "description": "Merge behavior configuration: local (merge locally) or github-pr (create PR)"
274
292
  }
275
293
  },
276
294
  "additionalProperties": false
@@ -364,6 +382,7 @@ Extract these current values if they exist:
364
382
  - `currentWorktreePrefix` from `worktreePrefix` field (default: "" which means use default)
365
383
  - `currentPermissionMode` from `workflows.issue.permissionMode` field (default: "acceptEdits")
366
384
  - `currentBasePort` from `capabilities.web.basePort` field (default: 3000)
385
+ - `currentMergeMode` from `mergeBehavior.mode` field (default: "local")
367
386
 
368
387
  **If configuration already exists, display current configuration summary:**
369
388
 
@@ -474,6 +493,16 @@ Use AskUserQuestion to ask ALL essential settings questions **IN A SINGLE BATCH*
474
493
  - Validation: Number between 1 and 65535
475
494
  - Store answer as: `capabilities.web.basePort`
476
495
 
496
+ 5. **Merge Mode** (only ask if multiple remotes detected OR user requests advanced config)
497
+ - Question format: "How should iloom handle finishing work?{{#IF currentMergeMode}} (Currently: [currentMergeMode]){{/IF currentMergeMode}}"
498
+ - Options:
499
+ - "local" - Merge changes locally (traditional workflow)
500
+ - "github-pr" - Create GitHub PR instead of merging locally (for PR-based workflows or forks)
501
+ - Default: currentMergeMode or "local"
502
+ - Validation: Must be one of: local, github-pr
503
+ - Store answer as: `mergeBehavior.mode`
504
+ - Context: Fork workflows (with upstream remote) should typically use "github-pr" mode
505
+
477
506
  **Implementation Details:**
478
507
  - Set multiSelect: false for all questions (user picks one answer per question)
479
508
  - Use the AskUserQuestion tool with all 4 questions in the questions array
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MergeManager
4
- } from "./chunk-VVH3ANF2.js";
5
- import "./chunk-PXZBAC2M.js";
4
+ } from "./chunk-4IV6W4U5.js";
5
+ import "./chunk-MFU53H6J.js";
6
6
  import {
7
7
  GitWorktreeManager
8
- } from "./chunk-IO4WFTL2.js";
8
+ } from "./chunk-VETG35MF.js";
9
9
  import {
10
10
  SettingsManager
11
- } from "./chunk-VYQLLHZ7.js";
11
+ } from "./chunk-T3KEIB4D.js";
12
12
  import {
13
13
  getRepoRoot,
14
14
  isValidGitRepo
15
- } from "./chunk-KOCQAD2E.js";
15
+ } from "./chunk-HBVFXN7R.js";
16
16
  import {
17
17
  logger
18
18
  } from "./chunk-GEHQXLEI.js";
@@ -92,4 +92,4 @@ export {
92
92
  RebaseCommand,
93
93
  WorktreeValidationError
94
94
  };
95
- //# sourceMappingURL=rebase-KBWFDZCN.js.map
95
+ //# sourceMappingURL=rebase-DUNFOJVS.js.map
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getConfiguredRepoFromSettings,
4
+ getEffectivePRTargetRemote,
4
5
  hasMultipleRemotes,
5
6
  parseGitRemotes,
6
7
  validateConfiguredRemote
7
- } from "./chunk-FXV24OYZ.js";
8
+ } from "./chunk-DJUGYNQE.js";
8
9
  export {
9
10
  getConfiguredRepoFromSettings,
11
+ getEffectivePRTargetRemote,
10
12
  hasMultipleRemotes,
11
13
  parseGitRemotes,
12
14
  validateConfiguredRemote
13
15
  };
14
- //# sourceMappingURL=remote-GJEZWRCC.js.map
16
+ //# sourceMappingURL=remote-ZCXJVVNW.js.map
@@ -25,11 +25,11 @@ import {
25
25
  } from "./chunk-YETJNRQM.js";
26
26
  import {
27
27
  GitWorktreeManager
28
- } from "./chunk-IO4WFTL2.js";
28
+ } from "./chunk-VETG35MF.js";
29
29
  import {
30
30
  SettingsManager
31
- } from "./chunk-VYQLLHZ7.js";
32
- import "./chunk-KOCQAD2E.js";
31
+ } from "./chunk-T3KEIB4D.js";
32
+ import "./chunk-HBVFXN7R.js";
33
33
  import {
34
34
  logger
35
35
  } from "./chunk-GEHQXLEI.js";
@@ -273,4 +273,4 @@ Make sure the project is built (run 'il start' first)`
273
273
  export {
274
274
  RunCommand
275
275
  };
276
- //# sourceMappingURL=run-4SVQ3WEU.js.map
276
+ //# sourceMappingURL=run-O7ZK7CKA.js.map
@@ -262,6 +262,24 @@
262
262
  },
263
263
  "additionalProperties": false,
264
264
  "description": "Issue management configuration"
265
+ },
266
+ "mergeBehavior": {
267
+ "type": "object",
268
+ "properties": {
269
+ "mode": {
270
+ "type": "string",
271
+ "enum": [
272
+ "local",
273
+ "github-pr"
274
+ ],
275
+ "default": "local"
276
+ },
277
+ "remote": {
278
+ "type": "string"
279
+ }
280
+ },
281
+ "additionalProperties": false,
282
+ "description": "Merge behavior configuration: local (merge locally) or github-pr (create PR)"
265
283
  }
266
284
  },
267
285
  "additionalProperties": false
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-BLCTGFZN.js";
13
13
  import {
14
14
  ClaudeContextManager
15
- } from "./chunk-DEPYQRRB.js";
15
+ } from "./chunk-2PLUQT6J.js";
16
16
  import {
17
17
  extractSettingsOverrides
18
18
  } from "./chunk-GYCR2LOU.js";
@@ -25,7 +25,7 @@ import {
25
25
  import "./chunk-2ZPFJQ3B.js";
26
26
  import {
27
27
  IssueEnhancementService
28
- } from "./chunk-PR7FKQBG.js";
28
+ } from "./chunk-RF2YI2XJ.js";
29
29
  import {
30
30
  AgentManager
31
31
  } from "./chunk-OC4H6HJD.js";
@@ -33,7 +33,7 @@ import "./chunk-YETJNRQM.js";
33
33
  import {
34
34
  getConfiguredRepoFromSettings,
35
35
  hasMultipleRemotes
36
- } from "./chunk-FXV24OYZ.js";
36
+ } from "./chunk-DJUGYNQE.js";
37
37
  import {
38
38
  calculateForegroundColor,
39
39
  generateColorFromBranchName,
@@ -43,23 +43,23 @@ import {
43
43
  } from "./chunk-ZZZWQGTS.js";
44
44
  import {
45
45
  GitHubService
46
- } from "./chunk-ZWXJBSUW.js";
47
- import "./chunk-JXQXSC45.js";
48
- import "./chunk-ELFT36PV.js";
49
- import "./chunk-PXZBAC2M.js";
46
+ } from "./chunk-TS6DL67T.js";
47
+ import "./chunk-SWCRXDZC.js";
48
+ import "./chunk-LHP6ROUM.js";
49
+ import "./chunk-MFU53H6J.js";
50
50
  import "./chunk-PVAVNJKS.js";
51
51
  import {
52
52
  GitWorktreeManager
53
- } from "./chunk-IO4WFTL2.js";
53
+ } from "./chunk-VETG35MF.js";
54
54
  import {
55
55
  SettingsManager
56
- } from "./chunk-VYQLLHZ7.js";
56
+ } from "./chunk-T3KEIB4D.js";
57
57
  import {
58
58
  branchExists,
59
59
  ensureRepositoryHasCommits,
60
60
  executeGitCommand,
61
61
  findMainWorktreePathWithSettings
62
- } from "./chunk-KOCQAD2E.js";
62
+ } from "./chunk-HBVFXN7R.js";
63
63
  import "./chunk-JNKJ7NJV.js";
64
64
  import {
65
65
  logger
@@ -311,8 +311,8 @@ var LoomManager = class {
311
311
  const setArguments = (_j = input.options) == null ? void 0 : _j.setArguments;
312
312
  const executablePath = (_k = input.options) == null ? void 0 : _k.executablePath;
313
313
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
314
- const { LoomLauncher } = await import("./LoomLauncher-UMMLPIZO.js");
315
- const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-JKR4WGNU.js");
314
+ const { LoomLauncher } = await import("./LoomLauncher-CTSWJL35.js");
315
+ const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-LVCYRM6Q.js");
316
316
  const claudeContext = new ClaudeContextManager2(void 0, void 0, this.settings);
317
317
  const launcher = new LoomLauncher(claudeContext);
318
318
  await launcher.launchLoom({
@@ -654,8 +654,8 @@ var LoomManager = class {
654
654
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
655
655
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
656
656
  logger.info("Launching workspace components...");
657
- const { LoomLauncher } = await import("./LoomLauncher-UMMLPIZO.js");
658
- const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-JKR4WGNU.js");
657
+ const { LoomLauncher } = await import("./LoomLauncher-CTSWJL35.js");
658
+ const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-LVCYRM6Q.js");
659
659
  const claudeContext = new ClaudeContextManager2(void 0, void 0, this.settings);
660
660
  const launcher = new LoomLauncher(claudeContext);
661
661
  await launcher.launchLoom({
@@ -980,4 +980,4 @@ var StartCommand = class {
980
980
  export {
981
981
  StartCommand
982
982
  };
983
- //# sourceMappingURL=start-CT2ZEFP2.js.map
983
+ //# sourceMappingURL=start-73I5W7WW.js.map
@@ -5,7 +5,7 @@ import {
5
5
  openDualTerminalWindow,
6
6
  openMultipleTerminalWindows,
7
7
  openTerminalWindow
8
- } from "./chunk-RSRO7564.js";
8
+ } from "./chunk-ZE74H5BR.js";
9
9
  export {
10
10
  detectITerm2,
11
11
  detectPlatform,
@@ -13,4 +13,4 @@ export {
13
13
  openMultipleTerminalWindows,
14
14
  openTerminalWindow
15
15
  };
16
- //# sourceMappingURL=terminal-3D6TUAKJ.js.map
16
+ //# sourceMappingURL=terminal-BIRBZ4AZ.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SettingsManager
4
- } from "./chunk-VYQLLHZ7.js";
4
+ } from "./chunk-T3KEIB4D.js";
5
5
  import {
6
6
  findMainWorktreePath
7
- } from "./chunk-KOCQAD2E.js";
7
+ } from "./chunk-HBVFXN7R.js";
8
8
  import {
9
9
  logger
10
10
  } from "./chunk-GEHQXLEI.js";
@@ -49,4 +49,4 @@ var TestGitCommand = class {
49
49
  export {
50
50
  TestGitCommand
51
51
  };
52
- //# sourceMappingURL=test-git-MKZATGZN.js.map
52
+ //# sourceMappingURL=test-git-T76HOTIA.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SettingsManager
4
- } from "./chunk-VYQLLHZ7.js";
4
+ } from "./chunk-T3KEIB4D.js";
5
5
  import {
6
6
  generateWorktreePath
7
- } from "./chunk-KOCQAD2E.js";
7
+ } from "./chunk-HBVFXN7R.js";
8
8
  import {
9
9
  logger
10
10
  } from "./chunk-GEHQXLEI.js";
@@ -65,4 +65,4 @@ var TestPrefixCommand = class {
65
65
  export {
66
66
  TestPrefixCommand
67
67
  };
68
- //# sourceMappingURL=test-prefix-ZNLWDI3K.js.map
68
+ //# sourceMappingURL=test-prefix-6HJUVQMH.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  detectITerm2,
4
4
  openMultipleTerminalWindows
5
- } from "./chunk-RSRO7564.js";
5
+ } from "./chunk-ZE74H5BR.js";
6
6
  import {
7
7
  logger
8
8
  } from "./chunk-GEHQXLEI.js";
@@ -66,4 +66,4 @@ var TestTabsCommand = class {
66
66
  export {
67
67
  TestTabsCommand
68
68
  };
69
- //# sourceMappingURL=test-tabs-JRKY3QMM.js.map
69
+ //# sourceMappingURL=test-tabs-RXDBZ6J7.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iloom/cli",
3
- "version": "0.1.19",
3
+ "version": "0.2.0",
4
4
  "description": "Control plane for maintaining alignment between you and Claude AI as you work across multiple issues using isolated environments, visible context, and multi-agent workflows to scale understanding, not just output",
5
5
  "keywords": [
6
6
  "ai",
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ClaudeContextManager
4
- } from "./chunk-DEPYQRRB.js";
5
- import "./chunk-ELFT36PV.js";
6
- import "./chunk-PXZBAC2M.js";
7
- import "./chunk-PVAVNJKS.js";
8
- import "./chunk-VYQLLHZ7.js";
9
- import "./chunk-GEHQXLEI.js";
10
- export {
11
- ClaudeContextManager
12
- };
13
- //# sourceMappingURL=ClaudeContextManager-JKR4WGNU.js.map
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ClaudeService
4
- } from "./chunk-ELFT36PV.js";
5
- import "./chunk-PXZBAC2M.js";
6
- import "./chunk-PVAVNJKS.js";
7
- import "./chunk-VYQLLHZ7.js";
8
- import "./chunk-GEHQXLEI.js";
9
- export {
10
- ClaudeService
11
- };
12
- //# sourceMappingURL=ClaudeService-55DQGB7T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/terminal.ts"],"sourcesContent":["import { execa } from 'execa'\nimport { existsSync } from 'node:fs'\nimport type { Platform } from '../types/index.js'\n\nexport interface TerminalWindowOptions {\n\tworkspacePath?: string\n\tcommand?: string\n\tbackgroundColor?: { r: number; g: number; b: number }\n\tport?: number\n\tincludeEnvSetup?: boolean // source .env\n\tincludePortExport?: boolean // export PORT=<port>\n\ttitle?: string // Terminal tab title\n}\n\n/**\n * Detect current platform\n */\nexport function detectPlatform(): Platform {\n\tconst platform = process.platform\n\tif (platform === 'darwin') return 'darwin'\n\tif (platform === 'linux') return 'linux'\n\tif (platform === 'win32') return 'win32'\n\treturn 'unsupported'\n}\n\n/**\n * Detect if iTerm2 is installed on macOS\n * Returns false on non-macOS platforms\n */\nexport async function detectITerm2(): Promise<boolean> {\n\tconst platform = detectPlatform()\n\tif (platform !== 'darwin') return false\n\n\t// Check if iTerm.app exists at standard location\n\treturn existsSync('/Applications/iTerm.app')\n}\n\n/**\n * Open new terminal window with specified options\n * Currently supports macOS only\n */\nexport async function openTerminalWindow(\n\toptions: TerminalWindowOptions\n): Promise<void> {\n\tconst platform = detectPlatform()\n\n\tif (platform !== 'darwin') {\n\t\tthrow new Error(\n\t\t\t`Terminal window launching not yet supported on ${platform}. ` +\n\t\t\t\t`Currently only macOS is supported.`\n\t\t)\n\t}\n\n\t// macOS implementation using AppleScript\n\tconst applescript = buildAppleScript(options)\n\n\ttry {\n\t\tawait execa('osascript', ['-e', applescript])\n\n\t\t// Activate Terminal.app to bring windows to front\n\t\tawait execa('osascript', ['-e', 'tell application \"Terminal\" to activate'])\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to open terminal window: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t)\n\t}\n}\n\n/**\n * Build AppleScript for macOS Terminal.app\n */\nfunction buildAppleScript(options: TerminalWindowOptions): string {\n\tconst {\n\t\tworkspacePath,\n\t\tcommand,\n\t\tbackgroundColor,\n\t\tport,\n\t\tincludeEnvSetup,\n\t\tincludePortExport,\n\t} = options\n\n\t// Build command sequence\n\tconst commands: string[] = []\n\n\t// Navigate to workspace\n\tif (workspacePath) {\n\t\tcommands.push(`cd '${escapePathForAppleScript(workspacePath)}'`)\n\t}\n\n\t// Source .env file\n\tif (includeEnvSetup) {\n\t\tcommands.push('source .env')\n\t}\n\n\t// Export PORT variable\n\tif (includePortExport && port !== undefined) {\n\t\tcommands.push(`export PORT=${port}`)\n\t}\n\n\t// Add custom command\n\tif (command) {\n\t\tcommands.push(command)\n\t}\n\n\t// Join with &&\n\tconst fullCommand = commands.join(' && ')\n\n\t// Prefix with space to prevent shell history pollution\n\t// Most shells (bash/zsh) ignore commands starting with space when HISTCONTROL=ignorespace\n\tconst historyFreeCommand = ` ${fullCommand}`\n\n\t// Build AppleScript\n\tlet script = `tell application \"Terminal\"\\n`\n\tscript += ` set newTab to do script \"${escapeForAppleScript(historyFreeCommand)}\"\\n`\n\n\t// Apply background color if provided\n\tif (backgroundColor) {\n\t\tconst { r, g, b } = backgroundColor\n\t\t// Convert 8-bit RGB (0-255) to 16-bit RGB (0-65535)\n\t\tscript += ` set background color of newTab to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t}\n\n\tscript += `end tell`\n\n\treturn script\n}\n\n/**\n * Escape path for AppleScript string\n * Single quotes in path need special escaping\n */\nfunction escapePathForAppleScript(path: string): string {\n\t// Replace single quote with '\\''\n\treturn path.replace(/'/g, \"'\\\\''\")\n}\n\n/**\n * Escape command for AppleScript do script\n * Must handle double quotes and backslashes\n */\nfunction escapeForAppleScript(command: string): string {\n\treturn (\n\t\tcommand\n\t\t\t.replace(/\\\\/g, '\\\\\\\\') // Escape backslashes\n\t\t\t.replace(/\"/g, '\\\\\"') // Escape double quotes\n\t)\n}\n\n/**\n * Build command sequence for terminal\n */\nfunction buildCommandSequence(options: TerminalWindowOptions): string {\n\tconst {\n\t\tworkspacePath,\n\t\tcommand,\n\t\tport,\n\t\tincludeEnvSetup,\n\t\tincludePortExport,\n\t} = options\n\n\tconst commands: string[] = []\n\n\t// Navigate to workspace\n\tif (workspacePath) {\n\t\tcommands.push(`cd '${escapePathForAppleScript(workspacePath)}'`)\n\t}\n\n\t// Source .env file\n\tif (includeEnvSetup) {\n\t\tcommands.push('source .env')\n\t}\n\n\t// Export PORT variable\n\tif (includePortExport && port !== undefined) {\n\t\tcommands.push(`export PORT=${port}`)\n\t}\n\n\t// Add custom command\n\tif (command) {\n\t\tcommands.push(command)\n\t}\n\n\t// Join with &&\n\tconst fullCommand = commands.join(' && ')\n\n\t// Prefix with space to prevent shell history pollution\n\treturn ` ${fullCommand}`\n}\n\n/**\n * Build iTerm2 AppleScript for multiple tabs (2+) in single window\n */\nfunction buildITerm2MultiTabScript(\n\toptionsArray: TerminalWindowOptions[]\n): string {\n\tif (optionsArray.length < 2) {\n\t\tthrow new Error('buildITerm2MultiTabScript requires at least 2 terminal options')\n\t}\n\n\tlet script = 'tell application id \"com.googlecode.iterm2\"\\n'\n\tscript += ' create window with default profile\\n'\n\tscript += ' set newWindow to current window\\n'\n\n\t// First tab\n\tconst options1 = optionsArray[0]\n\tif (!options1) {\n\t\tthrow new Error('First terminal option is undefined')\n\t}\n\tconst command1 = buildCommandSequence(options1)\n\n\tscript += ' set s1 to current session of newWindow\\n\\n'\n\n\t// Set background color for first tab\n\tif (options1.backgroundColor) {\n\t\tconst { r, g, b } = options1.backgroundColor\n\t\tscript += ` set background color of s1 to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t}\n\n\t// Execute command in first tab\n\tscript += ` tell s1 to write text \"${escapeForAppleScript(command1)}\"\\n\\n`\n\n\t// Set tab title for first tab\n\tif (options1.title) {\n\t\tscript += ` set name of s1 to \"${escapeForAppleScript(options1.title)}\"\\n\\n`\n\t}\n\n\t// Subsequent tabs (2, 3, ...)\n\tfor (let i = 1; i < optionsArray.length; i++) {\n\t\tconst options = optionsArray[i]\n\t\tif (!options) {\n\t\t\tthrow new Error(`Terminal option at index ${i} is undefined`)\n\t\t}\n\t\tconst command = buildCommandSequence(options)\n\t\tconst sessionVar = `s${i + 1}`\n\n\t\t// Create tab\n\t\tscript += ' tell newWindow\\n'\n\t\tscript += ` set newTab${i} to (create tab with default profile)\\n`\n\t\tscript += ' end tell\\n'\n\t\tscript += ` set ${sessionVar} to current session of newTab${i}\\n\\n`\n\n\t\t// Set background color\n\t\tif (options.backgroundColor) {\n\t\t\tconst { r, g, b } = options.backgroundColor\n\t\t\tscript += ` set background color of ${sessionVar} to {${Math.round(r * 257)}, ${Math.round(g * 257)}, ${Math.round(b * 257)}}\\n`\n\t\t}\n\n\t\t// Execute command\n\t\tscript += ` tell ${sessionVar} to write text \"${escapeForAppleScript(command)}\"\\n\\n`\n\n\t\t// Set tab title\n\t\tif (options.title) {\n\t\t\tscript += ` set name of ${sessionVar} to \"${escapeForAppleScript(options.title)}\"\\n\\n`\n\t\t}\n\t}\n\n\t// Activate iTerm2\n\tscript += ' activate\\n'\n\tscript += 'end tell'\n\n\treturn script\n}\n\n/**\n * Open multiple terminal windows/tabs (2+) with specified options\n * If iTerm2 is available on macOS, creates single window with multiple tabs\n * Otherwise falls back to multiple separate Terminal.app windows\n */\nexport async function openMultipleTerminalWindows(\n\toptionsArray: TerminalWindowOptions[]\n): Promise<void> {\n\tif (optionsArray.length < 2) {\n\t\tthrow new Error('openMultipleTerminalWindows requires at least 2 terminal options. Use openTerminalWindow for single terminal.')\n\t}\n\n\tconst platform = detectPlatform()\n\n\tif (platform !== 'darwin') {\n\t\tthrow new Error(\n\t\t\t`Terminal window launching not yet supported on ${platform}. ` +\n\t\t\t\t`Currently only macOS is supported.`\n\t\t)\n\t}\n\n\t// Detect if iTerm2 is available\n\tconst hasITerm2 = await detectITerm2()\n\n\tif (hasITerm2) {\n\t\t// Use iTerm2 with multiple tabs in single window\n\t\tconst applescript = buildITerm2MultiTabScript(optionsArray)\n\n\t\ttry {\n\t\t\tawait execa('osascript', ['-e', applescript])\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to open iTerm2 window: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Fall back to multiple Terminal.app windows\n\t\tfor (let i = 0; i < optionsArray.length; i++) {\n\t\t\tconst options = optionsArray[i]\n\t\t\tif (!options) {\n\t\t\t\tthrow new Error(`Terminal option at index ${i} is undefined`)\n\t\t\t}\n\t\t\tawait openTerminalWindow(options)\n\n\t\t\t// Brief pause between terminals (except after last one)\n\t\t\tif (i < optionsArray.length - 1) {\n\t\t\t\t// eslint-disable-next-line no-undef\n\t\t\t\tawait new Promise<void>((resolve) => setTimeout(resolve, 1000))\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Open dual terminal windows/tabs with specified options\n * If iTerm2 is available on macOS, creates single window with two tabs\n * Otherwise falls back to two separate Terminal.app windows\n */\nexport async function openDualTerminalWindow(\n\toptions1: TerminalWindowOptions,\n\toptions2: TerminalWindowOptions\n): Promise<void> {\n\t// Delegate to openMultipleTerminalWindows for consistency\n\tawait openMultipleTerminalWindows([options1, options2])\n}\n"],"mappings":"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","names":[]}