@iloom/cli 0.8.3 → 0.9.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 (180) 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/{GitHubService-ACZVNTJE.js → GitHubService-O7T6CFAJ.js} +3 -3
  7. package/dist/{LoomLauncher-NHZMEVTQ.js → LoomLauncher-3I47SUPV.js} +6 -6
  8. package/dist/{ProjectCapabilityDetector-IA56AUE6.js → ProjectCapabilityDetector-N5L7T4IY.js} +3 -3
  9. package/dist/PromptTemplateManager-36YLQRHP.js +11 -0
  10. package/dist/README.md +50 -4
  11. package/dist/{SettingsManager-VCVLL32H.js → SettingsManager-QR7V2IW2.js} +2 -2
  12. package/dist/agents/iloom-artifact-reviewer.md +280 -0
  13. package/dist/agents/iloom-code-reviewer.md +9 -7
  14. package/dist/agents/iloom-issue-analyze-and-plan.md +21 -6
  15. package/dist/agents/iloom-issue-analyzer.md +21 -6
  16. package/dist/agents/iloom-issue-complexity-evaluator.md +21 -6
  17. package/dist/agents/iloom-issue-enhancer.md +21 -6
  18. package/dist/agents/iloom-issue-implementer.md +21 -6
  19. package/dist/agents/iloom-issue-planner.md +21 -6
  20. package/dist/{build-Z3WCIKPD.js → build-IC4CJRMP.js} +8 -8
  21. package/dist/{chunk-TVH67KEO.js → chunk-2HZX6AMR.js} +2 -2
  22. package/dist/{chunk-VZYSM7N7.js → chunk-2JPXGGP4.js} +20 -15
  23. package/dist/chunk-2JPXGGP4.js.map +1 -0
  24. package/dist/{chunk-SC6X5EBG.js → chunk-3P6J4IZZ.js} +3 -3
  25. package/dist/{chunk-HSGZW3ID.js → chunk-4GAJJUYS.js} +3 -3
  26. package/dist/chunk-4GAJJUYS.js.map +1 -0
  27. package/dist/{chunk-RD7I2Q2F.js → chunk-4LKGCFGG.js} +2 -2
  28. package/dist/{chunk-GWONJE3X.js → chunk-4ZIHFUPN.js} +226 -62
  29. package/dist/chunk-4ZIHFUPN.js.map +1 -0
  30. package/dist/{chunk-SSASIBDJ.js → chunk-5LVVQGB3.js} +5 -5
  31. package/dist/{chunk-4BSXZ5YZ.js → chunk-B7U6OKUR.js} +5 -24
  32. package/dist/chunk-B7U6OKUR.js.map +1 -0
  33. package/dist/{chunk-RNBIISBZ.js → chunk-ENGCJIYQ.js} +48 -3
  34. package/dist/chunk-ENGCJIYQ.js.map +1 -0
  35. package/dist/{chunk-IGKPPACU.js → chunk-FO5GGFOV.js} +17 -8
  36. package/dist/chunk-FO5GGFOV.js.map +1 -0
  37. package/dist/{chunk-GDS2HXSW.js → chunk-H6ST2TGP.js} +20 -3
  38. package/dist/chunk-H6ST2TGP.js.map +1 -0
  39. package/dist/{chunk-A7XHHUEV.js → chunk-HZXBHMVM.js} +47 -22
  40. package/dist/chunk-HZXBHMVM.js.map +1 -0
  41. package/dist/{chunk-44Y5IF7P.js → chunk-I3HMNWQQ.js} +9 -8
  42. package/dist/chunk-I3HMNWQQ.js.map +1 -0
  43. package/dist/{chunk-XJHQVOT6.js → chunk-J7FJ6PUT.js} +2 -2
  44. package/dist/chunk-JT5LZRMI.js +302 -0
  45. package/dist/chunk-JT5LZRMI.js.map +1 -0
  46. package/dist/{chunk-Q457PKGH.js → chunk-KAYXR544.js} +2 -2
  47. package/dist/{chunk-XU5A6BWA.js → chunk-MZPRBNYC.js} +4 -4
  48. package/dist/{chunk-XHNACIHO.js → chunk-NTTSUAVM.js} +2 -2
  49. package/dist/{chunk-PLI3JQWT.js → chunk-OAVJR4PM.js} +2 -2
  50. package/dist/{chunk-UDZCTLD6.js → chunk-OK7LUTRW.js} +3 -3
  51. package/dist/{chunk-PBSHQVCT.js → chunk-POU2UMWN.js} +5 -5
  52. package/dist/chunk-QN47QVBX.js +131 -0
  53. package/dist/chunk-QN47QVBX.js.map +1 -0
  54. package/dist/{chunk-3FC3VNEX.js → chunk-RD7OPXZK.js} +34 -8
  55. package/dist/chunk-RD7OPXZK.js.map +1 -0
  56. package/dist/{chunk-O6LECMT6.js → chunk-TGRK3CHF.js} +8 -8
  57. package/dist/{chunk-7GLZVDPQ.js → chunk-TL72BGP6.js} +2 -2
  58. package/dist/{chunk-THS5L54H.js → chunk-TRUMP4DA.js} +26 -2
  59. package/dist/{chunk-THS5L54H.js.map → chunk-TRUMP4DA.js.map} +1 -1
  60. package/dist/{chunk-52MVUK5V.js → chunk-USSL2X4A.js} +2 -2
  61. package/dist/chunk-USSL2X4A.js.map +1 -0
  62. package/dist/{chunk-XPKN3QWY.js → chunk-VOGGLPG5.js} +1 -2
  63. package/dist/{chunk-IWIIOFEB.js → chunk-XFEK2X2D.js} +16 -6
  64. package/dist/chunk-XFEK2X2D.js.map +1 -0
  65. package/dist/{chunk-PVW6JE7E.js → chunk-Y5HSSIK2.js} +2 -2
  66. package/dist/{chunk-4KGRPHM6.js → chunk-Y5O2ALDZ.js} +3 -3
  67. package/dist/{claude-V4HRPR4Z.js → claude-TP2QO3BU.js} +2 -2
  68. package/dist/{cleanup-NWNKWPUY.js → cleanup-D3CSRBBZ.js} +23 -18
  69. package/dist/{cleanup-NWNKWPUY.js.map → cleanup-D3CSRBBZ.js.map} +1 -1
  70. package/dist/cli.js +143 -93
  71. package/dist/cli.js.map +1 -1
  72. package/dist/{commit-534QIRHY.js → commit-IWGT42XN.js} +13 -13
  73. package/dist/{compile-UANHMNTS.js → compile-EOWJORKO.js} +8 -8
  74. package/dist/{contribute-7USRBWRM.js → contribute-WSJTV2RX.js} +4 -4
  75. package/dist/{dev-server-TO7RLYJI.js → dev-server-Q6M62ATG.js} +13 -13
  76. package/dist/{feedback-7ZZI6RC5.js → feedback-QPNDZQRV.js} +14 -14
  77. package/dist/{git-GUNOPP4Q.js → git-W3XUIFTR.js} +5 -3
  78. package/dist/hooks/iloom-hook.js +5 -3
  79. package/dist/{ignite-JBX3BUDE.js → ignite-OPO6EDYT.js} +95 -52
  80. package/dist/ignite-OPO6EDYT.js.map +1 -0
  81. package/dist/index.d.ts +40 -2
  82. package/dist/index.js +52 -15
  83. package/dist/index.js.map +1 -1
  84. package/dist/{chunk-FPNSFP6K.js → init-ALYWKNWG.js} +42 -329
  85. package/dist/init-ALYWKNWG.js.map +1 -0
  86. package/dist/issues-L7TBUPXT.js +116 -0
  87. package/dist/issues-L7TBUPXT.js.map +1 -0
  88. package/dist/{lint-XPODLDVA.js → lint-IHUH45OC.js} +8 -8
  89. package/dist/mcp/issue-management-server.js +3 -2
  90. package/dist/mcp/issue-management-server.js.map +1 -1
  91. package/dist/{open-M2SUR74Y.js → open-KWOV2OFO.js} +15 -15
  92. package/dist/{plan-FB4AOJ2Q.js → plan-BRJBFJHF.js} +60 -28
  93. package/dist/plan-BRJBFJHF.js.map +1 -0
  94. package/dist/{projects-325GEEGJ.js → projects-LH362JZQ.js} +3 -3
  95. package/dist/prompts/init-prompt.txt +9 -1
  96. package/dist/prompts/issue-prompt.txt +310 -0
  97. package/dist/prompts/plan-prompt.txt +4 -6
  98. package/dist/prompts/pr-prompt.txt +79 -0
  99. package/dist/prompts/regular-prompt.txt +205 -0
  100. package/dist/{rebase-4FNRBW3H.js → rebase-AJOJOZUG.js} +9 -9
  101. package/dist/{recap-GSXFEOD6.js → recap-GKJXMDXW.js} +5 -5
  102. package/dist/{run-GZNHRJB2.js → run-QEUVZF7J.js} +15 -15
  103. package/dist/schema/settings.schema.json +9 -1
  104. package/dist/{shell-2SPM3Z5O.js → shell-DAAVG4YN.js} +5 -5
  105. package/dist/{summary-Z4F7YFXE.js → summary-ZKOA35PT.js} +13 -13
  106. package/dist/{test-LBSPYIJW.js → test-5GPWWO3P.js} +8 -8
  107. package/dist/{test-git-ZPSPA2TP.js → test-git-EJUKDB7F.js} +3 -3
  108. package/dist/{test-prefix-6DLB2BHE.js → test-prefix-23TOBUXY.js} +3 -3
  109. package/dist/{test-webserver-XLJ2TZFP.js → test-webserver-CKROHFBQ.js} +5 -5
  110. package/dist/{vscode-LH3VSQ2W.js → vscode-6TOLFCI2.js} +5 -5
  111. package/package.json +2 -2
  112. package/dist/ClaudeContextManager-RDP6CLK6.js +0 -14
  113. package/dist/ClaudeService-FKPOQRA4.js +0 -13
  114. package/dist/PRManager-A63LT3NF.js +0 -16
  115. package/dist/PromptTemplateManager-OUYDHOPI.js +0 -9
  116. package/dist/chunk-3FC3VNEX.js.map +0 -1
  117. package/dist/chunk-44Y5IF7P.js.map +0 -1
  118. package/dist/chunk-4BSXZ5YZ.js.map +0 -1
  119. package/dist/chunk-52MVUK5V.js.map +0 -1
  120. package/dist/chunk-66QOCD5N.js +0 -79
  121. package/dist/chunk-66QOCD5N.js.map +0 -1
  122. package/dist/chunk-A7XHHUEV.js.map +0 -1
  123. package/dist/chunk-FPNSFP6K.js.map +0 -1
  124. package/dist/chunk-GDS2HXSW.js.map +0 -1
  125. package/dist/chunk-GWONJE3X.js.map +0 -1
  126. package/dist/chunk-HSGZW3ID.js.map +0 -1
  127. package/dist/chunk-IGKPPACU.js.map +0 -1
  128. package/dist/chunk-IWIIOFEB.js.map +0 -1
  129. package/dist/chunk-RNBIISBZ.js.map +0 -1
  130. package/dist/chunk-VZYSM7N7.js.map +0 -1
  131. package/dist/git-GUNOPP4Q.js.map +0 -1
  132. package/dist/ignite-JBX3BUDE.js.map +0 -1
  133. package/dist/init-XXDIB2UJ.js +0 -21
  134. package/dist/init-XXDIB2UJ.js.map +0 -1
  135. package/dist/plan-FB4AOJ2Q.js.map +0 -1
  136. /package/dist/{BranchNamingService-AO7BPIUJ.js.map → BranchNamingService-K6XNWQ6C.js.map} +0 -0
  137. /package/dist/{ClaudeContextManager-RDP6CLK6.js.map → ClaudeContextManager-X2Y72GRL.js.map} +0 -0
  138. /package/dist/{ClaudeService-FKPOQRA4.js.map → ClaudeService-7P32TTES.js.map} +0 -0
  139. /package/dist/{GitHubService-ACZVNTJE.js.map → GitHubService-O7T6CFAJ.js.map} +0 -0
  140. /package/dist/{LoomLauncher-NHZMEVTQ.js.map → LoomLauncher-3I47SUPV.js.map} +0 -0
  141. /package/dist/{PRManager-A63LT3NF.js.map → ProjectCapabilityDetector-N5L7T4IY.js.map} +0 -0
  142. /package/dist/{ProjectCapabilityDetector-IA56AUE6.js.map → PromptTemplateManager-36YLQRHP.js.map} +0 -0
  143. /package/dist/{PromptTemplateManager-OUYDHOPI.js.map → SettingsManager-QR7V2IW2.js.map} +0 -0
  144. /package/dist/{build-Z3WCIKPD.js.map → build-IC4CJRMP.js.map} +0 -0
  145. /package/dist/{chunk-TVH67KEO.js.map → chunk-2HZX6AMR.js.map} +0 -0
  146. /package/dist/{chunk-SC6X5EBG.js.map → chunk-3P6J4IZZ.js.map} +0 -0
  147. /package/dist/{chunk-RD7I2Q2F.js.map → chunk-4LKGCFGG.js.map} +0 -0
  148. /package/dist/{chunk-SSASIBDJ.js.map → chunk-5LVVQGB3.js.map} +0 -0
  149. /package/dist/{chunk-XJHQVOT6.js.map → chunk-J7FJ6PUT.js.map} +0 -0
  150. /package/dist/{chunk-Q457PKGH.js.map → chunk-KAYXR544.js.map} +0 -0
  151. /package/dist/{chunk-XU5A6BWA.js.map → chunk-MZPRBNYC.js.map} +0 -0
  152. /package/dist/{chunk-XHNACIHO.js.map → chunk-NTTSUAVM.js.map} +0 -0
  153. /package/dist/{chunk-PLI3JQWT.js.map → chunk-OAVJR4PM.js.map} +0 -0
  154. /package/dist/{chunk-UDZCTLD6.js.map → chunk-OK7LUTRW.js.map} +0 -0
  155. /package/dist/{chunk-PBSHQVCT.js.map → chunk-POU2UMWN.js.map} +0 -0
  156. /package/dist/{chunk-O6LECMT6.js.map → chunk-TGRK3CHF.js.map} +0 -0
  157. /package/dist/{chunk-7GLZVDPQ.js.map → chunk-TL72BGP6.js.map} +0 -0
  158. /package/dist/{chunk-XPKN3QWY.js.map → chunk-VOGGLPG5.js.map} +0 -0
  159. /package/dist/{chunk-PVW6JE7E.js.map → chunk-Y5HSSIK2.js.map} +0 -0
  160. /package/dist/{chunk-4KGRPHM6.js.map → chunk-Y5O2ALDZ.js.map} +0 -0
  161. /package/dist/{SettingsManager-VCVLL32H.js.map → claude-TP2QO3BU.js.map} +0 -0
  162. /package/dist/{commit-534QIRHY.js.map → commit-IWGT42XN.js.map} +0 -0
  163. /package/dist/{compile-UANHMNTS.js.map → compile-EOWJORKO.js.map} +0 -0
  164. /package/dist/{contribute-7USRBWRM.js.map → contribute-WSJTV2RX.js.map} +0 -0
  165. /package/dist/{dev-server-TO7RLYJI.js.map → dev-server-Q6M62ATG.js.map} +0 -0
  166. /package/dist/{feedback-7ZZI6RC5.js.map → feedback-QPNDZQRV.js.map} +0 -0
  167. /package/dist/{claude-V4HRPR4Z.js.map → git-W3XUIFTR.js.map} +0 -0
  168. /package/dist/{lint-XPODLDVA.js.map → lint-IHUH45OC.js.map} +0 -0
  169. /package/dist/{open-M2SUR74Y.js.map → open-KWOV2OFO.js.map} +0 -0
  170. /package/dist/{projects-325GEEGJ.js.map → projects-LH362JZQ.js.map} +0 -0
  171. /package/dist/{rebase-4FNRBW3H.js.map → rebase-AJOJOZUG.js.map} +0 -0
  172. /package/dist/{recap-GSXFEOD6.js.map → recap-GKJXMDXW.js.map} +0 -0
  173. /package/dist/{run-GZNHRJB2.js.map → run-QEUVZF7J.js.map} +0 -0
  174. /package/dist/{shell-2SPM3Z5O.js.map → shell-DAAVG4YN.js.map} +0 -0
  175. /package/dist/{summary-Z4F7YFXE.js.map → summary-ZKOA35PT.js.map} +0 -0
  176. /package/dist/{test-LBSPYIJW.js.map → test-5GPWWO3P.js.map} +0 -0
  177. /package/dist/{test-git-ZPSPA2TP.js.map → test-git-EJUKDB7F.js.map} +0 -0
  178. /package/dist/{test-prefix-6DLB2BHE.js.map → test-prefix-23TOBUXY.js.map} +0 -0
  179. /package/dist/{test-webserver-XLJ2TZFP.js.map → test-webserver-CKROHFBQ.js.map} +0 -0
  180. /package/dist/{vscode-LH3VSQ2W.js.map → vscode-6TOLFCI2.js.map} +0 -0
@@ -1,39 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- installDependencies,
4
- runScript
5
- } from "./chunk-RD7I2Q2F.js";
3
+ PRManager
4
+ } from "./chunk-I3HMNWQQ.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";
34
41
  import {
35
42
  GitHubService
36
- } from "./chunk-PVW6JE7E.js";
43
+ } from "./chunk-Y5HSSIK2.js";
37
44
  import {
38
45
  calculateForegroundColor,
39
46
  generateColorFromBranchName,
@@ -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";
@@ -237,7 +244,7 @@ var LoomManager = class {
237
244
  * NEW: Checks for existing worktrees and reuses them if found
238
245
  */
239
246
  async createIloom(input) {
240
- 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;
241
248
  getLogger().info("Fetching issue data...");
242
249
  const issueData = await this.fetchIssueData(input);
243
250
  if (input.type === "issue" || input.type === "pr" || input.type === "branch") {
@@ -325,38 +332,79 @@ 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
+ let prBody;
379
+ if (input.type === "issue") {
380
+ const issueBody = (issueData == null ? void 0 : issueData.body) ? `
348
381
 
349
- 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}`);
382
+ ## ${issueData.title}
383
+
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";
396
+ getLogger().info("Creating draft PR...");
397
+ const prResult = await prManager.createDraftPR(
398
+ branchName,
399
+ prTitle,
400
+ prBody,
401
+ draftBaseBranch,
402
+ worktreePath
403
+ );
404
+ draftPrNumber = prResult.number;
405
+ draftPrUrl = prResult.url;
406
+ getLogger().success(`Draft PR created: ${prResult.url}`);
407
+ }
360
408
  }
361
409
  const allMetadata = await this.metadataManager.listAllMetadata();
362
410
  const usedHexColors = allMetadata.filter((metadata) => metadata.colorHex !== null).map((metadata) => metadata.colorHex);
@@ -384,16 +432,16 @@ This PR was created automatically by iloom.`;
384
432
  );
385
433
  }
386
434
  }
387
- const enableClaude = ((_e = input.options) == null ? void 0 : _e.enableClaude) !== false;
388
- const enableCode = ((_f = input.options) == null ? void 0 : _f.enableCode) !== false;
389
- const enableDevServer = ((_g = input.options) == null ? void 0 : _g.enableDevServer) !== false;
390
- const enableTerminal = ((_h = input.options) == null ? void 0 : _h.enableTerminal) ?? false;
391
- const oneShot = ((_i = input.options) == null ? void 0 : _i.oneShot) ?? "default";
392
- const setArguments = (_j = input.options) == null ? void 0 : _j.setArguments;
393
- 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;
394
442
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
395
- const { LoomLauncher } = await import("./LoomLauncher-NHZMEVTQ.js");
396
- const { ClaudeContextManager } = await import("./ClaudeContextManager-RDP6CLK6.js");
443
+ const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
444
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
397
445
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
398
446
  const launcher = new LoomLauncher(claudeContext, this.settings);
399
447
  await launcher.launchLoom({
@@ -412,7 +460,7 @@ This PR was created automatically by iloom.`;
412
460
  ...setArguments && { setArguments },
413
461
  ...executablePath && { executablePath },
414
462
  sourceEnvOnStart: settingsData.sourceEnvOnStart ?? false,
415
- 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,
416
464
  colorHex: colorData.hex
417
465
  });
418
466
  }
@@ -428,6 +476,9 @@ This PR was created automatically by iloom.`;
428
476
  }
429
477
  }
430
478
  const pr_numbers = input.type === "pr" ? [String(input.identifier)] : [];
479
+ if (draftPrNumber && !pr_numbers.includes(String(draftPrNumber))) {
480
+ pr_numbers.push(String(draftPrNumber));
481
+ }
431
482
  const sessionId = generateRandomSessionId();
432
483
  let issueUrls = {};
433
484
  if (input.type === "issue" && (issueData == null ? void 0 : issueData.url)) {
@@ -452,7 +503,7 @@ This PR was created automatically by iloom.`;
452
503
  prUrls,
453
504
  capabilities,
454
505
  ...draftPrNumber && { draftPrNumber },
455
- ...((_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 },
456
507
  ...input.parentLoom && { parentLoom: input.parentLoom }
457
508
  };
458
509
  await this.metadataManager.writeMetadata(worktreePath, metadataInput);
@@ -541,7 +592,7 @@ This PR was created automatically by iloom.`;
541
592
  async checkAndWarnChildLooms(branchName) {
542
593
  let targetBranch = branchName;
543
594
  if (!targetBranch) {
544
- const { getCurrentBranch } = await import("./git-GUNOPP4Q.js");
595
+ const { getCurrentBranch } = await import("./git-W3XUIFTR.js");
545
596
  targetBranch = await getCurrentBranch();
546
597
  }
547
598
  if (!targetBranch) {
@@ -640,13 +691,27 @@ This PR was created automatically by iloom.`;
640
691
  );
641
692
  }
642
693
  }
643
- const branchExistedLocally = await branchExists(branchName);
694
+ const branchExistedLocally = await branchExists(branchName, process.cwd(), false);
644
695
  if (input.type !== "pr" && branchExistedLocally) {
645
696
  throw new Error(
646
697
  `Cannot create worktree: branch '${branchName}' already exists. Use 'git branch -D ${branchName}' to delete it first if needed.`
647
698
  );
648
699
  }
649
- const baseBranch = ((_a = input.parentLoom) == null ? void 0 : _a.branchName) ?? input.baseBranch;
700
+ const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
701
+ const isPRMode = mergeBehavior.mode === "github-pr" || mergeBehavior.mode === "github-draft-pr";
702
+ const isChildLoom = !!input.parentLoom;
703
+ let baseBranch;
704
+ if (isChildLoom) {
705
+ baseBranch = ((_a = input.parentLoom) == null ? void 0 : _a.branchName) ?? input.baseBranch;
706
+ } else if (isPRMode && input.type !== "pr") {
707
+ getLogger().info("Fetching from origin to ensure latest main branch...");
708
+ await fetchOrigin(this.gitWorktree.workingDirectory);
709
+ const mainBranch = settingsData.mainBranch ?? "main";
710
+ baseBranch = `origin/${mainBranch}`;
711
+ getLogger().info(`Branching from ${baseBranch}`);
712
+ } else {
713
+ baseBranch = input.baseBranch;
714
+ }
650
715
  await this.gitWorktree.createWorktree({
651
716
  path: worktreePath,
652
717
  branch: branchName,
@@ -1047,8 +1112,8 @@ This PR was created automatically by iloom.`;
1047
1112
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
1048
1113
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
1049
1114
  getLogger().info("Launching workspace components...");
1050
- const { LoomLauncher } = await import("./LoomLauncher-NHZMEVTQ.js");
1051
- const { ClaudeContextManager } = await import("./ClaudeContextManager-RDP6CLK6.js");
1115
+ const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
1116
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
1052
1117
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
1053
1118
  const launcher = new LoomLauncher(claudeContext, this.settings);
1054
1119
  await launcher.launchLoom({
@@ -1783,7 +1848,41 @@ var DatabaseManager = class {
1783
1848
  };
1784
1849
 
1785
1850
  // src/lib/ResourceCleanup.ts
1851
+ import path5 from "path";
1852
+
1853
+ // src/utils/recap-archiver.ts
1786
1854
  import path4 from "path";
1855
+ import os2 from "os";
1856
+ import fs6 from "fs-extra";
1857
+ var RECAPS_DIR = path4.join(os2.homedir(), ".config", "iloom-ai", "recaps");
1858
+ var ARCHIVED_DIR = path4.join(RECAPS_DIR, "archived");
1859
+ function slugifyPath(loomPath) {
1860
+ let slug = loomPath.replace(/[/\\]+$/, "");
1861
+ slug = slug.replace(/[/\\]/g, "___");
1862
+ slug = slug.replace(/[^a-zA-Z0-9_-]/g, "-");
1863
+ return `${slug}.json`;
1864
+ }
1865
+ async function archiveRecap(worktreePath) {
1866
+ const filename = slugifyPath(worktreePath);
1867
+ const sourcePath = path4.join(RECAPS_DIR, filename);
1868
+ if (!await fs6.pathExists(sourcePath)) {
1869
+ getLogger().debug(`No recap file to archive for worktree: ${worktreePath}`);
1870
+ return;
1871
+ }
1872
+ const content = await fs6.readFile(sourcePath, "utf8");
1873
+ const data = JSON.parse(content);
1874
+ const archivedData = {
1875
+ ...data,
1876
+ archivedAt: (/* @__PURE__ */ new Date()).toISOString()
1877
+ };
1878
+ await fs6.ensureDir(ARCHIVED_DIR, { mode: 493 });
1879
+ const destPath = path4.join(ARCHIVED_DIR, filename);
1880
+ await fs6.writeFile(destPath, JSON.stringify(archivedData, null, 2), { mode: 420 });
1881
+ await fs6.unlink(sourcePath);
1882
+ getLogger().debug(`Recap archived for worktree: ${worktreePath}`);
1883
+ }
1884
+
1885
+ // src/lib/ResourceCleanup.ts
1787
1886
  var ResourceCleanup = class {
1788
1887
  constructor(gitWorktree, processManager, database, cliIsolation, settingsManager) {
1789
1888
  this.gitWorktree = gitWorktree;
@@ -1865,6 +1964,7 @@ var ResourceCleanup = class {
1865
1964
  rollbackRequired: false
1866
1965
  };
1867
1966
  }
1967
+ let safetyCheckPassed = false;
1868
1968
  if (!options.force) {
1869
1969
  const shouldCheckMergeSafety = options.checkMergeSafety ?? options.deleteBranch === true;
1870
1970
  const shouldCheckRemoteBranch = options.checkRemoteBranch ?? false;
@@ -1875,6 +1975,7 @@ var ResourceCleanup = class {
1875
1975
 
1876
1976
  ${blockerMessage}`);
1877
1977
  }
1978
+ safetyCheckPassed = true;
1878
1979
  if (safety.warnings.length > 0) {
1879
1980
  safety.warnings.forEach((warning) => {
1880
1981
  getLogger().warn(warning);
@@ -1883,7 +1984,7 @@ ${blockerMessage}`);
1883
1984
  }
1884
1985
  let databaseConfig = null;
1885
1986
  if (!options.keepDatabase && worktree) {
1886
- const envFilePath = path4.join(worktree.path, ".env");
1987
+ const envFilePath = path5.join(worktree.path, ".env");
1887
1988
  try {
1888
1989
  const shouldCleanup = this.database ? await this.database.shouldUseDatabaseBranching(envFilePath) : false;
1889
1990
  databaseConfig = { shouldCleanup, envFilePath };
@@ -1951,6 +2052,33 @@ ${blockerMessage}`);
1951
2052
  });
1952
2053
  }
1953
2054
  }
2055
+ if (worktree) {
2056
+ if (options.dryRun) {
2057
+ operations.push({
2058
+ type: "recap",
2059
+ success: true,
2060
+ message: `[DRY RUN] Would archive recap file for: ${worktree.path}`
2061
+ });
2062
+ } else {
2063
+ try {
2064
+ await archiveRecap(worktree.path);
2065
+ operations.push({
2066
+ type: "recap",
2067
+ success: true,
2068
+ message: `Recap file archived`
2069
+ });
2070
+ } catch (error) {
2071
+ const err = error instanceof Error ? error : new Error("Unknown error");
2072
+ getLogger().warn(`Recap archival failed: ${err.message}`);
2073
+ operations.push({
2074
+ type: "recap",
2075
+ success: false,
2076
+ message: "Recap archival failed (non-fatal)",
2077
+ error: err.message
2078
+ });
2079
+ }
2080
+ }
2081
+ }
1954
2082
  if (options.deleteBranch && worktree) {
1955
2083
  if (options.dryRun) {
1956
2084
  operations.push({
@@ -1961,7 +2089,8 @@ ${blockerMessage}`);
1961
2089
  } else {
1962
2090
  try {
1963
2091
  const branchOptions = {
1964
- dryRun: false
2092
+ dryRun: false,
2093
+ safetyVerified: safetyCheckPassed
1965
2094
  };
1966
2095
  if (mergeTargetBranch !== null) {
1967
2096
  branchOptions.mergeTargetBranch = mergeTargetBranch;
@@ -2115,6 +2244,35 @@ ${blockerMessage}`);
2115
2244
  }
2116
2245
  }
2117
2246
  }
2247
+ if (worktree) {
2248
+ if (options.dryRun) {
2249
+ operations.push({
2250
+ type: "metadata",
2251
+ success: true,
2252
+ message: `[DRY RUN] Would delete metadata for worktree: ${worktree.path}`
2253
+ });
2254
+ } else {
2255
+ try {
2256
+ await this.metadataManager.deleteMetadata(worktree.path);
2257
+ getLogger().info(`Metadata deleted for worktree: ${worktree.path}`);
2258
+ operations.push({
2259
+ type: "metadata",
2260
+ success: true,
2261
+ message: "Metadata deleted"
2262
+ });
2263
+ } catch (error) {
2264
+ const err = error instanceof Error ? error : new Error(String(error));
2265
+ errors.push(err);
2266
+ getLogger().warn(`Metadata deletion failed: ${err.message}`);
2267
+ operations.push({
2268
+ type: "metadata",
2269
+ success: false,
2270
+ message: "Metadata deletion failed (non-fatal)",
2271
+ error: err.message
2272
+ });
2273
+ }
2274
+ }
2275
+ }
2118
2276
  const success = errors.length === 0;
2119
2277
  return {
2120
2278
  identifier: displayIdentifier,
@@ -2175,9 +2333,9 @@ ${blockerMessage}`);
2175
2333
  getLogger().info(`[DRY RUN] Would delete branch: ${branchName}`);
2176
2334
  return true;
2177
2335
  }
2336
+ let deleteCwd = workingDir;
2178
2337
  try {
2179
2338
  let deleteFlag = "-d";
2180
- let deleteCwd = workingDir;
2181
2339
  if (options.force) {
2182
2340
  deleteFlag = "-D";
2183
2341
  } else if (options.mergeTargetBranch) {
@@ -2232,6 +2390,12 @@ ${blockerMessage}`);
2232
2390
  throw error;
2233
2391
  }
2234
2392
  if (errorMessage.includes("not fully merged")) {
2393
+ if (options.safetyVerified) {
2394
+ getLogger().info(`Branch '${branchName}' not merged into HEAD but safety verified - using force delete`);
2395
+ await executeGitCommand(["branch", "-D", branchName], { cwd: deleteCwd });
2396
+ getLogger().info(`Branch deleted: ${branchName}`);
2397
+ return true;
2398
+ }
2235
2399
  throw new Error(
2236
2400
  `Cannot delete unmerged branch '${branchName}'. Use --force to delete anyway.`
2237
2401
  );
@@ -2257,7 +2421,7 @@ ${blockerMessage}`);
2257
2421
  return false;
2258
2422
  }
2259
2423
  try {
2260
- const envFilePath = path4.join(worktreePath, ".env");
2424
+ const envFilePath = path5.join(worktreePath, ".env");
2261
2425
  const shouldCleanup = await this.database.shouldUseDatabaseBranching(envFilePath);
2262
2426
  let cwd;
2263
2427
  try {
@@ -2441,4 +2605,4 @@ export {
2441
2605
  DatabaseManager,
2442
2606
  ResourceCleanup
2443
2607
  };
2444
- //# sourceMappingURL=chunk-GWONJE3X.js.map
2608
+ //# sourceMappingURL=chunk-4ZIHFUPN.js.map