@iloom/cli 0.3.2 → 0.3.4

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 (112) hide show
  1. package/README.md +3 -3
  2. package/dist/{BranchNamingService-JYO746H7.js → BranchNamingService-A77VI6AI.js} +2 -2
  3. package/dist/ClaudeContextManager-BN7RE5ZQ.js +15 -0
  4. package/dist/ClaudeService-DLYLJUPA.js +14 -0
  5. package/dist/{GitHubService-UAMH7DMF.js → GitHubService-FZHHBOFG.js} +3 -3
  6. package/dist/{LoomLauncher-FVZECY3C.js → LoomLauncher-ZV3ZZIBA.js} +23 -20
  7. package/dist/LoomLauncher-ZV3ZZIBA.js.map +1 -0
  8. package/dist/{PromptTemplateManager-A52RUAMS.js → PromptTemplateManager-6HH3PVXV.js} +2 -2
  9. package/dist/README.md +3 -3
  10. package/dist/{SettingsManager-MTVX57WR.js → SettingsManager-I2LRCW2A.js} +2 -2
  11. package/dist/{SettingsMigrationManager-AGIIIPDQ.js → SettingsMigrationManager-TJ7UWZG5.js} +3 -3
  12. package/dist/agents/iloom-issue-complexity-evaluator.md +18 -3
  13. package/dist/agents/iloom-issue-enhancer.md +1 -1
  14. package/dist/{chunk-OAP6SASD.js → chunk-2CXREBLZ.js} +2 -2
  15. package/dist/{chunk-KG343GSG.js → chunk-2IJEMXOB.js} +359 -99
  16. package/dist/chunk-2IJEMXOB.js.map +1 -0
  17. package/dist/{chunk-FOV7RRQ2.js → chunk-2MAIX45J.js} +4 -4
  18. package/dist/{chunk-5NTD4MCZ.js → chunk-5Q3NDNNV.js} +29 -5
  19. package/dist/chunk-5Q3NDNNV.js.map +1 -0
  20. package/dist/{chunk-GVICXJHW.js → chunk-5VK4NRSF.js} +2 -2
  21. package/dist/{chunk-C7ASXK6J.js → chunk-AKUJXDNW.js} +2 -2
  22. package/dist/{chunk-UCZ24SUE.js → chunk-CDZERT7Z.js} +21 -9
  23. package/dist/chunk-CDZERT7Z.js.map +1 -0
  24. package/dist/{chunk-JKXJ7BGL.js → chunk-CE26YH2U.js} +42 -3
  25. package/dist/chunk-CE26YH2U.js.map +1 -0
  26. package/dist/{chunk-ZZZWQGTS.js → chunk-CFFQ2Z7A.js} +74 -75
  27. package/dist/chunk-CFFQ2Z7A.js.map +1 -0
  28. package/dist/{chunk-FXMLNKLT.js → chunk-DLHA5VQ3.js} +174 -5
  29. package/dist/chunk-DLHA5VQ3.js.map +1 -0
  30. package/dist/{chunk-GOG3ZB7O.js → chunk-IFB4Z76W.js} +23 -4
  31. package/dist/chunk-IFB4Z76W.js.map +1 -0
  32. package/dist/{chunk-F4ENT6AC.js → chunk-M7JJCX53.js} +2 -2
  33. package/dist/{chunk-KLBYVHPK.js → chunk-OSCLCMDG.js} +2 -2
  34. package/dist/{chunk-ZLIHIUDQ.js → chunk-OYF4VIFI.js} +2 -2
  35. package/dist/{chunk-A2P7NZTB.js → chunk-PGPI5LR4.js} +4 -4
  36. package/dist/{chunk-WEN5C5DM.js → chunk-RIEO2WML.js} +4 -1
  37. package/dist/chunk-RIEO2WML.js.map +1 -0
  38. package/dist/{chunk-UERERX6M.js → chunk-SUOXY5WJ.js} +2 -2
  39. package/dist/{init-7IIM35LQ.js → chunk-UAN4A3YU.js} +343 -46
  40. package/dist/chunk-UAN4A3YU.js.map +1 -0
  41. package/dist/{claude-KIZYXTSG.js → claude-W52VKI6L.js} +2 -2
  42. package/dist/{cleanup-6WYUD5SN.js → cleanup-H4VXU3C3.js} +12 -12
  43. package/dist/cli.js +188 -91
  44. package/dist/cli.js.map +1 -1
  45. package/dist/{color-ZVALX37U.js → color-F7RU6B6Z.js} +10 -4
  46. package/dist/{contribute-7YJHZTO7.js → contribute-Y7IQV5QY.js} +4 -4
  47. package/dist/{feedback-752MGDPG.js → feedback-XTUCKJNT.js} +11 -9
  48. package/dist/{feedback-752MGDPG.js.map → feedback-XTUCKJNT.js.map} +1 -1
  49. package/dist/{git-TAFVDB3J.js → git-IYA53VIC.js} +7 -3
  50. package/dist/{ignite-OAMDUN27.js → ignite-T74RYXCA.js} +19 -71
  51. package/dist/ignite-T74RYXCA.js.map +1 -0
  52. package/dist/index.d.ts +52 -8
  53. package/dist/index.js +132 -84
  54. package/dist/index.js.map +1 -1
  55. package/dist/init-4FHTAM3F.js +19 -0
  56. package/dist/{neon-helpers-5HBYO2VP.js → neon-helpers-77PBPGJ5.js} +3 -3
  57. package/dist/{open-FCHKQ77R.js → open-UMXANW5S.js} +4 -4
  58. package/dist/{prompt-7INJ7YRU.js → prompt-QALMYTVC.js} +4 -2
  59. package/dist/prompt-QALMYTVC.js.map +1 -0
  60. package/dist/prompts/init-prompt.txt +82 -8
  61. package/dist/prompts/issue-prompt.txt +18 -11
  62. package/dist/prompts/regular-prompt.txt +373 -14
  63. package/dist/{rebase-Q7WXK566.js → rebase-VJ2VKR6R.js} +11 -11
  64. package/dist/rebase-VJ2VKR6R.js.map +1 -0
  65. package/dist/{run-SJPM6YRI.js → run-MJYY4PUT.js} +4 -4
  66. package/dist/schema/settings.schema.json +21 -3
  67. package/dist/{test-git-DEUE656D.js → test-git-IT5EWQ5C.js} +3 -3
  68. package/dist/{test-prefix-Y6Z6ZHSF.js → test-prefix-NPWDPUUH.js} +3 -3
  69. package/package.json +2 -1
  70. package/dist/ClaudeContextManager-5WPRJIIW.js +0 -15
  71. package/dist/ClaudeService-Z4KA7QOW.js +0 -14
  72. package/dist/LoomLauncher-FVZECY3C.js.map +0 -1
  73. package/dist/chunk-5NTD4MCZ.js.map +0 -1
  74. package/dist/chunk-FXMLNKLT.js.map +0 -1
  75. package/dist/chunk-GOG3ZB7O.js.map +0 -1
  76. package/dist/chunk-JKXJ7BGL.js.map +0 -1
  77. package/dist/chunk-KG343GSG.js.map +0 -1
  78. package/dist/chunk-PRE7KTM4.js +0 -302
  79. package/dist/chunk-PRE7KTM4.js.map +0 -1
  80. package/dist/chunk-UCZ24SUE.js.map +0 -1
  81. package/dist/chunk-WEN5C5DM.js.map +0 -1
  82. package/dist/chunk-ZZZWQGTS.js.map +0 -1
  83. package/dist/ignite-OAMDUN27.js.map +0 -1
  84. package/dist/init-7IIM35LQ.js.map +0 -1
  85. package/dist/rebase-Q7WXK566.js.map +0 -1
  86. /package/dist/{BranchNamingService-JYO746H7.js.map → BranchNamingService-A77VI6AI.js.map} +0 -0
  87. /package/dist/{ClaudeContextManager-5WPRJIIW.js.map → ClaudeContextManager-BN7RE5ZQ.js.map} +0 -0
  88. /package/dist/{ClaudeService-Z4KA7QOW.js.map → ClaudeService-DLYLJUPA.js.map} +0 -0
  89. /package/dist/{GitHubService-UAMH7DMF.js.map → GitHubService-FZHHBOFG.js.map} +0 -0
  90. /package/dist/{PromptTemplateManager-A52RUAMS.js.map → PromptTemplateManager-6HH3PVXV.js.map} +0 -0
  91. /package/dist/{SettingsManager-MTVX57WR.js.map → SettingsManager-I2LRCW2A.js.map} +0 -0
  92. /package/dist/{SettingsMigrationManager-AGIIIPDQ.js.map → SettingsMigrationManager-TJ7UWZG5.js.map} +0 -0
  93. /package/dist/{chunk-OAP6SASD.js.map → chunk-2CXREBLZ.js.map} +0 -0
  94. /package/dist/{chunk-FOV7RRQ2.js.map → chunk-2MAIX45J.js.map} +0 -0
  95. /package/dist/{chunk-GVICXJHW.js.map → chunk-5VK4NRSF.js.map} +0 -0
  96. /package/dist/{chunk-C7ASXK6J.js.map → chunk-AKUJXDNW.js.map} +0 -0
  97. /package/dist/{chunk-F4ENT6AC.js.map → chunk-M7JJCX53.js.map} +0 -0
  98. /package/dist/{chunk-KLBYVHPK.js.map → chunk-OSCLCMDG.js.map} +0 -0
  99. /package/dist/{chunk-ZLIHIUDQ.js.map → chunk-OYF4VIFI.js.map} +0 -0
  100. /package/dist/{chunk-A2P7NZTB.js.map → chunk-PGPI5LR4.js.map} +0 -0
  101. /package/dist/{chunk-UERERX6M.js.map → chunk-SUOXY5WJ.js.map} +0 -0
  102. /package/dist/{claude-KIZYXTSG.js.map → claude-W52VKI6L.js.map} +0 -0
  103. /package/dist/{cleanup-6WYUD5SN.js.map → cleanup-H4VXU3C3.js.map} +0 -0
  104. /package/dist/{color-ZVALX37U.js.map → color-F7RU6B6Z.js.map} +0 -0
  105. /package/dist/{contribute-7YJHZTO7.js.map → contribute-Y7IQV5QY.js.map} +0 -0
  106. /package/dist/{git-TAFVDB3J.js.map → git-IYA53VIC.js.map} +0 -0
  107. /package/dist/{neon-helpers-5HBYO2VP.js.map → init-4FHTAM3F.js.map} +0 -0
  108. /package/dist/{prompt-7INJ7YRU.js.map → neon-helpers-77PBPGJ5.js.map} +0 -0
  109. /package/dist/{open-FCHKQ77R.js.map → open-UMXANW5S.js.map} +0 -0
  110. /package/dist/{run-SJPM6YRI.js.map → run-MJYY4PUT.js.map} +0 -0
  111. /package/dist/{test-git-DEUE656D.js.map → test-git-IT5EWQ5C.js.map} +0 -0
  112. /package/dist/{test-prefix-Y6Z6ZHSF.js.map → test-prefix-NPWDPUUH.js.map} +0 -0
package/dist/index.js CHANGED
@@ -272,12 +272,18 @@ var init_SettingsManager = __esm({
272
272
  remote: z.string().optional()
273
273
  }).optional().describe("Merge behavior configuration: local (merge locally) or github-pr (create PR)"),
274
274
  ide: z.object({
275
- type: z.enum(["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf"]).default("vscode").describe(
276
- "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor)."
275
+ type: z.enum(["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf", "antigravity"]).default("vscode").describe(
276
+ "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor), antigravity (Antigravity IDE)."
277
277
  )
278
278
  }).optional().describe(
279
- "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, and Windsurf. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf)."
280
- )
279
+ "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, Windsurf, and Antigravity. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity)."
280
+ ),
281
+ colors: z.object({
282
+ terminal: z.boolean().default(true).describe("Apply terminal background colors based on branch name (macOS only)"),
283
+ vscode: z.boolean().default(false).describe(
284
+ "Apply VSCode/Cursor title bar colors based on branch name. Note: This modifies .vscode/settings.json which may be in source control. Default is false for safety; enable via init or explicitly if .vscode is gitignored."
285
+ )
286
+ }).optional().describe("Color synchronization settings for workspace identification")
281
287
  });
282
288
  IloomSettingsSchemaNoDefaults = z.object({
283
289
  mainBranch: z.string().min(1, "Settings 'mainBranch' cannot be empty").optional().describe("Name of the main/primary branch for the repository"),
@@ -328,12 +334,18 @@ var init_SettingsManager = __esm({
328
334
  remote: z.string().optional()
329
335
  }).optional().describe("Merge behavior configuration: local (merge locally) or github-pr (create PR)"),
330
336
  ide: z.object({
331
- type: z.enum(["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf"]).optional().describe(
332
- "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor)."
337
+ type: z.enum(["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf", "antigravity"]).optional().describe(
338
+ "IDE to launch when starting a loom. Options: vscode (Visual Studio Code), cursor (Cursor AI editor), webstorm (JetBrains WebStorm), sublime (Sublime Text), intellij (JetBrains IntelliJ IDEA), windsurf (Windsurf editor), antigravity (Antigravity IDE)."
333
339
  )
334
340
  }).optional().describe(
335
- "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, and Windsurf. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf)."
336
- )
341
+ "IDE configuration for workspace launches. Controls which editor opens when you start a loom. Supports VSCode, Cursor, WebStorm, Sublime Text, IntelliJ, Windsurf, and Antigravity. Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity)."
342
+ ),
343
+ colors: z.object({
344
+ terminal: z.boolean().optional().describe("Apply terminal background colors based on branch name (macOS only)"),
345
+ vscode: z.boolean().optional().describe(
346
+ "Apply VSCode/Cursor title bar colors based on branch name. Note: This modifies .vscode/settings.json which may be in source control."
347
+ )
348
+ }).optional().describe("Color synchronization settings for workspace identification")
337
349
  });
338
350
  SettingsManager = class {
339
351
  /**
@@ -543,99 +555,52 @@ ${errorMessages.join("\n")}`
543
555
  // src/utils/color.ts
544
556
  var color_exports = {};
545
557
  __export(color_exports, {
558
+ MIN_COLOR_DISTANCE: () => MIN_COLOR_DISTANCE,
546
559
  calculateForegroundColor: () => calculateForegroundColor,
560
+ colorDistance: () => colorDistance,
547
561
  generateColorFromBranchName: () => generateColorFromBranchName,
548
562
  getColorPalette: () => getColorPalette,
549
563
  hexToRgb: () => hexToRgb,
550
564
  lightenColor: () => lightenColor,
551
565
  rgbToHex: () => rgbToHex,
552
- saturateColor: () => saturateColor
566
+ saturateColor: () => saturateColor,
567
+ selectDistinctColor: () => selectDistinctColor
553
568
  });
554
569
  import { createHash as createHash2 } from "crypto";
555
570
  function getColorPalette() {
556
571
  return [
557
- // First 10 colors preserved for backward compatibility
558
- { r: 220, g: 235, b: 248 },
572
+ { r: 220, g: 235, b: 255 },
559
573
  // 0: Soft blue
560
- { r: 248, g: 220, b: 235 },
574
+ { r: 255, g: 220, b: 235 },
561
575
  // 1: Soft pink
562
- { r: 220, g: 248, b: 235 },
576
+ { r: 220, g: 255, b: 235 },
563
577
  // 2: Soft green
564
- { r: 248, g: 240, b: 220 },
578
+ { r: 255, g: 245, b: 220 },
565
579
  // 3: Soft cream
566
- { r: 240, g: 220, b: 248 },
580
+ { r: 245, g: 220, b: 255 },
567
581
  // 4: Soft lavender
568
- { r: 220, g: 240, b: 248 },
582
+ { r: 220, g: 245, b: 255 },
569
583
  // 5: Soft cyan
570
584
  { r: 235, g: 235, b: 235 },
571
585
  // 6: Soft grey
572
- { r: 228, g: 238, b: 248 },
573
- // 7: Soft ice blue
574
- { r: 248, g: 228, b: 238 },
575
- // 8: Soft rose
576
- { r: 228, g: 248, b: 238 },
577
- // 9: Soft mint
578
- // 30 new colors (indices 10-39)
579
- { r: 235, g: 245, b: 250 },
580
- // 10: Pale sky blue
581
- { r: 250, g: 235, b: 245 },
582
- // 11: Pale orchid
583
- { r: 235, g: 250, b: 245 },
584
- // 12: Pale seafoam
585
- { r: 250, g: 245, b: 235 },
586
- // 13: Pale peach
587
- { r: 245, g: 235, b: 250 },
588
- // 14: Pale periwinkle
589
- { r: 235, g: 245, b: 235 },
590
- // 15: Pale sage
591
- { r: 245, g: 250, b: 235 },
592
- // 16: Pale lemon
593
- { r: 245, g: 235, b: 235 },
594
- // 17: Pale blush
595
- { r: 235, g: 235, b: 250 },
596
- // 18: Pale lavender blue
597
- { r: 250, g: 235, b: 235 },
598
- // 19: Pale coral
599
- { r: 235, g: 250, b: 250 },
600
- // 20: Pale aqua
601
- { r: 240, g: 248, b: 255 },
602
- // 21: Alice blue
603
- { r: 255, g: 240, b: 248 },
604
- // 22: Lavender blush
605
- { r: 240, g: 255, b: 248 },
606
- // 23: Honeydew tint
607
- { r: 255, g: 248, b: 240 },
608
- // 24: Antique white
609
- { r: 248, g: 240, b: 255 },
610
- // 25: Magnolia
611
- { r: 240, g: 248, b: 240 },
612
- // 26: Mint cream tint
613
- { r: 248, g: 255, b: 240 },
614
- // 27: Ivory tint
615
- { r: 248, g: 240, b: 240 },
616
- // 28: Misty rose tint
617
- { r: 240, g: 240, b: 255 },
618
- // 29: Ghost white tint
619
- { r: 255, g: 245, b: 238 },
620
- // 30: Seashell
621
- { r: 245, g: 255, b: 250 },
622
- // 31: Azure mist
623
- { r: 250, g: 245, b: 255 },
624
- // 32: Lilac mist
625
- { r: 255, g: 250, b: 245 },
626
- // 33: Snow peach
627
- { r: 238, g: 245, b: 255 },
628
- // 34: Powder blue
629
- { r: 255, g: 238, b: 245 },
630
- // 35: Pink lace
631
- { r: 245, g: 255, b: 238 },
632
- // 36: Pale lime
633
- { r: 238, g: 255, b: 245 },
634
- // 37: Pale turquoise
635
- { r: 245, g: 238, b: 255 },
636
- // 38: Pale violet
637
- { r: 255, g: 245, b: 255 }
638
- // 39: Pale magenta
586
+ { r: 255, g: 230, b: 230 },
587
+ // 7: Soft coral
588
+ { r: 230, g: 255, b: 230 },
589
+ // 8: Soft mint
590
+ { r: 255, g: 245, b: 230 },
591
+ // 9: Soft peach
592
+ { r: 220, g: 255, b: 255 },
593
+ // 10: Soft aqua
594
+ { r: 255, g: 220, b: 255 },
595
+ // 11: Soft magenta
596
+ { r: 255, g: 255, b: 220 },
597
+ // 12: Soft yellow
598
+ { r: 235, g: 220, b: 255 },
599
+ // 13: Soft violet
600
+ { r: 220, g: 255, b: 245 },
601
+ // 14: Soft sea green
602
+ { r: 255, g: 235, b: 220 }
603
+ // 15: Soft salmon
639
604
  ];
640
605
  }
641
606
  function rgbToHex(r, g, b) {
@@ -675,6 +640,51 @@ function generateColorFromBranchName(branchName) {
675
640
  index
676
641
  };
677
642
  }
643
+ function colorDistance(a, b) {
644
+ return Math.sqrt(
645
+ Math.pow(a.r - b.r, 2) + Math.pow(a.g - b.g, 2) + Math.pow(a.b - b.b, 2)
646
+ );
647
+ }
648
+ function selectDistinctColor(branchName, usedHexColors) {
649
+ const palette = getColorPalette();
650
+ const hashBasedColor = generateColorFromBranchName(branchName);
651
+ if (usedHexColors.length === 0) {
652
+ return hashBasedColor;
653
+ }
654
+ const usedRgbColors = [];
655
+ for (const hex of usedHexColors) {
656
+ try {
657
+ usedRgbColors.push(hexToRgb(hex));
658
+ } catch {
659
+ logger_default.debug(`[selectDistinctColor] Skipping invalid hex color: ${hex}`);
660
+ }
661
+ }
662
+ if (usedRgbColors.length === 0) {
663
+ return hashBasedColor;
664
+ }
665
+ const isTooSimilar = usedRgbColors.some(
666
+ (usedRgb) => colorDistance(hashBasedColor.rgb, usedRgb) < MIN_COLOR_DISTANCE
667
+ );
668
+ if (!isTooSimilar) {
669
+ return hashBasedColor;
670
+ }
671
+ for (let i = 0; i < palette.length; i++) {
672
+ const candidateRgb = palette[i];
673
+ if (!candidateRgb) continue;
674
+ const isDistinct = usedRgbColors.every(
675
+ (usedRgb) => colorDistance(candidateRgb, usedRgb) >= MIN_COLOR_DISTANCE
676
+ );
677
+ if (isDistinct) {
678
+ return {
679
+ rgb: candidateRgb,
680
+ hex: rgbToHex(candidateRgb.r, candidateRgb.g, candidateRgb.b),
681
+ index: i
682
+ };
683
+ }
684
+ }
685
+ logger_default.debug(`[selectDistinctColor] No distinct color found, falling back to hash-based for ${branchName}`);
686
+ return hashBasedColor;
687
+ }
678
688
  function lightenColor(rgb, amount) {
679
689
  const clamp = (value) => Math.min(255, Math.max(0, Math.round(value)));
680
690
  return {
@@ -703,10 +713,12 @@ function calculateForegroundColor(rgb) {
703
713
  const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
704
714
  return luminance > 0.5 ? "#000000" : "#ffffff";
705
715
  }
716
+ var MIN_COLOR_DISTANCE;
706
717
  var init_color = __esm({
707
718
  "src/utils/color.ts"() {
708
719
  "use strict";
709
720
  init_logger();
721
+ MIN_COLOR_DISTANCE = 20;
710
722
  }
711
723
  });
712
724
 
@@ -959,7 +971,7 @@ async function branchExists(branchName, path6 = process.cwd(), includeRemote = t
959
971
  return false;
960
972
  }
961
973
  }
962
- async function getRepoRoot(path6 = process.cwd()) {
974
+ async function getWorktreeRoot(path6 = process.cwd()) {
963
975
  try {
964
976
  const result = await executeGitCommand(["rev-parse", "--show-toplevel"], { cwd: path6 });
965
977
  return result.trim();
@@ -967,6 +979,20 @@ async function getRepoRoot(path6 = process.cwd()) {
967
979
  return null;
968
980
  }
969
981
  }
982
+ async function getRepoRoot(path6 = process.cwd()) {
983
+ try {
984
+ const gitCommonDir = await executeGitCommand(
985
+ ["rev-parse", "--path-format=absolute", "--git-common-dir"],
986
+ { cwd: path6 }
987
+ );
988
+ const trimmedPath = gitCommonDir.trim();
989
+ const repoRoot = trimmedPath.replace(/\/\.git\/worktrees\/[^/]+$/, "").replace(/\/\.git$/, "");
990
+ return repoRoot;
991
+ } catch (error) {
992
+ logger.warn(`Failed to determine repo root from git-common-dir: ${path6}`, error instanceof Error ? error.message : String(error));
993
+ return null;
994
+ }
995
+ }
970
996
  async function findMainWorktreePath(path6 = process.cwd(), options) {
971
997
  try {
972
998
  const output = await executeGitCommand(["worktree", "list", "--porcelain"], { cwd: path6 });
@@ -1165,6 +1191,14 @@ async function isFileTrackedByGit(filePath, cwd = process.cwd()) {
1165
1191
  throw error;
1166
1192
  }
1167
1193
  }
1194
+ async function isFileGitignored(filePath, cwd = process.cwd()) {
1195
+ try {
1196
+ await executeGitCommand(["check-ignore", "-q", filePath], { cwd });
1197
+ return true;
1198
+ } catch {
1199
+ return false;
1200
+ }
1201
+ }
1168
1202
 
1169
1203
  // src/lib/GitWorktreeManager.ts
1170
1204
  var GitWorktreeManager = class {
@@ -3382,6 +3416,9 @@ var PromptTemplateManager = class {
3382
3416
  if (variables.SETTINGS_SCHEMA_CONTENT !== void 0) {
3383
3417
  result = result.replace(/SETTINGS_SCHEMA_CONTENT/g, variables.SETTINGS_SCHEMA_CONTENT);
3384
3418
  }
3419
+ if (variables.VSCODE_SETTINGS_GITIGNORED !== void 0) {
3420
+ result = result.replace(/VSCODE_SETTINGS_GITIGNORED/g, variables.VSCODE_SETTINGS_GITIGNORED);
3421
+ }
3385
3422
  return result;
3386
3423
  }
3387
3424
  /**
@@ -3627,6 +3664,14 @@ var ClaudeContextManager = class {
3627
3664
  }
3628
3665
  };
3629
3666
 
3667
+ // src/types/index.ts
3668
+ var UserAbortedCommitError = class extends Error {
3669
+ constructor(message = "User aborted the commit") {
3670
+ super(message);
3671
+ this.name = "UserAbortedCommitError";
3672
+ }
3673
+ };
3674
+
3630
3675
  // src/utils/index.ts
3631
3676
  init_logger();
3632
3677
 
@@ -3939,6 +3984,7 @@ export {
3939
3984
  IssueTrackerFactory,
3940
3985
  LinearMarkupConverter,
3941
3986
  TableFormatter,
3987
+ UserAbortedCommitError,
3942
3988
  WorkspaceManager,
3943
3989
  branchExists,
3944
3990
  createLogger,
@@ -3953,8 +3999,10 @@ export {
3953
3999
  getCurrentBranch,
3954
4000
  getDefaultBranch,
3955
4001
  getRepoRoot,
4002
+ getWorktreeRoot,
3956
4003
  hasUncommittedChanges,
3957
4004
  isEmptyRepository,
4005
+ isFileGitignored,
3958
4006
  isFileTrackedByGit,
3959
4007
  isPRBranch,
3960
4008
  isValidGitRepo,