@iloom/cli 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +21 -2
  3. package/dist/{ClaudeContextManager-X2Y72GRL.js → ClaudeContextManager-HR5JQKAI.js} +4 -4
  4. package/dist/{ClaudeService-7P32TTES.js → ClaudeService-TK7FMC2X.js} +3 -3
  5. package/dist/{GitHubService-ACZVNTJE.js → GitHubService-TGWJN4V4.js} +3 -3
  6. package/dist/{LoomLauncher-3I47SUPV.js → LoomLauncher-73NXL2CL.js} +4 -4
  7. package/dist/README.md +21 -2
  8. package/dist/{SettingsManager-QR7V2IW2.js → SettingsManager-AW3JTJHD.js} +2 -2
  9. package/dist/{build-IC4CJRMP.js → build-THZI572G.js} +6 -6
  10. package/dist/{chunk-Z6F5CUS6.js → chunk-3I4ONZRT.js} +3 -3
  11. package/dist/{chunk-THS5L54H.js → chunk-4CO6KG5S.js} +50 -3
  12. package/dist/chunk-4CO6KG5S.js.map +1 -0
  13. package/dist/{chunk-MZPRBNYC.js → chunk-6IIL5M2L.js} +2 -2
  14. package/dist/{chunk-2JPXGGP4.js → chunk-A7NJF73J.js} +2 -2
  15. package/dist/{chunk-H6ST2TGP.js → chunk-AR5QKYNE.js} +3 -3
  16. package/dist/{chunk-PL2FDYEK.js → chunk-CWRI4JC3.js} +2 -2
  17. package/dist/{chunk-I23OQB4Y.js → chunk-DGG2VY7B.js} +6 -5
  18. package/dist/chunk-DGG2VY7B.js.map +1 -0
  19. package/dist/{chunk-RNBIISBZ.js → chunk-FJDRTVJX.js} +50 -5
  20. package/dist/chunk-FJDRTVJX.js.map +1 -0
  21. package/dist/{chunk-NTTSUAVM.js → chunk-IZIYLYPK.js} +2 -2
  22. package/dist/{chunk-TGRK3CHF.js → chunk-KJTVU3HZ.js} +4 -4
  23. package/dist/{chunk-SC6X5EBG.js → chunk-KXGQYLFZ.js} +3 -3
  24. package/dist/{chunk-USSL2X4A.js → chunk-NUACL52E.js} +2 -2
  25. package/dist/{chunk-JT5LZRMI.js → chunk-NWMORW3U.js} +2 -2
  26. package/dist/{chunk-PVW6JE7E.js → chunk-OFDN5NKS.js} +4 -3
  27. package/dist/{chunk-PVW6JE7E.js.map → chunk-OFDN5NKS.js.map} +1 -1
  28. package/dist/{chunk-HZXBHMVM.js → chunk-R4YWBGY6.js} +3 -3
  29. package/dist/{chunk-XFEK2X2D.js → chunk-RI2YL6TK.js} +9 -3
  30. package/dist/chunk-RI2YL6TK.js.map +1 -0
  31. package/dist/{chunk-6Y3FTRJL.js → chunk-SOSQILHO.js} +102 -51
  32. package/dist/chunk-SOSQILHO.js.map +1 -0
  33. package/dist/{chunk-4GAJJUYS.js → chunk-TC7APDKU.js} +2 -2
  34. package/dist/{chunk-UDZCTLD6.js → chunk-ULSWCPQG.js} +3 -3
  35. package/dist/{chunk-5LVVQGB3.js → chunk-VPTAX5TR.js} +7 -7
  36. package/dist/chunk-VPTAX5TR.js.map +1 -0
  37. package/dist/{chunk-RD7OPXZK.js → chunk-W6DP5RVR.js} +3 -3
  38. package/dist/{chunk-XJHQVOT6.js → chunk-WHI5KEOX.js} +2 -2
  39. package/dist/{chunk-2HZX6AMR.js → chunk-YKFCCV6S.js} +2 -2
  40. package/dist/{chunk-OAVJR4PM.js → chunk-Z2TWEXR7.js} +2 -2
  41. package/dist/{cleanup-M6N7KV7E.js → cleanup-PJRIFFU4.js} +16 -16
  42. package/dist/cli.js +79 -62
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{commit-ORHR53KW.js → commit-IVP3M4HG.js} +10 -9
  45. package/dist/commit-IVP3M4HG.js.map +1 -0
  46. package/dist/{compile-EOWJORKO.js → compile-R2J65HBQ.js} +6 -6
  47. package/dist/{contribute-4KCEOHSH.js → contribute-VDZXHK5Y.js} +4 -4
  48. package/dist/{dev-server-Q6M62ATG.js → dev-server-7F622OEO.js} +8 -8
  49. package/dist/{feedback-XRI7SGYX.js → feedback-E7VET7CL.js} +6 -6
  50. package/dist/{git-W3XUIFTR.js → git-2QDQ2X2S.js} +3 -3
  51. package/dist/{ignite-3FHQY23X.js → ignite-IW35CDBD.js} +10 -10
  52. package/dist/index.d.ts +18 -0
  53. package/dist/index.js +14 -6
  54. package/dist/index.js.map +1 -1
  55. package/dist/{init-ALYWKNWG.js → init-676DHF6R.js} +5 -5
  56. package/dist/issues-PJSOLOBJ.js +138 -0
  57. package/dist/issues-PJSOLOBJ.js.map +1 -0
  58. package/dist/{lint-IHUH45OC.js → lint-CJM7BAIM.js} +6 -6
  59. package/dist/mcp/issue-management-server.js +5 -4
  60. package/dist/mcp/issue-management-server.js.map +1 -1
  61. package/dist/{open-KWOV2OFO.js → open-544H7JF5.js} +8 -8
  62. package/dist/{plan-P6MXL7AU.js → plan-Q7ELXDLC.js} +12 -12
  63. package/dist/prompts/init-prompt.txt +39 -21
  64. package/dist/{rebase-AJOJOZUG.js → rebase-YND35CIE.js} +5 -5
  65. package/dist/{recap-GKJXMDXW.js → recap-3W7COH7D.js} +5 -5
  66. package/dist/{run-QEUVZF7J.js → run-QUXJKDQQ.js} +8 -8
  67. package/dist/schema/settings.schema.json +15 -0
  68. package/dist/{shell-DAAVG4YN.js → shell-QGECBLST.js} +5 -5
  69. package/dist/{summary-WNEYCO4S.js → summary-G2T4452H.js} +9 -9
  70. package/dist/{test-5GPWWO3P.js → test-EA5NQFDC.js} +6 -6
  71. package/dist/{test-git-EJUKDB7F.js → test-git-M7LSLEFL.js} +3 -3
  72. package/dist/{test-prefix-23TOBUXY.js → test-prefix-64NAAUON.js} +3 -3
  73. package/dist/{test-webserver-CKROHFBQ.js → test-webserver-OK6Z5FJM.js} +5 -5
  74. package/dist/{vscode-6TOLFCI2.js → vscode-AR5NNXXI.js} +5 -5
  75. package/package.json +1 -1
  76. package/dist/chunk-5LVVQGB3.js.map +0 -1
  77. package/dist/chunk-6Y3FTRJL.js.map +0 -1
  78. package/dist/chunk-I23OQB4Y.js.map +0 -1
  79. package/dist/chunk-RNBIISBZ.js.map +0 -1
  80. package/dist/chunk-THS5L54H.js.map +0 -1
  81. package/dist/chunk-XFEK2X2D.js.map +0 -1
  82. package/dist/commit-ORHR53KW.js.map +0 -1
  83. /package/dist/{ClaudeContextManager-X2Y72GRL.js.map → ClaudeContextManager-HR5JQKAI.js.map} +0 -0
  84. /package/dist/{ClaudeService-7P32TTES.js.map → ClaudeService-TK7FMC2X.js.map} +0 -0
  85. /package/dist/{GitHubService-ACZVNTJE.js.map → GitHubService-TGWJN4V4.js.map} +0 -0
  86. /package/dist/{LoomLauncher-3I47SUPV.js.map → LoomLauncher-73NXL2CL.js.map} +0 -0
  87. /package/dist/{SettingsManager-QR7V2IW2.js.map → SettingsManager-AW3JTJHD.js.map} +0 -0
  88. /package/dist/{build-IC4CJRMP.js.map → build-THZI572G.js.map} +0 -0
  89. /package/dist/{chunk-Z6F5CUS6.js.map → chunk-3I4ONZRT.js.map} +0 -0
  90. /package/dist/{chunk-MZPRBNYC.js.map → chunk-6IIL5M2L.js.map} +0 -0
  91. /package/dist/{chunk-2JPXGGP4.js.map → chunk-A7NJF73J.js.map} +0 -0
  92. /package/dist/{chunk-H6ST2TGP.js.map → chunk-AR5QKYNE.js.map} +0 -0
  93. /package/dist/{chunk-PL2FDYEK.js.map → chunk-CWRI4JC3.js.map} +0 -0
  94. /package/dist/{chunk-NTTSUAVM.js.map → chunk-IZIYLYPK.js.map} +0 -0
  95. /package/dist/{chunk-TGRK3CHF.js.map → chunk-KJTVU3HZ.js.map} +0 -0
  96. /package/dist/{chunk-SC6X5EBG.js.map → chunk-KXGQYLFZ.js.map} +0 -0
  97. /package/dist/{chunk-USSL2X4A.js.map → chunk-NUACL52E.js.map} +0 -0
  98. /package/dist/{chunk-JT5LZRMI.js.map → chunk-NWMORW3U.js.map} +0 -0
  99. /package/dist/{chunk-HZXBHMVM.js.map → chunk-R4YWBGY6.js.map} +0 -0
  100. /package/dist/{chunk-4GAJJUYS.js.map → chunk-TC7APDKU.js.map} +0 -0
  101. /package/dist/{chunk-UDZCTLD6.js.map → chunk-ULSWCPQG.js.map} +0 -0
  102. /package/dist/{chunk-RD7OPXZK.js.map → chunk-W6DP5RVR.js.map} +0 -0
  103. /package/dist/{chunk-XJHQVOT6.js.map → chunk-WHI5KEOX.js.map} +0 -0
  104. /package/dist/{chunk-2HZX6AMR.js.map → chunk-YKFCCV6S.js.map} +0 -0
  105. /package/dist/{chunk-OAVJR4PM.js.map → chunk-Z2TWEXR7.js.map} +0 -0
  106. /package/dist/{cleanup-M6N7KV7E.js.map → cleanup-PJRIFFU4.js.map} +0 -0
  107. /package/dist/{compile-EOWJORKO.js.map → compile-R2J65HBQ.js.map} +0 -0
  108. /package/dist/{contribute-4KCEOHSH.js.map → contribute-VDZXHK5Y.js.map} +0 -0
  109. /package/dist/{dev-server-Q6M62ATG.js.map → dev-server-7F622OEO.js.map} +0 -0
  110. /package/dist/{feedback-XRI7SGYX.js.map → feedback-E7VET7CL.js.map} +0 -0
  111. /package/dist/{git-W3XUIFTR.js.map → git-2QDQ2X2S.js.map} +0 -0
  112. /package/dist/{ignite-3FHQY23X.js.map → ignite-IW35CDBD.js.map} +0 -0
  113. /package/dist/{init-ALYWKNWG.js.map → init-676DHF6R.js.map} +0 -0
  114. /package/dist/{lint-IHUH45OC.js.map → lint-CJM7BAIM.js.map} +0 -0
  115. /package/dist/{open-KWOV2OFO.js.map → open-544H7JF5.js.map} +0 -0
  116. /package/dist/{plan-P6MXL7AU.js.map → plan-Q7ELXDLC.js.map} +0 -0
  117. /package/dist/{rebase-AJOJOZUG.js.map → rebase-YND35CIE.js.map} +0 -0
  118. /package/dist/{recap-GKJXMDXW.js.map → recap-3W7COH7D.js.map} +0 -0
  119. /package/dist/{run-QEUVZF7J.js.map → run-QUXJKDQQ.js.map} +0 -0
  120. /package/dist/{shell-DAAVG4YN.js.map → shell-QGECBLST.js.map} +0 -0
  121. /package/dist/{summary-WNEYCO4S.js.map → summary-G2T4452H.js.map} +0 -0
  122. /package/dist/{test-5GPWWO3P.js.map → test-EA5NQFDC.js.map} +0 -0
  123. /package/dist/{test-git-EJUKDB7F.js.map → test-git-M7LSLEFL.js.map} +0 -0
  124. /package/dist/{test-prefix-23TOBUXY.js.map → test-prefix-64NAAUON.js.map} +0 -0
  125. /package/dist/{test-webserver-CKROHFBQ.js.map → test-webserver-OK6Z5FJM.js.map} +0 -0
  126. /package/dist/{vscode-6TOLFCI2.js.map → vscode-AR5NNXXI.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  PRManager
4
- } from "./chunk-I23OQB4Y.js";
4
+ } from "./chunk-DGG2VY7B.js";
5
5
  import {
6
6
  calculatePortForBranch,
7
7
  calculatePortFromIdentifier
8
- } from "./chunk-USSL2X4A.js";
8
+ } from "./chunk-NUACL52E.js";
9
9
  import {
10
10
  installDependencies,
11
11
  runScript
@@ -31,16 +31,16 @@ import {
31
31
  isBranchMergedIntoMain,
32
32
  isFileTrackedByGit,
33
33
  pushBranchToRemote
34
- } from "./chunk-H6ST2TGP.js";
34
+ } from "./chunk-AR5QKYNE.js";
35
35
  import {
36
36
  SettingsManager
37
- } from "./chunk-XFEK2X2D.js";
37
+ } from "./chunk-RI2YL6TK.js";
38
38
  import {
39
39
  MetadataManager
40
40
  } from "./chunk-KBEIQP4G.js";
41
41
  import {
42
42
  GitHubService
43
- } from "./chunk-PVW6JE7E.js";
43
+ } from "./chunk-OFDN5NKS.js";
44
44
  import {
45
45
  calculateForegroundColor,
46
46
  generateColorFromBranchName,
@@ -244,7 +244,7 @@ var LoomManager = class {
244
244
  * NEW: Checks for existing worktrees and reuses them if found
245
245
  */
246
246
  async createIloom(input) {
247
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
247
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
248
248
  getLogger().info("Fetching issue data...");
249
249
  const issueData = await this.fetchIssueData(input);
250
250
  if (input.type === "issue" || input.type === "pr" || input.type === "branch") {
@@ -259,7 +259,7 @@ var LoomManager = class {
259
259
  getLogger().info("Preparing branch name...");
260
260
  const branchName = await this.prepareBranchName(input, issueData);
261
261
  getLogger().info("Creating git worktree...");
262
- const worktreePath = await this.createWorktreeOnly(input, branchName);
262
+ const worktreePath = await this.createWorktreeOnly(input, branchName, issueData);
263
263
  this.loadMainEnvFile();
264
264
  const { capabilities, binEntries } = await this.capabilityDetector.detectCapabilities(worktreePath);
265
265
  await this.copyEnvironmentFiles(worktreePath);
@@ -375,16 +375,30 @@ var LoomManager = class {
375
375
  getLogger().success(`Found existing PR: ${existingPR.url}`);
376
376
  } else {
377
377
  const prTitle = (issueData == null ? void 0 : issueData.title) ?? `Work on ${branchName}`;
378
- const prBody = input.type === "issue" ? `PR for issue #${input.identifier}
378
+ let prBody;
379
+ if (input.type === "issue") {
380
+ const issueBody = (issueData == null ? void 0 : issueData.body) ? `
379
381
 
380
- This PR was created automatically by iloom.` : `Branch: ${branchName}
382
+ ## ${issueData.title}
381
383
 
382
- This PR was created automatically by iloom.`;
384
+ ${issueData.body}` : "";
385
+ prBody = `Fixes ${prManager.issuePrefix}${input.identifier}${issueBody}
386
+
387
+ ---
388
+ *This PR was created automatically by iloom.*`;
389
+ } else {
390
+ prBody = `Branch: ${branchName}
391
+
392
+ ---
393
+ *This PR was created automatically by iloom.*`;
394
+ }
395
+ const draftBaseBranch = ((_e = input.parentLoom) == null ? void 0 : _e.branchName) ?? settingsData.mainBranch ?? "main";
383
396
  getLogger().info("Creating draft PR...");
384
397
  const prResult = await prManager.createDraftPR(
385
398
  branchName,
386
399
  prTitle,
387
400
  prBody,
401
+ draftBaseBranch,
388
402
  worktreePath
389
403
  );
390
404
  draftPrNumber = prResult.number;
@@ -418,16 +432,16 @@ This PR was created automatically by iloom.`;
418
432
  );
419
433
  }
420
434
  }
421
- const enableClaude = ((_e = input.options) == null ? void 0 : _e.enableClaude) !== false;
422
- const enableCode = ((_f = input.options) == null ? void 0 : _f.enableCode) !== false;
423
- const enableDevServer = ((_g = input.options) == null ? void 0 : _g.enableDevServer) !== false;
424
- const enableTerminal = ((_h = input.options) == null ? void 0 : _h.enableTerminal) ?? false;
425
- const oneShot = ((_i = input.options) == null ? void 0 : _i.oneShot) ?? "default";
426
- const setArguments = (_j = input.options) == null ? void 0 : _j.setArguments;
427
- const executablePath = (_k = input.options) == null ? void 0 : _k.executablePath;
435
+ const enableClaude = ((_f = input.options) == null ? void 0 : _f.enableClaude) !== false;
436
+ const enableCode = ((_g = input.options) == null ? void 0 : _g.enableCode) !== false;
437
+ const enableDevServer = ((_h = input.options) == null ? void 0 : _h.enableDevServer) !== false;
438
+ const enableTerminal = ((_i = input.options) == null ? void 0 : _i.enableTerminal) ?? false;
439
+ const oneShot = ((_j = input.options) == null ? void 0 : _j.oneShot) ?? "default";
440
+ const setArguments = (_k = input.options) == null ? void 0 : _k.setArguments;
441
+ const executablePath = (_l = input.options) == null ? void 0 : _l.executablePath;
428
442
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
429
- const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
430
- const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
443
+ const { LoomLauncher } = await import("./LoomLauncher-73NXL2CL.js");
444
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-HR5JQKAI.js");
431
445
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
432
446
  const launcher = new LoomLauncher(claudeContext, this.settings);
433
447
  await launcher.launchLoom({
@@ -446,7 +460,7 @@ This PR was created automatically by iloom.`;
446
460
  ...setArguments && { setArguments },
447
461
  ...executablePath && { executablePath },
448
462
  sourceEnvOnStart: settingsData.sourceEnvOnStart ?? false,
449
- colorTerminal: ((_l = input.options) == null ? void 0 : _l.colorTerminal) ?? ((_m = settingsData.colors) == null ? void 0 : _m.terminal) ?? true,
463
+ colorTerminal: ((_m = input.options) == null ? void 0 : _m.colorTerminal) ?? ((_n = settingsData.colors) == null ? void 0 : _n.terminal) ?? true,
450
464
  colorHex: colorData.hex
451
465
  });
452
466
  }
@@ -489,7 +503,7 @@ This PR was created automatically by iloom.`;
489
503
  prUrls,
490
504
  capabilities,
491
505
  ...draftPrNumber && { draftPrNumber },
492
- ...((_n = input.options) == null ? void 0 : _n.oneShot) && { oneShot: input.options.oneShot },
506
+ ...((_o = input.options) == null ? void 0 : _o.oneShot) && { oneShot: input.options.oneShot },
493
507
  ...input.parentLoom && { parentLoom: input.parentLoom }
494
508
  };
495
509
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
@@ -578,7 +592,7 @@ This PR was created automatically by iloom.`;
578
592
  async checkAndWarnChildLooms(branchName) {
579
593
  let targetBranch = branchName;
580
594
  if (!targetBranch) {
581
- const { getCurrentBranch } = await import("./git-W3XUIFTR.js");
595
+ const { getCurrentBranch } = await import("./git-2QDQ2X2S.js");
582
596
  targetBranch = await getCurrentBranch();
583
597
  }
584
598
  if (!targetBranch) {
@@ -646,7 +660,7 @@ This PR was created automatically by iloom.`;
646
660
  /**
647
661
  * Create worktree for the loom (without dependency installation)
648
662
  */
649
- async createWorktreeOnly(input, branchName) {
663
+ async createWorktreeOnly(input, branchName, issueData) {
650
664
  var _a;
651
665
  getLogger().info("Ensuring repository has initial commit...");
652
666
  await ensureRepositoryHasCommits(this.gitWorktree.workingDirectory);
@@ -666,15 +680,31 @@ This PR was created automatically by iloom.`;
666
680
  void 0,
667
681
  pathOptions
668
682
  );
683
+ const isForkPR = input.type === "pr" && issueData && "isFork" in issueData && issueData.isFork === true;
669
684
  if (input.type === "pr") {
670
- getLogger().info("Fetching all remote branches...");
671
- try {
672
- await executeGitCommand(["fetch", "origin"], { cwd: this.gitWorktree.workingDirectory });
673
- getLogger().success("Successfully fetched from remote");
674
- } catch (error) {
675
- throw new Error(
676
- `Failed to fetch from remote: ${error instanceof Error ? error.message : "Unknown error"}. Make sure you have access to the repository.`
677
- );
685
+ if (isForkPR) {
686
+ getLogger().info(`Fetching PR #${input.identifier} ref from origin...`);
687
+ try {
688
+ await executeGitCommand(
689
+ ["fetch", "origin", `refs/pull/${input.identifier}/head`],
690
+ { cwd: this.gitWorktree.workingDirectory }
691
+ );
692
+ getLogger().success("Successfully fetched PR ref from remote");
693
+ } catch (error) {
694
+ throw new Error(
695
+ `Failed to fetch PR ref: ${error instanceof Error ? error.message : "Unknown error"}. Make sure you have access to the repository.`
696
+ );
697
+ }
698
+ } else {
699
+ getLogger().info("Fetching all remote branches...");
700
+ try {
701
+ await executeGitCommand(["fetch", "origin"], { cwd: this.gitWorktree.workingDirectory });
702
+ getLogger().success("Successfully fetched from remote");
703
+ } catch (error) {
704
+ throw new Error(
705
+ `Failed to fetch from remote: ${error instanceof Error ? error.message : "Unknown error"}. Make sure you have access to the repository.`
706
+ );
707
+ }
678
708
  }
679
709
  }
680
710
  const branchExistedLocally = await branchExists(branchName, process.cwd(), false);
@@ -698,21 +728,33 @@ This PR was created automatically by iloom.`;
698
728
  } else {
699
729
  baseBranch = input.baseBranch;
700
730
  }
701
- await this.gitWorktree.createWorktree({
702
- path: worktreePath,
703
- branch: branchName,
704
- createBranch: input.type !== "pr",
705
- // PRs use existing branches
706
- ...baseBranch && { baseBranch }
707
- });
708
- if (input.type === "pr" && !branchExistedLocally) {
709
- getLogger().info("Resetting new PR branch to match remote exactly...");
710
- try {
711
- await executeGitCommand(["reset", "--hard", `origin/${branchName}`], { cwd: worktreePath });
712
- await executeGitCommand(["branch", "--set-upstream-to", `origin/${branchName}`], { cwd: worktreePath });
713
- getLogger().success("Successfully reset to match remote");
714
- } catch (error) {
715
- getLogger().warn(`Failed to reset to match remote: ${error instanceof Error ? error.message : "Unknown error"}`);
731
+ if (isForkPR) {
732
+ if (branchExistedLocally) {
733
+ await executeGitCommand(["branch", "-D", branchName], { cwd: this.gitWorktree.workingDirectory });
734
+ }
735
+ await this.gitWorktree.createWorktree({
736
+ path: worktreePath,
737
+ branch: branchName,
738
+ createBranch: true,
739
+ baseBranch: "FETCH_HEAD"
740
+ });
741
+ } else {
742
+ await this.gitWorktree.createWorktree({
743
+ path: worktreePath,
744
+ branch: branchName,
745
+ createBranch: input.type !== "pr",
746
+ // PRs use existing branches
747
+ ...baseBranch && { baseBranch }
748
+ });
749
+ if (input.type === "pr" && !branchExistedLocally) {
750
+ getLogger().info("Resetting new PR branch to match remote exactly...");
751
+ try {
752
+ await executeGitCommand(["reset", "--hard", `origin/${branchName}`], { cwd: worktreePath });
753
+ await executeGitCommand(["branch", "--set-upstream-to", `origin/${branchName}`], { cwd: worktreePath });
754
+ getLogger().success("Successfully reset to match remote");
755
+ } catch (error) {
756
+ getLogger().warn(`Failed to reset to match remote: ${error instanceof Error ? error.message : "Unknown error"}`);
757
+ }
716
758
  }
717
759
  }
718
760
  return worktreePath;
@@ -1098,8 +1140,8 @@ This PR was created automatically by iloom.`;
1098
1140
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
1099
1141
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
1100
1142
  getLogger().info("Launching workspace components...");
1101
- const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
1102
- const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
1143
+ const { LoomLauncher } = await import("./LoomLauncher-73NXL2CL.js");
1144
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-HR5JQKAI.js");
1103
1145
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
1104
1146
  const launcher = new LoomLauncher(claudeContext, this.settings);
1105
1147
  await launcher.launchLoom({
@@ -1950,6 +1992,7 @@ var ResourceCleanup = class {
1950
1992
  rollbackRequired: false
1951
1993
  };
1952
1994
  }
1995
+ let safetyCheckPassed = false;
1953
1996
  if (!options.force) {
1954
1997
  const shouldCheckMergeSafety = options.checkMergeSafety ?? options.deleteBranch === true;
1955
1998
  const shouldCheckRemoteBranch = options.checkRemoteBranch ?? false;
@@ -1960,6 +2003,7 @@ var ResourceCleanup = class {
1960
2003
 
1961
2004
  ${blockerMessage}`);
1962
2005
  }
2006
+ safetyCheckPassed = true;
1963
2007
  if (safety.warnings.length > 0) {
1964
2008
  safety.warnings.forEach((warning) => {
1965
2009
  getLogger().warn(warning);
@@ -2073,7 +2117,8 @@ ${blockerMessage}`);
2073
2117
  } else {
2074
2118
  try {
2075
2119
  const branchOptions = {
2076
- dryRun: false
2120
+ dryRun: false,
2121
+ safetyVerified: safetyCheckPassed
2077
2122
  };
2078
2123
  if (mergeTargetBranch !== null) {
2079
2124
  branchOptions.mergeTargetBranch = mergeTargetBranch;
@@ -2316,9 +2361,9 @@ ${blockerMessage}`);
2316
2361
  getLogger().info(`[DRY RUN] Would delete branch: ${branchName}`);
2317
2362
  return true;
2318
2363
  }
2364
+ let deleteCwd = workingDir;
2319
2365
  try {
2320
2366
  let deleteFlag = "-d";
2321
- let deleteCwd = workingDir;
2322
2367
  if (options.force) {
2323
2368
  deleteFlag = "-D";
2324
2369
  } else if (options.mergeTargetBranch) {
@@ -2373,6 +2418,12 @@ ${blockerMessage}`);
2373
2418
  throw error;
2374
2419
  }
2375
2420
  if (errorMessage.includes("not fully merged")) {
2421
+ if (options.safetyVerified) {
2422
+ getLogger().info(`Branch '${branchName}' not merged into HEAD but safety verified - using force delete`);
2423
+ await executeGitCommand(["branch", "-D", branchName], { cwd: deleteCwd });
2424
+ getLogger().info(`Branch deleted: ${branchName}`);
2425
+ return true;
2426
+ }
2376
2427
  throw new Error(
2377
2428
  `Cannot delete unmerged branch '${branchName}'. Use --force to delete anyway.`
2378
2429
  );
@@ -2582,4 +2633,4 @@ export {
2582
2633
  DatabaseManager,
2583
2634
  ResourceCleanup
2584
2635
  };
2585
- //# sourceMappingURL=chunk-6Y3FTRJL.js.map
2636
+ //# sourceMappingURL=chunk-SOSQILHO.js.map