@iloom/cli 0.8.2 → 0.9.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 (160) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +50 -4
  3. package/dist/{BranchNamingService-AO7BPIUJ.js → BranchNamingService-K6XNWQ6C.js} +2 -2
  4. package/dist/ClaudeContextManager-X2Y72GRL.js +14 -0
  5. package/dist/ClaudeService-7P32TTES.js +13 -0
  6. package/dist/{LoomLauncher-NHZMEVTQ.js → LoomLauncher-3I47SUPV.js} +6 -6
  7. package/dist/{ProjectCapabilityDetector-IA56AUE6.js → ProjectCapabilityDetector-N5L7T4IY.js} +3 -3
  8. package/dist/PromptTemplateManager-36YLQRHP.js +11 -0
  9. package/dist/README.md +50 -4
  10. package/dist/{SettingsManager-VCVLL32H.js → SettingsManager-QR7V2IW2.js} +2 -2
  11. package/dist/agents/iloom-artifact-reviewer.md +280 -0
  12. package/dist/agents/iloom-code-reviewer.md +9 -7
  13. package/dist/agents/iloom-issue-analyze-and-plan.md +21 -6
  14. package/dist/agents/iloom-issue-analyzer.md +21 -6
  15. package/dist/agents/iloom-issue-complexity-evaluator.md +21 -6
  16. package/dist/agents/iloom-issue-enhancer.md +21 -6
  17. package/dist/agents/iloom-issue-implementer.md +21 -6
  18. package/dist/agents/iloom-issue-planner.md +21 -6
  19. package/dist/{build-Z3WCIKPD.js → build-IC4CJRMP.js} +8 -8
  20. package/dist/{chunk-TVH67KEO.js → chunk-2HZX6AMR.js} +2 -2
  21. package/dist/{chunk-VZYSM7N7.js → chunk-2JPXGGP4.js} +20 -15
  22. package/dist/chunk-2JPXGGP4.js.map +1 -0
  23. package/dist/{chunk-HSGZW3ID.js → chunk-4GAJJUYS.js} +3 -3
  24. package/dist/chunk-4GAJJUYS.js.map +1 -0
  25. package/dist/{chunk-RD7I2Q2F.js → chunk-4LKGCFGG.js} +2 -2
  26. package/dist/{chunk-SSASIBDJ.js → chunk-5LVVQGB3.js} +5 -5
  27. package/dist/{chunk-GWONJE3X.js → chunk-6Y3FTRJL.js} +189 -48
  28. package/dist/chunk-6Y3FTRJL.js.map +1 -0
  29. package/dist/{chunk-4BSXZ5YZ.js → chunk-B7U6OKUR.js} +5 -24
  30. package/dist/chunk-B7U6OKUR.js.map +1 -0
  31. package/dist/{chunk-IGKPPACU.js → chunk-FO5GGFOV.js} +17 -8
  32. package/dist/chunk-FO5GGFOV.js.map +1 -0
  33. package/dist/{chunk-GDS2HXSW.js → chunk-H6ST2TGP.js} +20 -3
  34. package/dist/chunk-H6ST2TGP.js.map +1 -0
  35. package/dist/{chunk-A7XHHUEV.js → chunk-HZXBHMVM.js} +47 -22
  36. package/dist/chunk-HZXBHMVM.js.map +1 -0
  37. package/dist/{chunk-44Y5IF7P.js → chunk-I23OQB4Y.js} +5 -5
  38. package/dist/chunk-JT5LZRMI.js +302 -0
  39. package/dist/chunk-JT5LZRMI.js.map +1 -0
  40. package/dist/{chunk-Q457PKGH.js → chunk-KAYXR544.js} +2 -2
  41. package/dist/{chunk-XU5A6BWA.js → chunk-MZPRBNYC.js} +4 -4
  42. package/dist/{chunk-XHNACIHO.js → chunk-NTTSUAVM.js} +2 -2
  43. package/dist/{chunk-PLI3JQWT.js → chunk-OAVJR4PM.js} +2 -2
  44. package/dist/{chunk-4KGRPHM6.js → chunk-PL2FDYEK.js} +2 -2
  45. package/dist/chunk-QN47QVBX.js +131 -0
  46. package/dist/chunk-QN47QVBX.js.map +1 -0
  47. package/dist/{chunk-3FC3VNEX.js → chunk-RD7OPXZK.js} +34 -8
  48. package/dist/chunk-RD7OPXZK.js.map +1 -0
  49. package/dist/{chunk-O6LECMT6.js → chunk-TGRK3CHF.js} +8 -8
  50. package/dist/{chunk-7GLZVDPQ.js → chunk-TL72BGP6.js} +2 -2
  51. package/dist/{chunk-52MVUK5V.js → chunk-USSL2X4A.js} +2 -2
  52. package/dist/chunk-USSL2X4A.js.map +1 -0
  53. package/dist/{chunk-XPKN3QWY.js → chunk-VOGGLPG5.js} +1 -2
  54. package/dist/{chunk-IWIIOFEB.js → chunk-XFEK2X2D.js} +16 -6
  55. package/dist/chunk-XFEK2X2D.js.map +1 -0
  56. package/dist/{chunk-PBSHQVCT.js → chunk-Z6F5CUS6.js} +4 -4
  57. package/dist/{claude-V4HRPR4Z.js → claude-TP2QO3BU.js} +2 -2
  58. package/dist/{cleanup-NWNKWPUY.js → cleanup-M6N7KV7E.js} +20 -15
  59. package/dist/{cleanup-NWNKWPUY.js.map → cleanup-M6N7KV7E.js.map} +1 -1
  60. package/dist/cli.js +118 -84
  61. package/dist/cli.js.map +1 -1
  62. package/dist/{commit-534QIRHY.js → commit-ORHR53KW.js} +10 -10
  63. package/dist/{compile-UANHMNTS.js → compile-EOWJORKO.js} +8 -8
  64. package/dist/{contribute-7USRBWRM.js → contribute-4KCEOHSH.js} +3 -3
  65. package/dist/{dev-server-TO7RLYJI.js → dev-server-Q6M62ATG.js} +13 -13
  66. package/dist/{feedback-7ZZI6RC5.js → feedback-XRI7SGYX.js} +11 -11
  67. package/dist/{git-GUNOPP4Q.js → git-W3XUIFTR.js} +5 -3
  68. package/dist/hooks/iloom-hook.js +5 -3
  69. package/dist/{ignite-5SIGOW5V.js → ignite-3FHQY23X.js} +90 -26
  70. package/dist/ignite-3FHQY23X.js.map +1 -0
  71. package/dist/index.d.ts +37 -2
  72. package/dist/index.js +49 -13
  73. package/dist/index.js.map +1 -1
  74. package/dist/{chunk-FPNSFP6K.js → init-ALYWKNWG.js} +42 -329
  75. package/dist/init-ALYWKNWG.js.map +1 -0
  76. package/dist/{lint-XPODLDVA.js → lint-IHUH45OC.js} +8 -8
  77. package/dist/{open-M2SUR74Y.js → open-KWOV2OFO.js} +15 -15
  78. package/dist/{plan-FB4AOJ2Q.js → plan-P6MXL7AU.js} +54 -22
  79. package/dist/plan-P6MXL7AU.js.map +1 -0
  80. package/dist/{projects-325GEEGJ.js → projects-LH362JZQ.js} +3 -3
  81. package/dist/prompts/init-prompt.txt +9 -1
  82. package/dist/prompts/issue-prompt.txt +315 -5
  83. package/dist/prompts/plan-prompt.txt +4 -6
  84. package/dist/prompts/pr-prompt.txt +79 -0
  85. package/dist/prompts/regular-prompt.txt +210 -5
  86. package/dist/{rebase-4FNRBW3H.js → rebase-AJOJOZUG.js} +9 -9
  87. package/dist/{recap-GSXFEOD6.js → recap-GKJXMDXW.js} +5 -5
  88. package/dist/{run-GZNHRJB2.js → run-QEUVZF7J.js} +15 -15
  89. package/dist/schema/settings.schema.json +9 -1
  90. package/dist/{shell-2SPM3Z5O.js → shell-DAAVG4YN.js} +5 -5
  91. package/dist/{summary-Z4F7YFXE.js → summary-WNEYCO4S.js} +11 -11
  92. package/dist/{test-LBSPYIJW.js → test-5GPWWO3P.js} +8 -8
  93. package/dist/{test-git-ZPSPA2TP.js → test-git-EJUKDB7F.js} +3 -3
  94. package/dist/{test-prefix-6DLB2BHE.js → test-prefix-23TOBUXY.js} +3 -3
  95. package/dist/{test-webserver-XLJ2TZFP.js → test-webserver-CKROHFBQ.js} +5 -5
  96. package/dist/{vscode-LH3VSQ2W.js → vscode-6TOLFCI2.js} +5 -5
  97. package/package.json +2 -2
  98. package/dist/ClaudeContextManager-RDP6CLK6.js +0 -14
  99. package/dist/ClaudeService-FKPOQRA4.js +0 -13
  100. package/dist/PRManager-A63LT3NF.js +0 -16
  101. package/dist/PromptTemplateManager-OUYDHOPI.js +0 -9
  102. package/dist/chunk-3FC3VNEX.js.map +0 -1
  103. package/dist/chunk-4BSXZ5YZ.js.map +0 -1
  104. package/dist/chunk-52MVUK5V.js.map +0 -1
  105. package/dist/chunk-66QOCD5N.js +0 -79
  106. package/dist/chunk-66QOCD5N.js.map +0 -1
  107. package/dist/chunk-A7XHHUEV.js.map +0 -1
  108. package/dist/chunk-FPNSFP6K.js.map +0 -1
  109. package/dist/chunk-GDS2HXSW.js.map +0 -1
  110. package/dist/chunk-GWONJE3X.js.map +0 -1
  111. package/dist/chunk-HSGZW3ID.js.map +0 -1
  112. package/dist/chunk-IGKPPACU.js.map +0 -1
  113. package/dist/chunk-IWIIOFEB.js.map +0 -1
  114. package/dist/chunk-VZYSM7N7.js.map +0 -1
  115. package/dist/git-GUNOPP4Q.js.map +0 -1
  116. package/dist/ignite-5SIGOW5V.js.map +0 -1
  117. package/dist/init-XXDIB2UJ.js +0 -21
  118. package/dist/init-XXDIB2UJ.js.map +0 -1
  119. package/dist/plan-FB4AOJ2Q.js.map +0 -1
  120. /package/dist/{BranchNamingService-AO7BPIUJ.js.map → BranchNamingService-K6XNWQ6C.js.map} +0 -0
  121. /package/dist/{ClaudeContextManager-RDP6CLK6.js.map → ClaudeContextManager-X2Y72GRL.js.map} +0 -0
  122. /package/dist/{ClaudeService-FKPOQRA4.js.map → ClaudeService-7P32TTES.js.map} +0 -0
  123. /package/dist/{LoomLauncher-NHZMEVTQ.js.map → LoomLauncher-3I47SUPV.js.map} +0 -0
  124. /package/dist/{PRManager-A63LT3NF.js.map → ProjectCapabilityDetector-N5L7T4IY.js.map} +0 -0
  125. /package/dist/{ProjectCapabilityDetector-IA56AUE6.js.map → PromptTemplateManager-36YLQRHP.js.map} +0 -0
  126. /package/dist/{PromptTemplateManager-OUYDHOPI.js.map → SettingsManager-QR7V2IW2.js.map} +0 -0
  127. /package/dist/{build-Z3WCIKPD.js.map → build-IC4CJRMP.js.map} +0 -0
  128. /package/dist/{chunk-TVH67KEO.js.map → chunk-2HZX6AMR.js.map} +0 -0
  129. /package/dist/{chunk-RD7I2Q2F.js.map → chunk-4LKGCFGG.js.map} +0 -0
  130. /package/dist/{chunk-SSASIBDJ.js.map → chunk-5LVVQGB3.js.map} +0 -0
  131. /package/dist/{chunk-44Y5IF7P.js.map → chunk-I23OQB4Y.js.map} +0 -0
  132. /package/dist/{chunk-Q457PKGH.js.map → chunk-KAYXR544.js.map} +0 -0
  133. /package/dist/{chunk-XU5A6BWA.js.map → chunk-MZPRBNYC.js.map} +0 -0
  134. /package/dist/{chunk-XHNACIHO.js.map → chunk-NTTSUAVM.js.map} +0 -0
  135. /package/dist/{chunk-PLI3JQWT.js.map → chunk-OAVJR4PM.js.map} +0 -0
  136. /package/dist/{chunk-4KGRPHM6.js.map → chunk-PL2FDYEK.js.map} +0 -0
  137. /package/dist/{chunk-O6LECMT6.js.map → chunk-TGRK3CHF.js.map} +0 -0
  138. /package/dist/{chunk-7GLZVDPQ.js.map → chunk-TL72BGP6.js.map} +0 -0
  139. /package/dist/{chunk-XPKN3QWY.js.map → chunk-VOGGLPG5.js.map} +0 -0
  140. /package/dist/{chunk-PBSHQVCT.js.map → chunk-Z6F5CUS6.js.map} +0 -0
  141. /package/dist/{SettingsManager-VCVLL32H.js.map → claude-TP2QO3BU.js.map} +0 -0
  142. /package/dist/{commit-534QIRHY.js.map → commit-ORHR53KW.js.map} +0 -0
  143. /package/dist/{compile-UANHMNTS.js.map → compile-EOWJORKO.js.map} +0 -0
  144. /package/dist/{contribute-7USRBWRM.js.map → contribute-4KCEOHSH.js.map} +0 -0
  145. /package/dist/{dev-server-TO7RLYJI.js.map → dev-server-Q6M62ATG.js.map} +0 -0
  146. /package/dist/{feedback-7ZZI6RC5.js.map → feedback-XRI7SGYX.js.map} +0 -0
  147. /package/dist/{claude-V4HRPR4Z.js.map → git-W3XUIFTR.js.map} +0 -0
  148. /package/dist/{lint-XPODLDVA.js.map → lint-IHUH45OC.js.map} +0 -0
  149. /package/dist/{open-M2SUR74Y.js.map → open-KWOV2OFO.js.map} +0 -0
  150. /package/dist/{projects-325GEEGJ.js.map → projects-LH362JZQ.js.map} +0 -0
  151. /package/dist/{rebase-4FNRBW3H.js.map → rebase-AJOJOZUG.js.map} +0 -0
  152. /package/dist/{recap-GSXFEOD6.js.map → recap-GKJXMDXW.js.map} +0 -0
  153. /package/dist/{run-GZNHRJB2.js.map → run-QEUVZF7J.js.map} +0 -0
  154. /package/dist/{shell-2SPM3Z5O.js.map → shell-DAAVG4YN.js.map} +0 -0
  155. /package/dist/{summary-Z4F7YFXE.js.map → summary-WNEYCO4S.js.map} +0 -0
  156. /package/dist/{test-LBSPYIJW.js.map → test-5GPWWO3P.js.map} +0 -0
  157. /package/dist/{test-git-ZPSPA2TP.js.map → test-git-EJUKDB7F.js.map} +0 -0
  158. /package/dist/{test-prefix-6DLB2BHE.js.map → test-prefix-23TOBUXY.js.map} +0 -0
  159. /package/dist/{test-webserver-XLJ2TZFP.js.map → test-webserver-CKROHFBQ.js.map} +0 -0
  160. /package/dist/{vscode-LH3VSQ2W.js.map → vscode-6TOLFCI2.js.map} +0 -0
@@ -1,33 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- installDependencies,
4
- runScript
5
- } from "./chunk-RD7I2Q2F.js";
3
+ PRManager
4
+ } from "./chunk-I23OQB4Y.js";
6
5
  import {
7
6
  calculatePortForBranch,
8
7
  calculatePortFromIdentifier
9
- } from "./chunk-52MVUK5V.js";
8
+ } from "./chunk-USSL2X4A.js";
9
+ import {
10
+ installDependencies,
11
+ runScript
12
+ } from "./chunk-4LKGCFGG.js";
10
13
  import {
11
14
  getPackageConfig,
12
15
  hasScript
13
- } from "./chunk-XPKN3QWY.js";
16
+ } from "./chunk-VOGGLPG5.js";
14
17
  import {
18
+ GitCommandError,
19
+ PLACEHOLDER_COMMIT_PREFIX,
15
20
  branchExists,
16
21
  checkRemoteBranchStatus,
17
22
  ensureRepositoryHasCommits,
18
23
  executeGitCommand,
19
24
  extractIssueNumber,
20
25
  extractPRNumber,
26
+ fetchOrigin,
21
27
  findMainWorktreePathWithSettings,
22
28
  findWorktreeForBranch,
23
29
  getMergeTargetBranch,
24
30
  hasUncommittedChanges,
25
31
  isBranchMergedIntoMain,
26
- isFileTrackedByGit
27
- } from "./chunk-GDS2HXSW.js";
32
+ isFileTrackedByGit,
33
+ pushBranchToRemote
34
+ } from "./chunk-H6ST2TGP.js";
28
35
  import {
29
36
  SettingsManager
30
- } from "./chunk-IWIIOFEB.js";
37
+ } from "./chunk-XFEK2X2D.js";
31
38
  import {
32
39
  MetadataManager
33
40
  } from "./chunk-KBEIQP4G.js";
@@ -44,7 +51,7 @@ import {
44
51
  } from "./chunk-433MOLAU.js";
45
52
  import {
46
53
  generateRandomSessionId
47
- } from "./chunk-IGKPPACU.js";
54
+ } from "./chunk-FO5GGFOV.js";
48
55
  import {
49
56
  getLogger
50
57
  } from "./chunk-6MLEBAYZ.js";
@@ -325,38 +332,65 @@ var LoomManager = class {
325
332
  let draftPrNumber = void 0;
326
333
  let draftPrUrl = void 0;
327
334
  const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
328
- if (mergeBehavior.mode === "github-draft-pr" && input.type === "issue") {
329
- getLogger().info("Creating placeholder commit for draft PR...");
330
- const { executeGitCommand: executeGitCommand2, PLACEHOLDER_COMMIT_PREFIX, pushBranchToRemote } = await import("./git-GUNOPP4Q.js");
331
- await executeGitCommand2(
332
- [
333
- "commit",
334
- "--allow-empty",
335
- "--no-verify",
336
- "-m",
337
- `${PLACEHOLDER_COMMIT_PREFIX} Temporary commit for draft PR (will be removed on finish)`
338
- ],
339
- { cwd: worktreePath }
340
- );
341
- getLogger().debug("Placeholder commit created");
342
- getLogger().info("Pushing branch to remote for draft PR...");
343
- await pushBranchToRemote(branchName, worktreePath, { dryRun: false });
344
- const { PRManager } = await import("./PRManager-A63LT3NF.js");
335
+ if (mergeBehavior.mode === "github-draft-pr" && (input.type === "issue" || input.type === "branch")) {
345
336
  const prManager = new PRManager(settingsData);
346
- const prTitle = (issueData == null ? void 0 : issueData.title) ?? `Work on ${branchName}`;
347
- const prBody = `PR for issue #${input.identifier}
337
+ getLogger().info("Fetching from origin...");
338
+ await executeGitCommand(["fetch", "origin"], { cwd: worktreePath });
339
+ let remoteBranchExists = false;
340
+ try {
341
+ await executeGitCommand(["rev-parse", "--verify", `origin/${branchName}`], { cwd: worktreePath });
342
+ remoteBranchExists = true;
343
+ getLogger().info(`Remote branch origin/${branchName} already exists, resetting local to match...`);
344
+ } catch (error) {
345
+ if (error instanceof GitCommandError && (error.stderr.includes("unknown revision") || error.stderr.includes("Needed a single revision") || error.stderr.includes("bad revision"))) {
346
+ getLogger().debug(`Remote branch origin/${branchName} does not exist`);
347
+ } else {
348
+ throw error;
349
+ }
350
+ }
351
+ if (remoteBranchExists) {
352
+ await executeGitCommand(["reset", "--hard", `origin/${branchName}`], { cwd: worktreePath });
353
+ await executeGitCommand(["branch", "--set-upstream-to", `origin/${branchName}`], { cwd: worktreePath });
354
+ getLogger().success("Local branch reset to match remote");
355
+ } else {
356
+ getLogger().info("Creating placeholder commit for draft PR...");
357
+ await executeGitCommand(
358
+ [
359
+ "commit",
360
+ "--allow-empty",
361
+ "--no-verify",
362
+ "-m",
363
+ `${PLACEHOLDER_COMMIT_PREFIX} Temporary commit for draft PR (will be removed on finish)`
364
+ ],
365
+ { cwd: worktreePath }
366
+ );
367
+ getLogger().debug("Placeholder commit created");
368
+ getLogger().info("Pushing branch to remote for draft PR...");
369
+ await pushBranchToRemote(branchName, worktreePath, { dryRun: false });
370
+ }
371
+ const existingPR = await prManager.checkForExistingPR(branchName, worktreePath);
372
+ if (existingPR) {
373
+ draftPrNumber = existingPR.number;
374
+ draftPrUrl = existingPR.url;
375
+ getLogger().success(`Found existing PR: ${existingPR.url}`);
376
+ } else {
377
+ const prTitle = (issueData == null ? void 0 : issueData.title) ?? `Work on ${branchName}`;
378
+ const prBody = input.type === "issue" ? `PR for issue #${input.identifier}
379
+
380
+ This PR was created automatically by iloom.` : `Branch: ${branchName}
348
381
 
349
382
  This PR was created automatically by iloom.`;
350
- getLogger().info("Creating draft PR...");
351
- const prResult = await prManager.createDraftPR(
352
- branchName,
353
- prTitle,
354
- prBody,
355
- worktreePath
356
- );
357
- draftPrNumber = prResult.number;
358
- draftPrUrl = prResult.url;
359
- getLogger().success(`Draft PR created: ${prResult.url}`);
383
+ getLogger().info("Creating draft PR...");
384
+ const prResult = await prManager.createDraftPR(
385
+ branchName,
386
+ prTitle,
387
+ prBody,
388
+ worktreePath
389
+ );
390
+ draftPrNumber = prResult.number;
391
+ draftPrUrl = prResult.url;
392
+ getLogger().success(`Draft PR created: ${prResult.url}`);
393
+ }
360
394
  }
361
395
  const allMetadata = await this.metadataManager.listAllMetadata();
362
396
  const usedHexColors = allMetadata.filter((metadata) => metadata.colorHex !== null).map((metadata) => metadata.colorHex);
@@ -392,8 +426,8 @@ This PR was created automatically by iloom.`;
392
426
  const setArguments = (_j = input.options) == null ? void 0 : _j.setArguments;
393
427
  const executablePath = (_k = input.options) == null ? void 0 : _k.executablePath;
394
428
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
395
- const { LoomLauncher } = await import("./LoomLauncher-NHZMEVTQ.js");
396
- const { ClaudeContextManager } = await import("./ClaudeContextManager-RDP6CLK6.js");
429
+ const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
430
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
397
431
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
398
432
  const launcher = new LoomLauncher(claudeContext, this.settings);
399
433
  await launcher.launchLoom({
@@ -428,6 +462,9 @@ This PR was created automatically by iloom.`;
428
462
  }
429
463
  }
430
464
  const pr_numbers = input.type === "pr" ? [String(input.identifier)] : [];
465
+ if (draftPrNumber && !pr_numbers.includes(String(draftPrNumber))) {
466
+ pr_numbers.push(String(draftPrNumber));
467
+ }
431
468
  const sessionId = generateRandomSessionId();
432
469
  let issueUrls = {};
433
470
  if (input.type === "issue" && (issueData == null ? void 0 : issueData.url)) {
@@ -541,7 +578,7 @@ This PR was created automatically by iloom.`;
541
578
  async checkAndWarnChildLooms(branchName) {
542
579
  let targetBranch = branchName;
543
580
  if (!targetBranch) {
544
- const { getCurrentBranch } = await import("./git-GUNOPP4Q.js");
581
+ const { getCurrentBranch } = await import("./git-W3XUIFTR.js");
545
582
  targetBranch = await getCurrentBranch();
546
583
  }
547
584
  if (!targetBranch) {
@@ -640,13 +677,27 @@ This PR was created automatically by iloom.`;
640
677
  );
641
678
  }
642
679
  }
643
- const branchExistedLocally = await branchExists(branchName);
680
+ const branchExistedLocally = await branchExists(branchName, process.cwd(), false);
644
681
  if (input.type !== "pr" && branchExistedLocally) {
645
682
  throw new Error(
646
683
  `Cannot create worktree: branch '${branchName}' already exists. Use 'git branch -D ${branchName}' to delete it first if needed.`
647
684
  );
648
685
  }
649
- const baseBranch = ((_a = input.parentLoom) == null ? void 0 : _a.branchName) ?? input.baseBranch;
686
+ const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
687
+ const isPRMode = mergeBehavior.mode === "github-pr" || mergeBehavior.mode === "github-draft-pr";
688
+ const isChildLoom = !!input.parentLoom;
689
+ let baseBranch;
690
+ if (isChildLoom) {
691
+ baseBranch = ((_a = input.parentLoom) == null ? void 0 : _a.branchName) ?? input.baseBranch;
692
+ } else if (isPRMode && input.type !== "pr") {
693
+ getLogger().info("Fetching from origin to ensure latest main branch...");
694
+ await fetchOrigin(this.gitWorktree.workingDirectory);
695
+ const mainBranch = settingsData.mainBranch ?? "main";
696
+ baseBranch = `origin/${mainBranch}`;
697
+ getLogger().info(`Branching from ${baseBranch}`);
698
+ } else {
699
+ baseBranch = input.baseBranch;
700
+ }
650
701
  await this.gitWorktree.createWorktree({
651
702
  path: worktreePath,
652
703
  branch: branchName,
@@ -1047,8 +1098,8 @@ This PR was created automatically by iloom.`;
1047
1098
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
1048
1099
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
1049
1100
  getLogger().info("Launching workspace components...");
1050
- const { LoomLauncher } = await import("./LoomLauncher-NHZMEVTQ.js");
1051
- const { ClaudeContextManager } = await import("./ClaudeContextManager-RDP6CLK6.js");
1101
+ const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
1102
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
1052
1103
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
1053
1104
  const launcher = new LoomLauncher(claudeContext, this.settings);
1054
1105
  await launcher.launchLoom({
@@ -1783,7 +1834,41 @@ var DatabaseManager = class {
1783
1834
  };
1784
1835
 
1785
1836
  // src/lib/ResourceCleanup.ts
1837
+ import path5 from "path";
1838
+
1839
+ // src/utils/recap-archiver.ts
1786
1840
  import path4 from "path";
1841
+ import os2 from "os";
1842
+ import fs6 from "fs-extra";
1843
+ var RECAPS_DIR = path4.join(os2.homedir(), ".config", "iloom-ai", "recaps");
1844
+ var ARCHIVED_DIR = path4.join(RECAPS_DIR, "archived");
1845
+ function slugifyPath(loomPath) {
1846
+ let slug = loomPath.replace(/[/\\]+$/, "");
1847
+ slug = slug.replace(/[/\\]/g, "___");
1848
+ slug = slug.replace(/[^a-zA-Z0-9_-]/g, "-");
1849
+ return `${slug}.json`;
1850
+ }
1851
+ async function archiveRecap(worktreePath) {
1852
+ const filename = slugifyPath(worktreePath);
1853
+ const sourcePath = path4.join(RECAPS_DIR, filename);
1854
+ if (!await fs6.pathExists(sourcePath)) {
1855
+ getLogger().debug(`No recap file to archive for worktree: ${worktreePath}`);
1856
+ return;
1857
+ }
1858
+ const content = await fs6.readFile(sourcePath, "utf8");
1859
+ const data = JSON.parse(content);
1860
+ const archivedData = {
1861
+ ...data,
1862
+ archivedAt: (/* @__PURE__ */ new Date()).toISOString()
1863
+ };
1864
+ await fs6.ensureDir(ARCHIVED_DIR, { mode: 493 });
1865
+ const destPath = path4.join(ARCHIVED_DIR, filename);
1866
+ await fs6.writeFile(destPath, JSON.stringify(archivedData, null, 2), { mode: 420 });
1867
+ await fs6.unlink(sourcePath);
1868
+ getLogger().debug(`Recap archived for worktree: ${worktreePath}`);
1869
+ }
1870
+
1871
+ // src/lib/ResourceCleanup.ts
1787
1872
  var ResourceCleanup = class {
1788
1873
  constructor(gitWorktree, processManager, database, cliIsolation, settingsManager) {
1789
1874
  this.gitWorktree = gitWorktree;
@@ -1883,7 +1968,7 @@ ${blockerMessage}`);
1883
1968
  }
1884
1969
  let databaseConfig = null;
1885
1970
  if (!options.keepDatabase && worktree) {
1886
- const envFilePath = path4.join(worktree.path, ".env");
1971
+ const envFilePath = path5.join(worktree.path, ".env");
1887
1972
  try {
1888
1973
  const shouldCleanup = this.database ? await this.database.shouldUseDatabaseBranching(envFilePath) : false;
1889
1974
  databaseConfig = { shouldCleanup, envFilePath };
@@ -1951,6 +2036,33 @@ ${blockerMessage}`);
1951
2036
  });
1952
2037
  }
1953
2038
  }
2039
+ if (worktree) {
2040
+ if (options.dryRun) {
2041
+ operations.push({
2042
+ type: "recap",
2043
+ success: true,
2044
+ message: `[DRY RUN] Would archive recap file for: ${worktree.path}`
2045
+ });
2046
+ } else {
2047
+ try {
2048
+ await archiveRecap(worktree.path);
2049
+ operations.push({
2050
+ type: "recap",
2051
+ success: true,
2052
+ message: `Recap file archived`
2053
+ });
2054
+ } catch (error) {
2055
+ const err = error instanceof Error ? error : new Error("Unknown error");
2056
+ getLogger().warn(`Recap archival failed: ${err.message}`);
2057
+ operations.push({
2058
+ type: "recap",
2059
+ success: false,
2060
+ message: "Recap archival failed (non-fatal)",
2061
+ error: err.message
2062
+ });
2063
+ }
2064
+ }
2065
+ }
1954
2066
  if (options.deleteBranch && worktree) {
1955
2067
  if (options.dryRun) {
1956
2068
  operations.push({
@@ -2115,6 +2227,35 @@ ${blockerMessage}`);
2115
2227
  }
2116
2228
  }
2117
2229
  }
2230
+ if (worktree) {
2231
+ if (options.dryRun) {
2232
+ operations.push({
2233
+ type: "metadata",
2234
+ success: true,
2235
+ message: `[DRY RUN] Would delete metadata for worktree: ${worktree.path}`
2236
+ });
2237
+ } else {
2238
+ try {
2239
+ await this.metadataManager.deleteMetadata(worktree.path);
2240
+ getLogger().info(`Metadata deleted for worktree: ${worktree.path}`);
2241
+ operations.push({
2242
+ type: "metadata",
2243
+ success: true,
2244
+ message: "Metadata deleted"
2245
+ });
2246
+ } catch (error) {
2247
+ const err = error instanceof Error ? error : new Error(String(error));
2248
+ errors.push(err);
2249
+ getLogger().warn(`Metadata deletion failed: ${err.message}`);
2250
+ operations.push({
2251
+ type: "metadata",
2252
+ success: false,
2253
+ message: "Metadata deletion failed (non-fatal)",
2254
+ error: err.message
2255
+ });
2256
+ }
2257
+ }
2258
+ }
2118
2259
  const success = errors.length === 0;
2119
2260
  return {
2120
2261
  identifier: displayIdentifier,
@@ -2257,7 +2398,7 @@ ${blockerMessage}`);
2257
2398
  return false;
2258
2399
  }
2259
2400
  try {
2260
- const envFilePath = path4.join(worktreePath, ".env");
2401
+ const envFilePath = path5.join(worktreePath, ".env");
2261
2402
  const shouldCleanup = await this.database.shouldUseDatabaseBranching(envFilePath);
2262
2403
  let cwd;
2263
2404
  try {
@@ -2441,4 +2582,4 @@ export {
2441
2582
  DatabaseManager,
2442
2583
  ResourceCleanup
2443
2584
  };
2444
- //# sourceMappingURL=chunk-GWONJE3X.js.map
2585
+ //# sourceMappingURL=chunk-6Y3FTRJL.js.map