@iloom/cli 0.10.0 → 0.10.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 (157) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -2
  3. package/dist/{BranchNamingService-ECJHBB67.js → BranchNamingService-4OP6LOH6.js} +2 -2
  4. package/dist/ClaudeContextManager-ZKTUVQB2.js +14 -0
  5. package/dist/ClaudeService-TRWOYQ6O.js +13 -0
  6. package/dist/{LoomLauncher-L64HHS3T.js → LoomLauncher-FRECYMXS.js} +6 -6
  7. package/dist/{PromptTemplateManager-DULSVRRE.js → PromptTemplateManager-YOE2SIPG.js} +2 -2
  8. package/dist/README.md +2 -2
  9. package/dist/{SettingsManager-BQDQA3FK.js → SettingsManager-FNKCOZMQ.js} +2 -2
  10. package/dist/{build-5GO3XW26.js → build-VHGEMXBA.js} +6 -6
  11. package/dist/{chunk-ZW2LKWWE.js → chunk-2VEWSM34.js} +3 -3
  12. package/dist/{chunk-LXLMMXXY.js → chunk-2YZCWAVZ.js} +17 -12
  13. package/dist/chunk-2YZCWAVZ.js.map +1 -0
  14. package/dist/{chunk-UD3WJDIV.js → chunk-3F27M7ZD.js} +11 -774
  15. package/dist/chunk-3F27M7ZD.js.map +1 -0
  16. package/dist/chunk-4E7LCFUG.js +24 -0
  17. package/dist/chunk-4E7LCFUG.js.map +1 -0
  18. package/dist/{chunk-MNHZB4Z2.js → chunk-4FGEGQW4.js} +3 -3
  19. package/dist/{chunk-WY4QBK43.js → chunk-63QWFWH3.js} +2 -2
  20. package/dist/{chunk-YYAKPQBT.js → chunk-7VHJNVLF.js} +19 -9
  21. package/dist/chunk-7VHJNVLF.js.map +1 -0
  22. package/dist/chunk-BFHDVFSK.js +651 -0
  23. package/dist/chunk-BFHDVFSK.js.map +1 -0
  24. package/dist/{chunk-FB47TIJG.js → chunk-BFLMCE2U.js} +4 -23
  25. package/dist/chunk-BFLMCE2U.js.map +1 -0
  26. package/dist/{chunk-SN3SQCFK.js → chunk-BU53XIGY.js} +4 -4
  27. package/dist/{chunk-SF2P22EE.js → chunk-C6HNNJIV.js} +2 -2
  28. package/dist/{chunk-5MWV33NN.js → chunk-CVCTIDDK.js} +2 -2
  29. package/dist/{chunk-ZEWU5PZK.js → chunk-G5V75JD5.js} +2 -2
  30. package/dist/{chunk-ZHPNZC75.js → chunk-HYGUPUV5.js} +26 -21
  31. package/dist/chunk-HYGUPUV5.js.map +1 -0
  32. package/dist/{chunk-VGGST52X.js → chunk-I5T677EA.js} +2 -2
  33. package/dist/{chunk-VECNX6VX.js → chunk-KIK2ZFAL.js} +2 -2
  34. package/dist/{chunk-3D7WQM7I.js → chunk-LLHXQS3C.js} +2 -2
  35. package/dist/{chunk-Y4YZTHZE.js → chunk-LUKXJSRI.js} +2 -2
  36. package/dist/{chunk-ONQYPICO.js → chunk-PZ5WSR5Z.js} +63 -9
  37. package/dist/chunk-PZ5WSR5Z.js.map +1 -0
  38. package/dist/{chunk-J5S7DFYC.js → chunk-QFTDZ5E3.js} +2 -2
  39. package/dist/chunk-RJ3VBUFK.js +781 -0
  40. package/dist/chunk-RJ3VBUFK.js.map +1 -0
  41. package/dist/{chunk-UWGVCXRF.js → chunk-SKSYYBCU.js} +23 -1
  42. package/dist/chunk-SKSYYBCU.js.map +1 -0
  43. package/dist/{chunk-JO2LZ6EQ.js → chunk-SWSJWA2S.js} +2 -2
  44. package/dist/{chunk-4WJNIR5O.js → chunk-UUEW5KWB.js} +1 -1
  45. package/dist/chunk-UUEW5KWB.js.map +1 -0
  46. package/dist/{chunk-6EU6TCF6.js → chunk-V3SVMFDQ.js} +5 -5
  47. package/dist/{chunk-NRSWLOAZ.js → chunk-WXIM2WS7.js} +4 -4
  48. package/dist/{chunk-RYWFS37M.js → chunk-XE4BDRZD.js} +2 -2
  49. package/dist/{ignite-CGOV3TD4.js → chunk-ZGM2FE2R.js} +105 -73
  50. package/dist/chunk-ZGM2FE2R.js.map +1 -0
  51. package/dist/{claude-P3NQR6IJ.js → claude-LN7OWVNI.js} +2 -2
  52. package/dist/{cleanup-6UCPVMFG.js → cleanup-4ZM2AJDC.js} +19 -17
  53. package/dist/{cleanup-6UCPVMFG.js.map → cleanup-4ZM2AJDC.js.map} +1 -1
  54. package/dist/cli.js +167 -614
  55. package/dist/cli.js.map +1 -1
  56. package/dist/{commit-L3EPY5QG.js → commit-4CFLXRZ3.js} +12 -10
  57. package/dist/commit-4CFLXRZ3.js.map +1 -0
  58. package/dist/{compile-ZS4HYRX5.js → compile-7ALJHZ4N.js} +6 -6
  59. package/dist/{contribute-ORDDQGSL.js → contribute-5GKLK3BQ.js} +3 -3
  60. package/dist/{dev-server-FYZ2AQIH.js → dev-server-7SMIB7OF.js} +8 -8
  61. package/dist/{feedback-TMBXSCM5.js → feedback-EZWF5CAL.js} +10 -8
  62. package/dist/{feedback-TMBXSCM5.js.map → feedback-EZWF5CAL.js.map} +1 -1
  63. package/dist/{git-ET64COO3.js → git-GTLKAZRJ.js} +3 -3
  64. package/dist/ignite-MQETGFNA.js +34 -0
  65. package/dist/ignite-MQETGFNA.js.map +1 -0
  66. package/dist/index.d.ts +113 -18
  67. package/dist/index.js +180 -15
  68. package/dist/index.js.map +1 -1
  69. package/dist/{init-GFQ5W7GK.js → init-ZB2RITW6.js} +8 -8
  70. package/dist/install-deps-RLSGSHH7.js +43 -0
  71. package/dist/install-deps-RLSGSHH7.js.map +1 -0
  72. package/dist/{issues-T4ZZSPEG.js → issues-4UUAQ5K6.js} +3 -3
  73. package/dist/{lint-6TQXDZ3T.js → lint-AAN2NZWG.js} +6 -6
  74. package/dist/mcp/harness-server.js +140 -0
  75. package/dist/mcp/harness-server.js.map +1 -0
  76. package/dist/mcp/issue-management-server.js +140 -18
  77. package/dist/mcp/issue-management-server.js.map +1 -1
  78. package/dist/{open-5QZGXQRF.js → open-FXWW3VI4.js} +8 -8
  79. package/dist/{plan-U7ZQWLFY.js → plan-D3KSN5MU.js} +338 -36
  80. package/dist/plan-D3KSN5MU.js.map +1 -0
  81. package/dist/prompts/CLAUDE.md +2 -2
  82. package/dist/prompts/init-prompt.txt +102 -27
  83. package/dist/prompts/issue-prompt.txt +46 -0
  84. package/dist/prompts/plan-prompt.txt +59 -19
  85. package/dist/prompts/swarm-orchestrator-prompt.txt +121 -80
  86. package/dist/{rebase-DWIB77KV.js → rebase-62FDLIH4.js} +17 -8
  87. package/dist/rebase-62FDLIH4.js.map +1 -0
  88. package/dist/{recap-MX63HAKV.js → recap-OMBOKJST.js} +6 -6
  89. package/dist/{run-O3TFNQFC.js → run-BBXLRIZB.js} +8 -8
  90. package/dist/schema/settings.schema.json +36 -2
  91. package/dist/{shell-G6VC2CYR.js → shell-RF7LTND5.js} +5 -5
  92. package/dist/{summary-FWHAX55O.js → summary-YZI25KW4.js} +9 -9
  93. package/dist/{test-F7JNJZYP.js → test-SGO6I5Z7.js} +6 -6
  94. package/dist/{test-git-BTAOIUE2.js → test-git-XM4TM65W.js} +3 -3
  95. package/dist/{test-jira-CHYNV33F.js → test-jira-LDTOYFSD.js} +3 -3
  96. package/dist/{test-prefix-Q6TFSU6F.js → test-prefix-GBO37XCN.js} +3 -3
  97. package/dist/{test-webserver-EONCG7E7.js → test-webserver-NZ3JTVLL.js} +5 -5
  98. package/dist/{vscode-VA5X4P25.js → vscode-6XUGHJKL.js} +5 -5
  99. package/package.json +1 -1
  100. package/dist/ClaudeContextManager-QXX6ZFST.js +0 -14
  101. package/dist/ClaudeService-NJNK2SUH.js +0 -13
  102. package/dist/chunk-4WJNIR5O.js.map +0 -1
  103. package/dist/chunk-FB47TIJG.js.map +0 -1
  104. package/dist/chunk-LXLMMXXY.js.map +0 -1
  105. package/dist/chunk-ONQYPICO.js.map +0 -1
  106. package/dist/chunk-UD3WJDIV.js.map +0 -1
  107. package/dist/chunk-UVD4CZKS.js +0 -101
  108. package/dist/chunk-UVD4CZKS.js.map +0 -1
  109. package/dist/chunk-UWGVCXRF.js.map +0 -1
  110. package/dist/chunk-YYAKPQBT.js.map +0 -1
  111. package/dist/chunk-ZHPNZC75.js.map +0 -1
  112. package/dist/commit-L3EPY5QG.js.map +0 -1
  113. package/dist/ignite-CGOV3TD4.js.map +0 -1
  114. package/dist/plan-U7ZQWLFY.js.map +0 -1
  115. package/dist/rebase-DWIB77KV.js.map +0 -1
  116. /package/dist/{BranchNamingService-ECJHBB67.js.map → BranchNamingService-4OP6LOH6.js.map} +0 -0
  117. /package/dist/{ClaudeContextManager-QXX6ZFST.js.map → ClaudeContextManager-ZKTUVQB2.js.map} +0 -0
  118. /package/dist/{ClaudeService-NJNK2SUH.js.map → ClaudeService-TRWOYQ6O.js.map} +0 -0
  119. /package/dist/{LoomLauncher-L64HHS3T.js.map → LoomLauncher-FRECYMXS.js.map} +0 -0
  120. /package/dist/{PromptTemplateManager-DULSVRRE.js.map → PromptTemplateManager-YOE2SIPG.js.map} +0 -0
  121. /package/dist/{SettingsManager-BQDQA3FK.js.map → SettingsManager-FNKCOZMQ.js.map} +0 -0
  122. /package/dist/{build-5GO3XW26.js.map → build-VHGEMXBA.js.map} +0 -0
  123. /package/dist/{chunk-ZW2LKWWE.js.map → chunk-2VEWSM34.js.map} +0 -0
  124. /package/dist/{chunk-MNHZB4Z2.js.map → chunk-4FGEGQW4.js.map} +0 -0
  125. /package/dist/{chunk-WY4QBK43.js.map → chunk-63QWFWH3.js.map} +0 -0
  126. /package/dist/{chunk-SN3SQCFK.js.map → chunk-BU53XIGY.js.map} +0 -0
  127. /package/dist/{chunk-SF2P22EE.js.map → chunk-C6HNNJIV.js.map} +0 -0
  128. /package/dist/{chunk-5MWV33NN.js.map → chunk-CVCTIDDK.js.map} +0 -0
  129. /package/dist/{chunk-ZEWU5PZK.js.map → chunk-G5V75JD5.js.map} +0 -0
  130. /package/dist/{chunk-VGGST52X.js.map → chunk-I5T677EA.js.map} +0 -0
  131. /package/dist/{chunk-VECNX6VX.js.map → chunk-KIK2ZFAL.js.map} +0 -0
  132. /package/dist/{chunk-3D7WQM7I.js.map → chunk-LLHXQS3C.js.map} +0 -0
  133. /package/dist/{chunk-Y4YZTHZE.js.map → chunk-LUKXJSRI.js.map} +0 -0
  134. /package/dist/{chunk-J5S7DFYC.js.map → chunk-QFTDZ5E3.js.map} +0 -0
  135. /package/dist/{chunk-JO2LZ6EQ.js.map → chunk-SWSJWA2S.js.map} +0 -0
  136. /package/dist/{chunk-6EU6TCF6.js.map → chunk-V3SVMFDQ.js.map} +0 -0
  137. /package/dist/{chunk-NRSWLOAZ.js.map → chunk-WXIM2WS7.js.map} +0 -0
  138. /package/dist/{chunk-RYWFS37M.js.map → chunk-XE4BDRZD.js.map} +0 -0
  139. /package/dist/{claude-P3NQR6IJ.js.map → claude-LN7OWVNI.js.map} +0 -0
  140. /package/dist/{compile-ZS4HYRX5.js.map → compile-7ALJHZ4N.js.map} +0 -0
  141. /package/dist/{contribute-ORDDQGSL.js.map → contribute-5GKLK3BQ.js.map} +0 -0
  142. /package/dist/{dev-server-FYZ2AQIH.js.map → dev-server-7SMIB7OF.js.map} +0 -0
  143. /package/dist/{git-ET64COO3.js.map → git-GTLKAZRJ.js.map} +0 -0
  144. /package/dist/{init-GFQ5W7GK.js.map → init-ZB2RITW6.js.map} +0 -0
  145. /package/dist/{issues-T4ZZSPEG.js.map → issues-4UUAQ5K6.js.map} +0 -0
  146. /package/dist/{lint-6TQXDZ3T.js.map → lint-AAN2NZWG.js.map} +0 -0
  147. /package/dist/{open-5QZGXQRF.js.map → open-FXWW3VI4.js.map} +0 -0
  148. /package/dist/{recap-MX63HAKV.js.map → recap-OMBOKJST.js.map} +0 -0
  149. /package/dist/{run-O3TFNQFC.js.map → run-BBXLRIZB.js.map} +0 -0
  150. /package/dist/{shell-G6VC2CYR.js.map → shell-RF7LTND5.js.map} +0 -0
  151. /package/dist/{summary-FWHAX55O.js.map → summary-YZI25KW4.js.map} +0 -0
  152. /package/dist/{test-F7JNJZYP.js.map → test-SGO6I5Z7.js.map} +0 -0
  153. /package/dist/{test-git-BTAOIUE2.js.map → test-git-XM4TM65W.js.map} +0 -0
  154. /package/dist/{test-jira-CHYNV33F.js.map → test-jira-LDTOYFSD.js.map} +0 -0
  155. /package/dist/{test-prefix-Q6TFSU6F.js.map → test-prefix-GBO37XCN.js.map} +0 -0
  156. /package/dist/{test-webserver-EONCG7E7.js.map → test-webserver-NZ3JTVLL.js.map} +0 -0
  157. /package/dist/{vscode-VA5X4P25.js.map → vscode-6XUGHJKL.js.map} +0 -0
@@ -1,14 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  PRManager
4
- } from "./chunk-ZW2LKWWE.js";
5
- import {
6
- archiveRecap
7
- } from "./chunk-Y4YZTHZE.js";
4
+ } from "./chunk-2VEWSM34.js";
8
5
  import {
9
6
  calculatePortForBranch,
10
7
  calculatePortFromIdentifier
11
- } from "./chunk-3D7WQM7I.js";
8
+ } from "./chunk-LLHXQS3C.js";
12
9
  import {
13
10
  installDependencies,
14
11
  runScript
@@ -19,28 +16,19 @@ import {
19
16
  } from "./chunk-YQ57ORTV.js";
20
17
  import {
21
18
  generateRandomSessionId
22
- } from "./chunk-ONQYPICO.js";
19
+ } from "./chunk-PZ5WSR5Z.js";
23
20
  import {
24
21
  GitCommandError,
25
22
  PLACEHOLDER_COMMIT_PREFIX,
26
23
  branchExists,
27
- checkRemoteBranchStatus,
28
24
  ensureRepositoryHasCommits,
29
25
  executeGitCommand,
30
26
  extractIssueNumber,
31
27
  extractPRNumber,
32
28
  fetchOrigin,
33
- findMainWorktreePathWithSettings,
34
- findWorktreeForBranch,
35
- getMergeTargetBranch,
36
- hasUncommittedChanges,
37
- isBranchMergedIntoMain,
38
29
  isFileTrackedByGit,
39
30
  pushBranchToRemote
40
- } from "./chunk-MNHZB4Z2.js";
41
- import {
42
- SettingsManager
43
- } from "./chunk-YYAKPQBT.js";
31
+ } from "./chunk-4FGEGQW4.js";
44
32
  import {
45
33
  MetadataManager
46
34
  } from "./chunk-KB64WNBZ.js";
@@ -445,8 +433,8 @@ ${issueData.body}` : "";
445
433
  const setArguments = (_k = input.options) == null ? void 0 : _k.setArguments;
446
434
  const executablePath = (_l = input.options) == null ? void 0 : _l.executablePath;
447
435
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
448
- const { LoomLauncher } = await import("./LoomLauncher-L64HHS3T.js");
449
- const { ClaudeContextManager } = await import("./ClaudeContextManager-QXX6ZFST.js");
436
+ const { LoomLauncher } = await import("./LoomLauncher-FRECYMXS.js");
437
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-ZKTUVQB2.js");
450
438
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
451
439
  const launcher = new LoomLauncher(claudeContext, this.settings);
452
440
  await launcher.launchLoom({
@@ -601,7 +589,7 @@ ${issueData.body}` : "";
601
589
  async checkAndWarnChildLooms(branchName) {
602
590
  let targetBranch = branchName;
603
591
  if (!targetBranch) {
604
- const { getCurrentBranch } = await import("./git-ET64COO3.js");
592
+ const { getCurrentBranch } = await import("./git-GTLKAZRJ.js");
605
593
  targetBranch = await getCurrentBranch();
606
594
  }
607
595
  if (!targetBranch) {
@@ -1149,8 +1137,8 @@ ${issueData.body}` : "";
1149
1137
  const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
1150
1138
  if (enableClaude || enableCode || enableDevServer || enableTerminal) {
1151
1139
  getLogger().info("Launching workspace components...");
1152
- const { LoomLauncher } = await import("./LoomLauncher-L64HHS3T.js");
1153
- const { ClaudeContextManager } = await import("./ClaudeContextManager-QXX6ZFST.js");
1140
+ const { LoomLauncher } = await import("./LoomLauncher-FRECYMXS.js");
1141
+ const { ClaudeContextManager } = await import("./ClaudeContextManager-ZKTUVQB2.js");
1154
1142
  const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
1155
1143
  const launcher = new LoomLauncher(claudeContext, this.settings);
1156
1144
  await launcher.launchLoom({
@@ -1886,761 +1874,10 @@ var DatabaseManager = class {
1886
1874
  }
1887
1875
  };
1888
1876
 
1889
- // src/lib/ResourceCleanup.ts
1890
- import path4 from "path";
1891
- var ResourceCleanup = class {
1892
- constructor(gitWorktree, processManager, database, cliIsolation, settingsManager) {
1893
- this.gitWorktree = gitWorktree;
1894
- this.processManager = processManager;
1895
- this.database = database;
1896
- this.cliIsolation = cliIsolation;
1897
- this.settingsManager = settingsManager ?? new SettingsManager();
1898
- this.metadataManager = new MetadataManager();
1899
- }
1900
- /**
1901
- * Cleanup a worktree and associated resources
1902
- * Main orchestration method
1903
- *
1904
- * @param parsed - ParsedInput from IdentifierParser with type information
1905
- * @param options - Cleanup options
1906
- */
1907
- async cleanupWorktree(parsed, options = {}) {
1908
- var _a, _b, _c;
1909
- const operations = [];
1910
- const errors = [];
1911
- const displayIdentifier = parsed.branchName ?? ((_a = parsed.number) == null ? void 0 : _a.toString()) ?? parsed.originalInput;
1912
- getLogger().info(`Starting cleanup for: ${displayIdentifier}`);
1913
- const number = parsed.number;
1914
- if (number !== void 0) {
1915
- const settings = await this.settingsManager.loadSettings();
1916
- const basePort = ((_c = (_b = settings == null ? void 0 : settings.capabilities) == null ? void 0 : _b.web) == null ? void 0 : _c.basePort) ?? 3e3;
1917
- const port = calculatePortFromIdentifier(number, basePort);
1918
- if (options.dryRun) {
1919
- operations.push({
1920
- type: "dev-server",
1921
- success: true,
1922
- message: `[DRY RUN] Would check for dev server on port ${port}`
1923
- });
1924
- } else {
1925
- try {
1926
- const terminated = await this.terminateDevServer(port);
1927
- operations.push({
1928
- type: "dev-server",
1929
- success: true,
1930
- message: terminated ? `Dev server on port ${port} terminated` : `No dev server running on port ${port}`
1931
- });
1932
- } catch (error) {
1933
- const err = error instanceof Error ? error : new Error("Unknown error");
1934
- errors.push(err);
1935
- operations.push({
1936
- type: "dev-server",
1937
- success: false,
1938
- message: `Failed to terminate dev server`,
1939
- error: err.message
1940
- });
1941
- }
1942
- }
1943
- }
1944
- let worktree = null;
1945
- try {
1946
- if (options.worktree) {
1947
- worktree = {
1948
- path: options.worktree.path,
1949
- branch: options.worktree.branch,
1950
- commit: "",
1951
- bare: false,
1952
- detached: false,
1953
- locked: false
1954
- };
1955
- getLogger().debug(`Using pre-resolved worktree: path="${worktree.path}", branch="${worktree.branch}"`);
1956
- } else {
1957
- if (parsed.type === "pr" && parsed.number !== void 0) {
1958
- const prNumber = typeof parsed.number === "number" ? parsed.number : Number(parsed.number);
1959
- if (isNaN(prNumber) || !isFinite(prNumber)) {
1960
- throw new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`);
1961
- }
1962
- worktree = await this.gitWorktree.findWorktreeForPR(prNumber, "");
1963
- } else if (parsed.type === "issue" && parsed.number !== void 0) {
1964
- worktree = await this.gitWorktree.findWorktreeForIssue(parsed.number);
1965
- } else if (parsed.type === "branch" && parsed.branchName) {
1966
- worktree = await this.gitWorktree.findWorktreeForBranch(parsed.branchName);
1967
- }
1968
- }
1969
- if (!worktree) {
1970
- throw new Error(`No worktree found for identifier: ${displayIdentifier}`);
1971
- }
1972
- getLogger().debug(`Found worktree: path="${worktree.path}", branch="${worktree.branch}"`);
1973
- } catch (error) {
1974
- const err = error instanceof Error ? error : new Error("Unknown error");
1975
- errors.push(err);
1976
- return {
1977
- identifier: displayIdentifier,
1978
- success: false,
1979
- operations,
1980
- errors,
1981
- rollbackRequired: false
1982
- };
1983
- }
1984
- let safetyCheckPassed = false;
1985
- if (!options.force) {
1986
- const shouldCheckMergeSafety = options.checkMergeSafety ?? options.deleteBranch === true;
1987
- const shouldCheckRemoteBranch = options.checkRemoteBranch ?? false;
1988
- const safety = await this.validateWorktreeSafety(worktree, parsed.originalInput, shouldCheckMergeSafety, shouldCheckRemoteBranch);
1989
- if (!safety.isSafe) {
1990
- const blockerMessage = safety.blockers.join("\n\n");
1991
- throw new Error(`Cannot cleanup:
1992
-
1993
- ${blockerMessage}`);
1994
- }
1995
- safetyCheckPassed = true;
1996
- if (safety.warnings.length > 0) {
1997
- safety.warnings.forEach((warning) => {
1998
- getLogger().warn(warning);
1999
- });
2000
- }
2001
- }
2002
- let databaseConfig = null;
2003
- if (!options.keepDatabase && worktree) {
2004
- const envFilePath = path4.join(worktree.path, ".env");
2005
- try {
2006
- const shouldCleanup = this.database ? await this.database.shouldUseDatabaseBranching(envFilePath) : false;
2007
- databaseConfig = { shouldCleanup, envFilePath };
2008
- } catch (error) {
2009
- getLogger().warn(
2010
- `Failed to read database config from ${envFilePath}, skipping database cleanup: ${error instanceof Error ? error.message : String(error)}`
2011
- );
2012
- databaseConfig = { shouldCleanup: false, envFilePath };
2013
- }
2014
- }
2015
- let mainWorktreePath = null;
2016
- if (!options.dryRun) {
2017
- try {
2018
- mainWorktreePath = await findMainWorktreePathWithSettings(worktree.path, this.settingsManager);
2019
- } catch (error) {
2020
- getLogger().warn(
2021
- `Failed to find main worktree path: ${error instanceof Error ? error.message : String(error)}`
2022
- );
2023
- }
2024
- }
2025
- let mergeTargetBranch = null;
2026
- if (options.deleteBranch && worktree && !options.dryRun) {
2027
- try {
2028
- mergeTargetBranch = await getMergeTargetBranch(worktree.path, {
2029
- settingsManager: this.settingsManager,
2030
- metadataManager: this.metadataManager
2031
- });
2032
- getLogger().debug(`Pre-fetched merge target branch: ${mergeTargetBranch}`);
2033
- } catch (error) {
2034
- getLogger().warn(
2035
- `Failed to pre-fetch merge target branch: ${error instanceof Error ? error.message : String(error)}`
2036
- );
2037
- }
2038
- }
2039
- if (options.dryRun) {
2040
- operations.push({
2041
- type: "worktree",
2042
- success: true,
2043
- message: `[DRY RUN] Would remove worktree: ${worktree.path}`
2044
- });
2045
- } else {
2046
- try {
2047
- const worktreeOptions = {
2048
- removeDirectory: true,
2049
- removeBranch: false
2050
- // Handle branch separately
2051
- };
2052
- if (options.force !== void 0) {
2053
- worktreeOptions.force = options.force;
2054
- }
2055
- await this.gitWorktree.removeWorktree(worktree.path, worktreeOptions);
2056
- operations.push({
2057
- type: "worktree",
2058
- success: true,
2059
- message: `Worktree removed: ${worktree.path}`
2060
- });
2061
- } catch (error) {
2062
- const err = error instanceof Error ? error : new Error("Unknown error");
2063
- errors.push(err);
2064
- operations.push({
2065
- type: "worktree",
2066
- success: false,
2067
- message: `Failed to remove worktree`,
2068
- error: err.message
2069
- });
2070
- }
2071
- }
2072
- if (worktree) {
2073
- if (options.dryRun) {
2074
- operations.push({
2075
- type: "recap",
2076
- success: true,
2077
- message: `[DRY RUN] Would archive recap file for: ${worktree.path}`
2078
- });
2079
- } else {
2080
- try {
2081
- await archiveRecap(worktree.path);
2082
- operations.push({
2083
- type: "recap",
2084
- success: true,
2085
- message: `Recap file archived`
2086
- });
2087
- } catch (error) {
2088
- const err = error instanceof Error ? error : new Error("Unknown error");
2089
- getLogger().warn(`Recap archival failed: ${err.message}`);
2090
- operations.push({
2091
- type: "recap",
2092
- success: false,
2093
- message: "Recap archival failed (non-fatal)",
2094
- error: err.message
2095
- });
2096
- }
2097
- }
2098
- }
2099
- if (options.deleteBranch && worktree) {
2100
- if (options.dryRun) {
2101
- operations.push({
2102
- type: "branch",
2103
- success: true,
2104
- message: `[DRY RUN] Would delete branch: ${worktree.branch}`
2105
- });
2106
- } else {
2107
- try {
2108
- const branchOptions = {
2109
- dryRun: false,
2110
- safetyVerified: safetyCheckPassed
2111
- };
2112
- if (mergeTargetBranch !== null) {
2113
- branchOptions.mergeTargetBranch = mergeTargetBranch;
2114
- }
2115
- if (options.force !== void 0) {
2116
- branchOptions.force = options.force;
2117
- }
2118
- await this.deleteBranch(worktree.branch, branchOptions, mainWorktreePath ?? void 0);
2119
- operations.push({
2120
- type: "branch",
2121
- success: true,
2122
- message: `Branch deleted: ${worktree.branch}`
2123
- });
2124
- } catch (error) {
2125
- const err = error instanceof Error ? error : new Error("Unknown error");
2126
- errors.push(err);
2127
- operations.push({
2128
- type: "branch",
2129
- success: false,
2130
- message: `Failed to delete branch`,
2131
- error: err.message
2132
- });
2133
- }
2134
- }
2135
- }
2136
- const cliIdentifier = parsed.number ?? parsed.branchName;
2137
- if (this.cliIsolation && cliIdentifier !== void 0) {
2138
- if (options.dryRun) {
2139
- operations.push({
2140
- type: "cli-symlinks",
2141
- success: true,
2142
- message: `[DRY RUN] Would cleanup CLI symlinks for: ${cliIdentifier}`
2143
- });
2144
- } else {
2145
- try {
2146
- const removed = await this.cliIsolation.cleanupVersionedExecutables(cliIdentifier);
2147
- operations.push({
2148
- type: "cli-symlinks",
2149
- success: true,
2150
- message: removed.length > 0 ? `CLI symlinks removed: ${removed.length}` : "No CLI symlinks to cleanup"
2151
- });
2152
- } catch (error) {
2153
- const err = error instanceof Error ? error : new Error("Unknown error");
2154
- errors.push(err);
2155
- getLogger().warn(
2156
- `CLI symlink cleanup failed: ${err.message}`
2157
- );
2158
- operations.push({
2159
- type: "cli-symlinks",
2160
- success: false,
2161
- message: "CLI symlink cleanup failed (non-fatal)"
2162
- });
2163
- }
2164
- }
2165
- }
2166
- if (databaseConfig && worktree) {
2167
- if (options.dryRun) {
2168
- operations.push({
2169
- type: "database",
2170
- success: true,
2171
- message: `[DRY RUN] Would cleanup database branch for: ${worktree.branch}`
2172
- });
2173
- } else {
2174
- try {
2175
- if (databaseConfig.shouldCleanup && this.database) {
2176
- try {
2177
- const deletionResult = await this.database.deleteBranchIfConfigured(
2178
- worktree.branch,
2179
- databaseConfig.shouldCleanup,
2180
- false,
2181
- // isPreview
2182
- mainWorktreePath ?? void 0
2183
- );
2184
- if (deletionResult.deleted) {
2185
- getLogger().info(`Database branch deleted: ${worktree.branch}`);
2186
- operations.push({
2187
- type: "database",
2188
- success: true,
2189
- message: `Database branch deleted`,
2190
- deleted: true
2191
- });
2192
- } else if (deletionResult.notFound) {
2193
- getLogger().debug(`No database branch found for: ${worktree.branch}`);
2194
- operations.push({
2195
- type: "database",
2196
- success: true,
2197
- message: `No database branch found (skipped)`,
2198
- deleted: false
2199
- });
2200
- } else if (deletionResult.userDeclined) {
2201
- getLogger().info("Preview database deletion declined by user");
2202
- operations.push({
2203
- type: "database",
2204
- success: true,
2205
- message: `Database cleanup skipped (user declined)`,
2206
- deleted: false
2207
- });
2208
- } else if (!deletionResult.success) {
2209
- const errorMsg = deletionResult.error ?? "Unknown error";
2210
- errors.push(new Error(errorMsg));
2211
- getLogger().warn(`Database cleanup failed: ${errorMsg}`);
2212
- operations.push({
2213
- type: "database",
2214
- success: false,
2215
- // Non-fatal, but report error
2216
- message: `Database cleanup failed`,
2217
- error: errorMsg,
2218
- deleted: false
2219
- });
2220
- } else {
2221
- errors.push(new Error("Database cleanup in an unknown state"));
2222
- getLogger().warn("Database deletion returned unexpected result state");
2223
- operations.push({
2224
- type: "database",
2225
- success: false,
2226
- message: `Database cleanup in an unknown state`,
2227
- deleted: false
2228
- });
2229
- }
2230
- } catch (error) {
2231
- errors.push(error instanceof Error ? error : new Error(String(error)));
2232
- getLogger().warn(
2233
- `Unexpected database cleanup exception: ${error instanceof Error ? error.message : String(error)}`
2234
- );
2235
- operations.push({
2236
- type: "database",
2237
- success: false,
2238
- message: `Database cleanup failed`,
2239
- error: error instanceof Error ? error.message : String(error),
2240
- deleted: false
2241
- });
2242
- }
2243
- } else {
2244
- operations.push({
2245
- type: "database",
2246
- success: true,
2247
- message: `Database cleanup skipped (not available)`,
2248
- deleted: false
2249
- });
2250
- }
2251
- } catch (error) {
2252
- const err = error instanceof Error ? error : new Error("Unknown error");
2253
- errors.push(err);
2254
- operations.push({
2255
- type: "database",
2256
- success: false,
2257
- message: `Database cleanup failed`,
2258
- error: err.message,
2259
- deleted: false
2260
- });
2261
- }
2262
- }
2263
- }
2264
- if (worktree) {
2265
- if (options.dryRun) {
2266
- const action = options.archive ? "archive" : "delete";
2267
- operations.push({
2268
- type: "metadata",
2269
- success: true,
2270
- message: `[DRY RUN] Would ${action} metadata for worktree: ${worktree.path}`
2271
- });
2272
- } else if (options.archive) {
2273
- try {
2274
- await this.metadataManager.archiveMetadata(worktree.path);
2275
- getLogger().info(`Metadata archived for worktree: ${worktree.path}`);
2276
- operations.push({
2277
- type: "metadata",
2278
- success: true,
2279
- message: "Metadata archived"
2280
- });
2281
- } catch (error) {
2282
- const err = error instanceof Error ? error : new Error(String(error));
2283
- errors.push(err);
2284
- getLogger().warn(`Metadata archival failed: ${err.message}`);
2285
- operations.push({
2286
- type: "metadata",
2287
- success: false,
2288
- message: "Metadata archival failed (non-fatal)",
2289
- error: err.message
2290
- });
2291
- }
2292
- } else {
2293
- try {
2294
- await this.metadataManager.deleteMetadata(worktree.path);
2295
- getLogger().info(`Metadata deleted for worktree: ${worktree.path}`);
2296
- operations.push({
2297
- type: "metadata",
2298
- success: true,
2299
- message: "Metadata deleted"
2300
- });
2301
- } catch (error) {
2302
- const err = error instanceof Error ? error : new Error(String(error));
2303
- errors.push(err);
2304
- getLogger().warn(`Metadata deletion failed: ${err.message}`);
2305
- operations.push({
2306
- type: "metadata",
2307
- success: false,
2308
- message: "Metadata deletion failed (non-fatal)",
2309
- error: err.message
2310
- });
2311
- }
2312
- }
2313
- }
2314
- const success = errors.length === 0;
2315
- return {
2316
- identifier: displayIdentifier,
2317
- branchName: worktree == null ? void 0 : worktree.branch,
2318
- success,
2319
- operations,
2320
- errors,
2321
- rollbackRequired: false
2322
- // Cleanup operations are generally not reversible
2323
- };
2324
- }
2325
- /**
2326
- * Terminate dev server on specified port
2327
- */
2328
- async terminateDevServer(port) {
2329
- getLogger().debug(`Checking for dev server on port ${port}`);
2330
- const processInfo = await this.processManager.detectDevServer(port);
2331
- if (!processInfo) {
2332
- getLogger().debug(`No process found on port ${port}`);
2333
- return false;
2334
- }
2335
- if (!processInfo.isDevServer) {
2336
- getLogger().warn(
2337
- `Process on port ${port} (${processInfo.name}) doesn't appear to be a dev server, skipping`
2338
- );
2339
- return false;
2340
- }
2341
- getLogger().info(`Terminating dev server: ${processInfo.name} (PID: ${processInfo.pid})`);
2342
- await this.processManager.terminateProcess(processInfo.pid);
2343
- const isFree = await this.processManager.verifyPortFree(port);
2344
- if (!isFree) {
2345
- throw new Error(`Dev server may still be running on port ${port}`);
2346
- }
2347
- return true;
2348
- }
2349
- /**
2350
- * Delete a Git branch with safety checks
2351
- *
2352
- * @param branchName - Name of the branch to delete
2353
- * @param options - Delete options (force, dryRun)
2354
- * @param cwd - Working directory to execute git command from (defaults to finding main worktree)
2355
- */
2356
- async deleteBranch(branchName, options = {}, cwd) {
2357
- const protectedBranches = await this.settingsManager.getProtectedBranches(cwd);
2358
- if (protectedBranches.includes(branchName)) {
2359
- throw new Error(`Cannot delete protected branch: ${branchName}`);
2360
- }
2361
- const workingDir = cwd ?? await findMainWorktreePathWithSettings(void 0, this.settingsManager);
2362
- try {
2363
- await executeGitCommand(["rev-parse", "--verify", `refs/heads/${branchName}`], {
2364
- cwd: workingDir
2365
- });
2366
- } catch {
2367
- getLogger().debug(`Branch ${branchName} does not exist, skipping deletion`);
2368
- return true;
2369
- }
2370
- if (options.dryRun) {
2371
- getLogger().info(`[DRY RUN] Would delete branch: ${branchName}`);
2372
- return true;
2373
- }
2374
- let deleteCwd = workingDir;
2375
- try {
2376
- let deleteFlag = "-d";
2377
- if (options.force) {
2378
- deleteFlag = "-D";
2379
- } else if (options.mergeTargetBranch) {
2380
- const mergeTarget = options.mergeTargetBranch;
2381
- try {
2382
- const targetWorktreePath = await findWorktreeForBranch(mergeTarget, workingDir);
2383
- getLogger().debug(`Running branch delete from worktree where '${mergeTarget}' is checked out: ${targetWorktreePath}`);
2384
- deleteCwd = targetWorktreePath;
2385
- } catch {
2386
- getLogger().debug(`Could not find worktree for branch '${mergeTarget}', falling back to merge check`);
2387
- const isMerged = await isBranchMergedIntoMain(branchName, mergeTarget, workingDir);
2388
- if (isMerged) {
2389
- getLogger().debug(`Branch '${branchName}' verified merged into '${mergeTarget}', using force delete`);
2390
- deleteFlag = "-D";
2391
- }
2392
- }
2393
- } else if (options.worktreePath) {
2394
- getLogger().warn("deleteBranch called with worktreePath but no mergeTargetBranch - this may fail if worktree was deleted");
2395
- try {
2396
- const mergeTarget = await getMergeTargetBranch(options.worktreePath, {
2397
- settingsManager: this.settingsManager,
2398
- metadataManager: this.metadataManager
2399
- });
2400
- try {
2401
- const targetWorktreePath = await findWorktreeForBranch(mergeTarget, workingDir);
2402
- getLogger().debug(`Running branch delete from worktree where '${mergeTarget}' is checked out: ${targetWorktreePath}`);
2403
- deleteCwd = targetWorktreePath;
2404
- } catch {
2405
- getLogger().debug(`Could not find worktree for branch '${mergeTarget}', falling back to merge check`);
2406
- const isMerged = await isBranchMergedIntoMain(branchName, mergeTarget, workingDir);
2407
- if (isMerged) {
2408
- getLogger().debug(`Branch '${branchName}' verified merged into '${mergeTarget}', using force delete`);
2409
- deleteFlag = "-D";
2410
- }
2411
- }
2412
- } catch (error) {
2413
- getLogger().debug(`Could not read merge target from worktreePath: ${error instanceof Error ? error.message : String(error)}`);
2414
- }
2415
- }
2416
- await executeGitCommand(["branch", deleteFlag, branchName], {
2417
- cwd: deleteCwd
2418
- });
2419
- getLogger().info(`Branch deleted: ${branchName}`);
2420
- return true;
2421
- } catch (error) {
2422
- const errorMessage = error instanceof Error ? error.message : String(error);
2423
- if (errorMessage.includes("not found") || errorMessage.includes("does not exist")) {
2424
- getLogger().debug(`Branch ${branchName} already deleted`);
2425
- return true;
2426
- }
2427
- if (options.force) {
2428
- throw error;
2429
- }
2430
- if (errorMessage.includes("not fully merged")) {
2431
- if (options.safetyVerified) {
2432
- getLogger().info(`Branch '${branchName}' not merged into HEAD but safety verified - using force delete`);
2433
- await executeGitCommand(["branch", "-D", branchName], { cwd: deleteCwd });
2434
- getLogger().info(`Branch deleted: ${branchName}`);
2435
- return true;
2436
- }
2437
- throw new Error(
2438
- `Cannot delete unmerged branch '${branchName}'. Use --force to delete anyway.`
2439
- );
2440
- }
2441
- throw error;
2442
- }
2443
- }
2444
- /**
2445
- * Cleanup database branch
2446
- * Gracefully handles missing DatabaseManager
2447
- *
2448
- * @deprecated This method is deprecated and should not be used for post-deletion cleanup.
2449
- * Use the pre-fetch mechanism in cleanupWorktree() instead.
2450
- * This method will fail if called after worktree deletion because
2451
- * it attempts to read the .env file which has been deleted.
2452
- *
2453
- * @param branchName - Name of the branch to delete
2454
- * @param worktreePath - Path to worktree (must still exist with .env file)
2455
- */
2456
- async cleanupDatabase(branchName, worktreePath) {
2457
- if (!this.database) {
2458
- getLogger().debug("Database manager not available, skipping database cleanup");
2459
- return false;
2460
- }
2461
- try {
2462
- const envFilePath = path4.join(worktreePath, ".env");
2463
- const shouldCleanup = await this.database.shouldUseDatabaseBranching(envFilePath);
2464
- let cwd;
2465
- try {
2466
- cwd = await findMainWorktreePathWithSettings(worktreePath, this.settingsManager);
2467
- } catch (error) {
2468
- getLogger().debug(
2469
- `Could not find main worktree path, using current directory: ${error instanceof Error ? error.message : String(error)}`
2470
- );
2471
- }
2472
- const result = await this.database.deleteBranchIfConfigured(
2473
- branchName,
2474
- shouldCleanup,
2475
- false,
2476
- // isPreview
2477
- cwd
2478
- );
2479
- if (result.deleted) {
2480
- getLogger().info(`Database branch deleted: ${branchName}`);
2481
- return true;
2482
- } else if (result.notFound) {
2483
- getLogger().debug(`No database branch found for: ${branchName}`);
2484
- return false;
2485
- } else if (result.userDeclined) {
2486
- getLogger().info("Preview database deletion declined by user");
2487
- return false;
2488
- } else if (!result.success) {
2489
- getLogger().warn(`Database cleanup failed: ${result.error ?? "Unknown error"}`);
2490
- return false;
2491
- } else {
2492
- getLogger().debug("Database deletion returned unexpected result");
2493
- return false;
2494
- }
2495
- } catch (error) {
2496
- getLogger().warn(
2497
- `Unexpected database cleanup error: ${error instanceof Error ? error.message : String(error)}`
2498
- );
2499
- return false;
2500
- }
2501
- }
2502
- /**
2503
- * Cleanup multiple worktrees
2504
- */
2505
- async cleanupMultipleWorktrees(identifiers, options = {}) {
2506
- const results = [];
2507
- for (const identifier of identifiers) {
2508
- const parsed = this.parseIdentifier(identifier);
2509
- const result = await this.cleanupWorktree(parsed, options);
2510
- results.push(result);
2511
- }
2512
- return results;
2513
- }
2514
- /**
2515
- * Validate worktree safety given a worktree object
2516
- * Private method used internally when worktree is already known
2517
- *
2518
- * @param worktree - The worktree to validate
2519
- * @param identifier - The original identifier used (for error messages)
2520
- * @param checkBranchMerge - Whether to check if branch is merged into main (for branch deletion)
2521
- * @param checkRemoteBranch - Whether to check if branch exists on remote (for GitHub-PR mode)
2522
- */
2523
- async validateWorktreeSafety(worktree, identifier, checkBranchMerge = false, checkRemoteBranch = false) {
2524
- const warnings = [];
2525
- const blockers = [];
2526
- const isMain = await this.gitWorktree.isMainWorktree(worktree, this.settingsManager);
2527
- if (isMain) {
2528
- blockers.push(`Cannot cleanup main worktree: "${worktree.branch}" @ "${worktree.path}"`);
2529
- }
2530
- const hasChanges = await hasUncommittedChanges(worktree.path);
2531
- if (hasChanges) {
2532
- const blockerMessage = `Worktree has uncommitted changes.
2533
-
2534
- Please resolve before cleanup - you have some options:
2535
- \u2022 Commit changes: cd ${worktree.path} && git commit -am "message"
2536
- \u2022 Stash changes: cd ${worktree.path} && git stash
2537
- \u2022 Force cleanup: il cleanup ${identifier} --force (WARNING: will discard changes)`;
2538
- blockers.push(blockerMessage);
2539
- }
2540
- if ((checkBranchMerge || checkRemoteBranch) && worktree.branch) {
2541
- const mainBranch = await getMergeTargetBranch(worktree.path, {
2542
- settingsManager: this.settingsManager,
2543
- metadataManager: this.metadataManager
2544
- });
2545
- const remoteStatus = await checkRemoteBranchStatus(worktree.branch, worktree.path);
2546
- if (remoteStatus.networkError) {
2547
- const blockerMessage = `Cannot verify remote branch status due to network error.
2548
-
2549
- Error: ${remoteStatus.errorMessage ?? "Unknown network error"}
2550
-
2551
- Unable to determine if branch '${worktree.branch}' is safely backed up.
2552
- Use --force to proceed without verification.`;
2553
- blockers.push(blockerMessage);
2554
- } else if (remoteStatus.exists && remoteStatus.localAhead) {
2555
- const blockerMessage = `Branch '${worktree.branch}' has unpushed commits that would be lost.
2556
- The remote branch exists but your local branch is ahead.
2557
-
2558
- Please resolve before cleanup:
2559
- \u2022 Push your commits: git push origin ${worktree.branch}
2560
- \u2022 Force cleanup: il cleanup ${identifier} --force (WARNING: will lose commits)`;
2561
- blockers.push(blockerMessage);
2562
- } else if (remoteStatus.exists && !remoteStatus.localAhead) {
2563
- } else if (!remoteStatus.exists) {
2564
- const isMerged = await isBranchMergedIntoMain(worktree.branch, mainBranch, worktree.path);
2565
- if (isMerged) {
2566
- } else {
2567
- const blockerMessage = `Branch '${worktree.branch}' has not been pushed to remote and is not merged into '${mainBranch}'.
2568
- Deleting this branch would result in data loss.
2569
-
2570
- Please resolve before cleanup - you have some options:
2571
- \u2022 Push to remote: git push -u origin ${worktree.branch}
2572
- \u2022 Merge to ${mainBranch}: git checkout ${mainBranch} && git merge ${worktree.branch}
2573
- \u2022 Force cleanup: il cleanup ${identifier} --force (WARNING: will lose commits)`;
2574
- blockers.push(blockerMessage);
2575
- }
2576
- }
2577
- }
2578
- return {
2579
- isSafe: blockers.length === 0,
2580
- warnings,
2581
- blockers
2582
- };
2583
- }
2584
- /**
2585
- * Validate cleanup safety
2586
- */
2587
- async validateCleanupSafety(identifier) {
2588
- const warnings = [];
2589
- const blockers = [];
2590
- const worktrees = await this.gitWorktree.findWorktreesByIdentifier(identifier);
2591
- if (worktrees.length === 0) {
2592
- blockers.push(`No worktree found for: ${identifier}`);
2593
- return { isSafe: false, warnings, blockers };
2594
- }
2595
- const worktree = worktrees[0];
2596
- if (!worktree) {
2597
- blockers.push(`No worktree found for: ${identifier}`);
2598
- return { isSafe: false, warnings, blockers };
2599
- }
2600
- return await this.validateWorktreeSafety(worktree, identifier);
2601
- }
2602
- /**
2603
- * Parse identifier to determine type and extract number
2604
- * Helper method for port calculation
2605
- */
2606
- parseIdentifier(identifier) {
2607
- const issueId = extractIssueNumber(identifier);
2608
- if (issueId !== null) {
2609
- return {
2610
- type: "issue",
2611
- number: issueId,
2612
- originalInput: identifier
2613
- };
2614
- }
2615
- const prMatch = identifier.match(/(?:pr|PR)[/-](\d+)/);
2616
- if (prMatch == null ? void 0 : prMatch[1]) {
2617
- return {
2618
- type: "pr",
2619
- number: parseInt(prMatch[1], 10),
2620
- originalInput: identifier
2621
- };
2622
- }
2623
- const numericMatch = identifier.match(/^#?(\d+)$/);
2624
- if (numericMatch == null ? void 0 : numericMatch[1]) {
2625
- return {
2626
- type: "issue",
2627
- number: parseInt(numericMatch[1], 10),
2628
- originalInput: identifier
2629
- };
2630
- }
2631
- return {
2632
- type: "branch",
2633
- branchName: identifier,
2634
- originalInput: identifier
2635
- };
2636
- }
2637
- };
2638
-
2639
1877
  export {
2640
1878
  LoomManager,
2641
1879
  EnvironmentManager,
2642
1880
  CLIIsolationManager,
2643
- DatabaseManager,
2644
- ResourceCleanup
1881
+ DatabaseManager
2645
1882
  };
2646
- //# sourceMappingURL=chunk-UD3WJDIV.js.map
1883
+ //# sourceMappingURL=chunk-3F27M7ZD.js.map