@iloom/cli 0.4.0 → 0.4.1

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 (82) hide show
  1. package/dist/{BranchNamingService-TOM2KAUT.js → BranchNamingService-GCCWB3LK.js} +2 -2
  2. package/dist/{ClaudeContextManager-VEGJTS5E.js → ClaudeContextManager-DK77227F.js} +6 -6
  3. package/dist/{ClaudeService-ICSHJMQ5.js → ClaudeService-W3SA7HVG.js} +5 -5
  4. package/dist/{LoomLauncher-SJBZFZXE.js → LoomLauncher-S3YGJRJQ.js} +24 -11
  5. package/dist/LoomLauncher-S3YGJRJQ.js.map +1 -0
  6. package/dist/{chunk-TR5MC2U6.js → chunk-2W2FBL5G.js} +2 -2
  7. package/dist/{chunk-HVGQP44L.js → chunk-55TB3FSG.js} +2 -2
  8. package/dist/{chunk-LTNDJMTH.js → chunk-BIIQHEXJ.js} +4 -4
  9. package/dist/{chunk-KM3W7YQX.js → chunk-G6CIIJLT.js} +4 -4
  10. package/dist/{chunk-NFVFVYAP.js → chunk-IARWMDAX.js} +19 -12
  11. package/dist/chunk-IARWMDAX.js.map +1 -0
  12. package/dist/{chunk-MLS5FAV7.js → chunk-IJ7IGJT3.js} +4 -1
  13. package/dist/chunk-IJ7IGJT3.js.map +1 -0
  14. package/dist/{chunk-M5XUCTTJ.js → chunk-JC5HXN75.js} +2 -2
  15. package/dist/{chunk-ADDNFQJ4.js → chunk-POI7KLBH.js} +2 -2
  16. package/dist/{chunk-P2WZIDF3.js → chunk-QIUJPPJQ.js} +2 -2
  17. package/dist/{chunk-75B2HZZ5.js → chunk-RUC7OULH.js} +2 -2
  18. package/dist/{chunk-HHDSIE72.js → chunk-TMZAVPGF.js} +3 -3
  19. package/dist/{chunk-F4J6KEL6.js → chunk-UPUAQYAW.js} +2 -2
  20. package/dist/{chunk-JJUPY5MM.js → chunk-VAYGNQTE.js} +2 -2
  21. package/dist/{chunk-S44CHE3G.js → chunk-VTXCGKV5.js} +2 -2
  22. package/dist/{chunk-3NFBZRPR.js → chunk-Z5NXYJIG.js} +19 -1
  23. package/dist/chunk-Z5NXYJIG.js.map +1 -0
  24. package/dist/{claude-X7EBJRB2.js → claude-ACVXNB6N.js} +4 -4
  25. package/dist/{cleanup-7QVPYBJJ.js → cleanup-KDLVTT7M.js} +12 -12
  26. package/dist/cli.js +95 -48
  27. package/dist/cli.js.map +1 -1
  28. package/dist/{contribute-RZYCYUDX.js → contribute-HY372S6F.js} +3 -3
  29. package/dist/{dev-server-LOY7YWCP.js → dev-server-JCJGQ3PV.js} +9 -9
  30. package/dist/{feedback-562KPG5U.js → feedback-7PVBQNLJ.js} +5 -5
  31. package/dist/{git-OXJACVAU.js → git-4BVOOOOV.js} +3 -3
  32. package/dist/{ignite-VSIPGKKG.js → ignite-3B264M7K.js} +7 -7
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.js +3 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/{init-SCR2LQ4A.js → init-LBA6NUK2.js} +8 -8
  37. package/dist/{open-CX7HUE26.js → open-OGCV32Z4.js} +9 -9
  38. package/dist/{projects-6DTNDVLH.js → projects-P55273AB.js} +2 -2
  39. package/dist/{rebase-55URTXZC.js → rebase-4T5FQHNH.js} +8 -8
  40. package/dist/{run-DP2U2CA2.js → run-HNOP6WE2.js} +9 -9
  41. package/dist/shell-DE3HKJSM.js +240 -0
  42. package/dist/shell-DE3HKJSM.js.map +1 -0
  43. package/dist/{summary-J3CJSM7L.js → summary-GDT7DTRI.js} +8 -8
  44. package/dist/{test-git-QLAIBJLX.js → test-git-YMAE57UP.js} +3 -3
  45. package/dist/{test-prefix-6YM2ZOON.js → test-prefix-YCKL6CMT.js} +3 -3
  46. package/dist/{test-tabs-JGO3VOXJ.js → test-tabs-3SCJWRKT.js} +3 -3
  47. package/package.json +1 -1
  48. package/dist/LoomLauncher-SJBZFZXE.js.map +0 -1
  49. package/dist/chunk-3NFBZRPR.js.map +0 -1
  50. package/dist/chunk-MLS5FAV7.js.map +0 -1
  51. package/dist/chunk-NFVFVYAP.js.map +0 -1
  52. /package/dist/{BranchNamingService-TOM2KAUT.js.map → BranchNamingService-GCCWB3LK.js.map} +0 -0
  53. /package/dist/{ClaudeContextManager-VEGJTS5E.js.map → ClaudeContextManager-DK77227F.js.map} +0 -0
  54. /package/dist/{ClaudeService-ICSHJMQ5.js.map → ClaudeService-W3SA7HVG.js.map} +0 -0
  55. /package/dist/{chunk-TR5MC2U6.js.map → chunk-2W2FBL5G.js.map} +0 -0
  56. /package/dist/{chunk-HVGQP44L.js.map → chunk-55TB3FSG.js.map} +0 -0
  57. /package/dist/{chunk-LTNDJMTH.js.map → chunk-BIIQHEXJ.js.map} +0 -0
  58. /package/dist/{chunk-KM3W7YQX.js.map → chunk-G6CIIJLT.js.map} +0 -0
  59. /package/dist/{chunk-M5XUCTTJ.js.map → chunk-JC5HXN75.js.map} +0 -0
  60. /package/dist/{chunk-ADDNFQJ4.js.map → chunk-POI7KLBH.js.map} +0 -0
  61. /package/dist/{chunk-P2WZIDF3.js.map → chunk-QIUJPPJQ.js.map} +0 -0
  62. /package/dist/{chunk-75B2HZZ5.js.map → chunk-RUC7OULH.js.map} +0 -0
  63. /package/dist/{chunk-HHDSIE72.js.map → chunk-TMZAVPGF.js.map} +0 -0
  64. /package/dist/{chunk-F4J6KEL6.js.map → chunk-UPUAQYAW.js.map} +0 -0
  65. /package/dist/{chunk-JJUPY5MM.js.map → chunk-VAYGNQTE.js.map} +0 -0
  66. /package/dist/{chunk-S44CHE3G.js.map → chunk-VTXCGKV5.js.map} +0 -0
  67. /package/dist/{claude-X7EBJRB2.js.map → claude-ACVXNB6N.js.map} +0 -0
  68. /package/dist/{cleanup-7QVPYBJJ.js.map → cleanup-KDLVTT7M.js.map} +0 -0
  69. /package/dist/{contribute-RZYCYUDX.js.map → contribute-HY372S6F.js.map} +0 -0
  70. /package/dist/{dev-server-LOY7YWCP.js.map → dev-server-JCJGQ3PV.js.map} +0 -0
  71. /package/dist/{feedback-562KPG5U.js.map → feedback-7PVBQNLJ.js.map} +0 -0
  72. /package/dist/{git-OXJACVAU.js.map → git-4BVOOOOV.js.map} +0 -0
  73. /package/dist/{ignite-VSIPGKKG.js.map → ignite-3B264M7K.js.map} +0 -0
  74. /package/dist/{init-SCR2LQ4A.js.map → init-LBA6NUK2.js.map} +0 -0
  75. /package/dist/{open-CX7HUE26.js.map → open-OGCV32Z4.js.map} +0 -0
  76. /package/dist/{projects-6DTNDVLH.js.map → projects-P55273AB.js.map} +0 -0
  77. /package/dist/{rebase-55URTXZC.js.map → rebase-4T5FQHNH.js.map} +0 -0
  78. /package/dist/{run-DP2U2CA2.js.map → run-HNOP6WE2.js.map} +0 -0
  79. /package/dist/{summary-J3CJSM7L.js.map → summary-GDT7DTRI.js.map} +0 -0
  80. /package/dist/{test-git-QLAIBJLX.js.map → test-git-YMAE57UP.js.map} +0 -0
  81. /package/dist/{test-prefix-6YM2ZOON.js.map → test-prefix-YCKL6CMT.js.map} +0 -0
  82. /package/dist/{test-tabs-JGO3VOXJ.js.map → test-tabs-3SCJWRKT.js.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  ClaudeBranchNameStrategy,
4
4
  DefaultBranchNamingService,
5
5
  SimpleBranchNameStrategy
6
- } from "./chunk-P2WZIDF3.js";
6
+ } from "./chunk-QIUJPPJQ.js";
7
7
  import "./chunk-6UIGZD2N.js";
8
8
  import "./chunk-UYVWLISQ.js";
9
9
  export {
@@ -11,4 +11,4 @@ export {
11
11
  DefaultBranchNamingService,
12
12
  SimpleBranchNameStrategy
13
13
  };
14
- //# sourceMappingURL=BranchNamingService-TOM2KAUT.js.map
14
+ //# sourceMappingURL=BranchNamingService-GCCWB3LK.js.map
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ClaudeContextManager
4
- } from "./chunk-F4J6KEL6.js";
5
- import "./chunk-ADDNFQJ4.js";
4
+ } from "./chunk-UPUAQYAW.js";
5
+ import "./chunk-POI7KLBH.js";
6
6
  import "./chunk-VWNS6DH5.js";
7
- import "./chunk-75B2HZZ5.js";
8
- import "./chunk-JJUPY5MM.js";
9
- import "./chunk-3NFBZRPR.js";
7
+ import "./chunk-RUC7OULH.js";
8
+ import "./chunk-VAYGNQTE.js";
9
+ import "./chunk-Z5NXYJIG.js";
10
10
  import "./chunk-6UIGZD2N.js";
11
11
  import "./chunk-74VMN2KC.js";
12
12
  import "./chunk-UYVWLISQ.js";
13
13
  export {
14
14
  ClaudeContextManager
15
15
  };
16
- //# sourceMappingURL=ClaudeContextManager-VEGJTS5E.js.map
16
+ //# sourceMappingURL=ClaudeContextManager-DK77227F.js.map
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ClaudeService
4
- } from "./chunk-ADDNFQJ4.js";
4
+ } from "./chunk-POI7KLBH.js";
5
5
  import "./chunk-VWNS6DH5.js";
6
- import "./chunk-75B2HZZ5.js";
7
- import "./chunk-JJUPY5MM.js";
8
- import "./chunk-3NFBZRPR.js";
6
+ import "./chunk-RUC7OULH.js";
7
+ import "./chunk-VAYGNQTE.js";
8
+ import "./chunk-Z5NXYJIG.js";
9
9
  import "./chunk-6UIGZD2N.js";
10
10
  import "./chunk-74VMN2KC.js";
11
11
  import "./chunk-UYVWLISQ.js";
12
12
  export {
13
13
  ClaudeService
14
14
  };
15
- //# sourceMappingURL=ClaudeService-ICSHJMQ5.js.map
15
+ //# sourceMappingURL=ClaudeService-W3SA7HVG.js.map
@@ -5,21 +5,24 @@ import {
5
5
  import "./chunk-VBFDVGAE.js";
6
6
  import {
7
7
  ClaudeContextManager
8
- } from "./chunk-F4J6KEL6.js";
9
- import "./chunk-ADDNFQJ4.js";
8
+ } from "./chunk-UPUAQYAW.js";
9
+ import "./chunk-POI7KLBH.js";
10
+ import {
11
+ getExecutablePath
12
+ } from "./chunk-GYCR2LOU.js";
10
13
  import "./chunk-VWNS6DH5.js";
11
14
  import {
12
15
  generateColorFromBranchName,
13
16
  hexToRgb
14
17
  } from "./chunk-WUQQNE63.js";
15
- import "./chunk-75B2HZZ5.js";
18
+ import "./chunk-RUC7OULH.js";
16
19
  import {
17
20
  openMultipleTerminalWindows,
18
21
  openTerminalWindow
19
- } from "./chunk-JJUPY5MM.js";
22
+ } from "./chunk-VAYGNQTE.js";
20
23
  import {
21
24
  getDotenvFlowFiles
22
- } from "./chunk-3NFBZRPR.js";
25
+ } from "./chunk-Z5NXYJIG.js";
23
26
  import {
24
27
  getLogger
25
28
  } from "./chunk-6UIGZD2N.js";
@@ -198,14 +201,19 @@ var LoomLauncher = class {
198
201
  getLogger().info("Dev server terminal opened");
199
202
  }
200
203
  /**
201
- * Launch standalone terminal (no command, just workspace with env vars)
204
+ * Launch standalone terminal running `il shell <identifier>`
202
205
  */
203
206
  async launchStandaloneTerminal(options) {
207
+ const executable = options.executablePath ?? getExecutablePath();
208
+ const shellIdentifier = String(options.identifier);
209
+ const shellCommand = `${executable} shell ${shellIdentifier}`;
204
210
  const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
205
211
  await openTerminalWindow({
206
212
  workspacePath: options.worktreePath,
213
+ command: shellCommand,
207
214
  ...backgroundColor && { backgroundColor },
208
- includeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),
215
+ // il shell handles env loading internally, so we don't need includeEnvSetup
216
+ includeEnvSetup: false,
209
217
  includePortExport: options.capabilities.includes("web"),
210
218
  ...options.port !== void 0 && { port: options.port }
211
219
  });
@@ -260,17 +268,22 @@ var LoomLauncher = class {
260
268
  };
261
269
  }
262
270
  /**
263
- * Build terminal options for standalone terminal (no command)
271
+ * Build terminal options for standalone terminal
272
+ * Runs `il shell <identifier>` which handles env loading internally
264
273
  */
265
274
  buildStandaloneTerminalOptions(options) {
266
- const hasEnvFile = this.hasAnyEnvFiles(options.worktreePath);
267
275
  const terminalTitle = `Terminal - ${this.formatIdentifier(options.workflowType, options.identifier)}`;
276
+ const executable = options.executablePath ?? getExecutablePath();
277
+ const shellIdentifier = String(options.identifier);
278
+ const shellCommand = `${executable} shell ${shellIdentifier}`;
268
279
  const backgroundColor = options.colorTerminal ?? true ? options.colorHex ? hexToRgb(options.colorHex) : generateColorFromBranchName(options.branchName).rgb : void 0;
269
280
  return {
270
281
  workspacePath: options.worktreePath,
282
+ command: shellCommand,
271
283
  ...backgroundColor && { backgroundColor },
272
284
  title: terminalTitle,
273
- includeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,
285
+ // il shell handles env loading internally, so we don't need includeEnvSetup
286
+ includeEnvSetup: false,
274
287
  includePortExport: options.capabilities.includes("web"),
275
288
  ...options.port !== void 0 && { port: options.port }
276
289
  };
@@ -308,4 +321,4 @@ var LoomLauncher = class {
308
321
  export {
309
322
  LoomLauncher
310
323
  };
311
- //# sourceMappingURL=LoomLauncher-SJBZFZXE.js.map
324
+ //# sourceMappingURL=LoomLauncher-S3YGJRJQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/LoomLauncher.ts","../src/utils/ide.ts"],"sourcesContent":["import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { openTerminalWindow, openMultipleTerminalWindows } from '../utils/terminal.js'\nimport type { TerminalWindowOptions } from '../utils/terminal.js'\nimport { openIdeWindow } from '../utils/ide.js'\nimport { getDevServerLaunchCommand } from '../utils/dev-server.js'\nimport { generateColorFromBranchName, hexToRgb } from '../utils/color.js'\nimport { 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: await this.buildDevServerTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\tif (enableTerminal) {\n\t\t\tterminalsToLaunch.push({\n\t\t\t\ttype: 'terminal',\n\t\t\t\toptions: this.buildStandaloneTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\tif (enableClaude) {\n\t\t\tterminalsToLaunch.push({\n\t\t\t\ttype: 'claude',\n\t\t\t\toptions: await this.buildClaudeTerminalOptions(options),\n\t\t\t})\n\t\t}\n\n\t\t// Launch terminals based on count\n\t\tif (terminalsToLaunch.length > 1) {\n\t\t\t// Multiple terminals - launch as tabs in single window\n\t\t\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 */\n\tprivate async launchDevServerTerminal(options: LaunchLoomOptions): Promise<void> {\n\t\tconst devServerCommand = await getDevServerLaunchCommand(\n\t\t\toptions.worktreePath,\n\t\t\toptions.port,\n\t\t\toptions.capabilities\n\t\t)\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\tawait openTerminalWindow({\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && this.hasAnyEnvFiles(options.worktreePath),\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t})\n\t\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 */\n\tprivate async buildDevServerTerminalOptions(\n\t\toptions: LaunchLoomOptions\n\t): Promise<TerminalWindowOptions> {\n\t\tconst devServerCommand = await getDevServerLaunchCommand(\n\t\t\toptions.worktreePath,\n\t\t\toptions.port,\n\t\t\toptions.capabilities\n\t\t)\n\t\tconst hasEnvFile = this.hasAnyEnvFiles(options.worktreePath)\n\t\tconst devServerTitle = `Dev Server - ${this.formatIdentifier(options.workflowType, options.identifier)}`\n\n\t\t// Only generate color if terminal coloring is enabled (default: true)\n\t\tconst backgroundColor = (options.colorTerminal ?? true)\n\t\t\t? options.colorHex\n\t\t\t\t? hexToRgb(options.colorHex)\n\t\t\t\t: generateColorFromBranchName(options.branchName).rgb\n\t\t\t: undefined\n\n\t\treturn {\n\t\t\tworkspacePath: options.worktreePath,\n\t\t\tcommand: devServerCommand,\n\t\t\t...(backgroundColor && { backgroundColor }),\n\t\t\ttitle: devServerTitle,\n\t\t\tincludeEnvSetup: (options.sourceEnvOnStart ?? false) && hasEnvFile,\n\t\t\tincludePortExport: options.capabilities.includes('web'),\n\t\t\t...(options.port !== undefined && { port: options.port }),\n\t\t}\n\t}\n\n\t/**\n\t * Build terminal options for standalone terminal\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","import { execa } from 'execa'\nimport { logger } from './logger.js'\nimport type { IdeSettings } from '../lib/SettingsManager.js'\n\n// IDE preset configuration\nconst IDE_PRESETS = {\n\tvscode: { command: 'code', name: 'Visual Studio Code', args: [] },\n\tcursor: { command: 'cursor', name: 'Cursor', args: [] },\n\twebstorm: { command: 'webstorm', name: 'WebStorm', args: ['--nosplash'] },\n\tsublime: { command: 'subl', name: 'Sublime Text', args: [] },\n\tintellij: { command: 'idea', name: 'IntelliJ IDEA', args: ['--nosplash'] },\n\twindsurf: { command: 'surf', name: 'Windsurf', args: [] },\n\tantigravity: { command: 'agy', name: 'Antigravity', args: [] },\n} as const\n\ntype IdePreset = keyof typeof IDE_PRESETS\n\n// Resolve IDE configuration to command and args\nexport function getIdeConfig(ideSettings?: IdeSettings): {\n\tcommand: string\n\targs: string[]\n\tname: string\n} {\n\t// Default to vscode if not configured\n\tconst type = ideSettings?.type ?? 'vscode'\n\n\tconst preset = IDE_PRESETS[type as IdePreset]\n\treturn {\n\t\tcommand: preset.command,\n\t\targs: [...preset.args],\n\t\tname: preset.name,\n\t}\n}\n\n// Check if IDE is available\nexport async function isIdeAvailable(command: string): Promise<boolean> {\n\ttry {\n\t\tawait execa('command', ['-v', command], { shell: true, timeout: 5000 })\n\t\treturn true\n\t} catch {\n\t\treturn false\n\t}\n}\n\n// Get installation hint for IDE\nfunction getInstallHint(type: string): string {\n\tconst hints: Record<string, string> = {\n\t\tvscode:\n\t\t\t'Install command-line tools: Open VSCode > Command Palette > \"Shell Command: Install \\'code\\' command in PATH\"',\n\t\tcursor:\n\t\t\t'Install command-line tools: Open Cursor > Command Palette > \"Install \\'cursor\\' command in PATH\"',\n\t\twebstorm: 'Install via JetBrains Toolbox > Settings > Shell Scripts > Enable',\n\t\tsublime:\n\t\t\t'Create symlink: ln -s \"/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl\" /usr/local/bin/subl',\n\t\tintellij: 'Install via JetBrains Toolbox > Settings > Shell Scripts > Enable',\n\t\twindsurf:\n\t\t\t'Install command-line tools during Windsurf installation or create symlink manually',\n\t\tantigravity:\n\t\t\t'Install command-line tools during Antigravity installation or create symlink manually',\n\t}\n\treturn hints[type] ?? `Ensure the IDE command is available in your PATH`\n}\n\n// Open IDE window for workspace\nexport async function openIdeWindow(\n\tworkspacePath: string,\n\tideSettings?: IdeSettings\n): Promise<void> {\n\tconst config = getIdeConfig(ideSettings)\n\tconst available = await isIdeAvailable(config.command)\n\n\tif (!available) {\n\t\tconst type = ideSettings?.type ?? 'vscode'\n\t\tthrow new Error(\n\t\t\t`${config.name} is not available. The \"${config.command}\" command was not found in PATH.\\n` +\n\t\t\t\tgetInstallHint(type)\n\t\t)\n\t}\n\n\ttry {\n\t\tawait execa(config.command, [...config.args, workspacePath])\n\t\tlogger.debug(`Opened ${config.name} for workspace: ${workspacePath}`)\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to open ${config.name}: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t)\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MetadataManager
4
- } from "./chunk-MLS5FAV7.js";
4
+ } from "./chunk-IJ7IGJT3.js";
5
5
  import {
6
6
  SettingsManager
7
7
  } from "./chunk-VWNS6DH5.js";
@@ -644,4 +644,4 @@ export {
644
644
  checkRemoteBranchStatus,
645
645
  getMergeTargetBranch
646
646
  };
647
- //# sourceMappingURL=chunk-TR5MC2U6.js.map
647
+ //# sourceMappingURL=chunk-2W2FBL5G.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  extractIssueNumber,
4
4
  extractPRNumber
5
- } from "./chunk-TR5MC2U6.js";
5
+ } from "./chunk-2W2FBL5G.js";
6
6
 
7
7
  // src/utils/IdentifierParser.ts
8
8
  var IdentifierParser = class {
@@ -85,4 +85,4 @@ var IdentifierParser = class {
85
85
  export {
86
86
  IdentifierParser
87
87
  };
88
- //# sourceMappingURL=chunk-HVGQP44L.js.map
88
+ //# sourceMappingURL=chunk-55TB3FSG.js.map
@@ -4,17 +4,17 @@ import {
4
4
  findMainWorktreePathWithSettings,
5
5
  findWorktreeForBranch,
6
6
  getMergeTargetBranch
7
- } from "./chunk-TR5MC2U6.js";
7
+ } from "./chunk-2W2FBL5G.js";
8
8
  import {
9
9
  MetadataManager
10
- } from "./chunk-MLS5FAV7.js";
10
+ } from "./chunk-IJ7IGJT3.js";
11
11
  import {
12
12
  SettingsManager
13
13
  } from "./chunk-VWNS6DH5.js";
14
14
  import {
15
15
  detectClaudeCli,
16
16
  launchClaude
17
- } from "./chunk-75B2HZZ5.js";
17
+ } from "./chunk-RUC7OULH.js";
18
18
  import {
19
19
  getLogger
20
20
  } from "./chunk-6UIGZD2N.js";
@@ -365,4 +365,4 @@ To recover:
365
365
  export {
366
366
  MergeManager
367
367
  };
368
- //# sourceMappingURL=chunk-LTNDJMTH.js.map
368
+ //# sourceMappingURL=chunk-BIIQHEXJ.js.map
@@ -4,17 +4,17 @@ import {
4
4
  } from "./chunk-UYWAESOT.js";
5
5
  import {
6
6
  GitWorktreeManager
7
- } from "./chunk-M5XUCTTJ.js";
7
+ } from "./chunk-JC5HXN75.js";
8
8
  import {
9
9
  parseGitRemotes
10
10
  } from "./chunk-PSFVTBM7.js";
11
11
  import {
12
12
  isFileGitignored
13
- } from "./chunk-TR5MC2U6.js";
13
+ } from "./chunk-2W2FBL5G.js";
14
14
  import {
15
15
  detectClaudeCli,
16
16
  launchClaude
17
- } from "./chunk-75B2HZZ5.js";
17
+ } from "./chunk-RUC7OULH.js";
18
18
  import {
19
19
  PromptTemplateManager
20
20
  } from "./chunk-74VMN2KC.js";
@@ -700,4 +700,4 @@ export {
700
700
  ShellCompletion,
701
701
  InitCommand
702
702
  };
703
- //# sourceMappingURL=chunk-KM3W7YQX.js.map
703
+ //# sourceMappingURL=chunk-G6CIIJLT.js.map
@@ -23,10 +23,10 @@ import {
23
23
  hasUncommittedChanges,
24
24
  isBranchMergedIntoMain,
25
25
  isFileTrackedByGit
26
- } from "./chunk-TR5MC2U6.js";
26
+ } from "./chunk-2W2FBL5G.js";
27
27
  import {
28
28
  MetadataManager
29
- } from "./chunk-MLS5FAV7.js";
29
+ } from "./chunk-IJ7IGJT3.js";
30
30
  import {
31
31
  SettingsManager
32
32
  } from "./chunk-VWNS6DH5.js";
@@ -40,15 +40,16 @@ import {
40
40
  } from "./chunk-WUQQNE63.js";
41
41
  import {
42
42
  generateDeterministicSessionId
43
- } from "./chunk-75B2HZZ5.js";
43
+ } from "./chunk-RUC7OULH.js";
44
44
  import {
45
45
  findEnvFileForDatabaseUrl,
46
46
  formatEnvLine,
47
47
  hasVariableInAnyEnvFile,
48
+ isNoEnvFilesFoundError,
48
49
  loadEnvIntoProcess,
49
50
  parseEnvFile,
50
51
  validateEnvVariable
51
- } from "./chunk-3NFBZRPR.js";
52
+ } from "./chunk-Z5NXYJIG.js";
52
53
  import {
53
54
  getLogger
54
55
  } from "./chunk-6UIGZD2N.js";
@@ -300,7 +301,7 @@ var LoomManager = class {
300
301
  }
301
302
  }
302
303
  let cliSymlinks = void 0;
303
- if (capabilities.includes("cli")) {
304
+ if (capabilities.includes("cli") && input.type !== "branch") {
304
305
  try {
305
306
  cliSymlinks = await this.cliIsolation.setupCLIIsolation(
306
307
  worktreePath,
@@ -347,8 +348,8 @@ var LoomManager = class {
347
348
  const setArguments = (_j = input.options) == null ? void 0 : _j.setArguments;
348
349
  const executablePath = (_k = input.options) == null ? void 0 : _k.executablePath;
349
350
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
350
- const { LoomLauncher } = await import("./LoomLauncher-SJBZFZXE.js");
351
- const { ClaudeContextManager } = await import("./ClaudeContextManager-VEGJTS5E.js");
351
+ const { LoomLauncher } = await import("./LoomLauncher-S3YGJRJQ.js");
352
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-DK77227F.js");
352
353
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
353
354
  const launcher = new LoomLauncher(claudeContext, this.settings);
354
355
  await launcher.launchLoom({
@@ -385,6 +386,7 @@ var LoomManager = class {
385
386
  issueTracker: this.issueTracker.providerName,
386
387
  colorHex: colorData.hex,
387
388
  sessionId,
389
+ projectPath: this.gitWorktree.workingDirectory,
388
390
  ...input.parentLoom && { parentLoom: input.parentLoom }
389
391
  };
390
392
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
@@ -473,7 +475,7 @@ var LoomManager = class {
473
475
  async checkAndWarnChildLooms(branchName) {
474
476
  let targetBranch = branchName;
475
477
  if (!targetBranch) {
476
- const { getCurrentBranch } = await import("./git-OXJACVAU.js");
478
+ const { getCurrentBranch } = await import("./git-4BVOOOOV.js");
477
479
  targetBranch = await getCurrentBranch();
478
480
  }
479
481
  if (!targetBranch) {
@@ -697,7 +699,11 @@ var LoomManager = class {
697
699
  loadMainEnvFile() {
698
700
  const result = loadEnvIntoProcess({ path: process.cwd() });
699
701
  if (result.error) {
700
- getLogger().warn(`Warning: Could not load .env files: ${result.error.message}`);
702
+ if (isNoEnvFilesFoundError(result.error)) {
703
+ getLogger().debug("No .env files found (this is normal for projects without environment files)");
704
+ } else {
705
+ getLogger().warn(`Warning: Could not load .env files: ${result.error.message}`);
706
+ }
701
707
  } else {
702
708
  getLogger().info("Loaded environment variables using dotenv-flow");
703
709
  if (result.parsed && Object.keys(result.parsed).length > 0) {
@@ -894,8 +900,8 @@ var LoomManager = class {
894
900
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
895
901
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
896
902
  getLogger().info("Launching workspace components...");
897
- const { LoomLauncher } = await import("./LoomLauncher-SJBZFZXE.js");
898
- const { ClaudeContextManager } = await import("./ClaudeContextManager-VEGJTS5E.js");
903
+ const { LoomLauncher } = await import("./LoomLauncher-S3YGJRJQ.js");
904
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-DK77227F.js");
899
905
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
900
906
  const launcher = new LoomLauncher(claudeContext, this.settings);
901
907
  await launcher.launchLoom({
@@ -933,6 +939,7 @@ var LoomManager = class {
933
939
  issueTracker: this.issueTracker.providerName,
934
940
  colorHex,
935
941
  sessionId,
942
+ projectPath: this.gitWorktree.workingDirectory,
936
943
  ...input.parentLoom && { parentLoom: input.parentLoom }
937
944
  };
938
945
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
@@ -2281,4 +2288,4 @@ export {
2281
2288
  DatabaseManager,
2282
2289
  ResourceCleanup
2283
2290
  };
2284
- //# sourceMappingURL=chunk-NFVFVYAP.js.map
2291
+ //# sourceMappingURL=chunk-IARWMDAX.js.map