dmux 3.5.0 → 3.5.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 (45) hide show
  1. package/dist/DmuxApp.d.ts.map +1 -1
  2. package/dist/DmuxApp.js +41 -1
  3. package/dist/DmuxApp.js.map +1 -1
  4. package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -1
  5. package/dist/actions/merge/commitMessageHandler.js +7 -0
  6. package/dist/actions/merge/commitMessageHandler.js.map +1 -1
  7. package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -1
  8. package/dist/actions/merge/multiMergeOrchestrator.js +215 -38
  9. package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
  10. package/dist/components/popups/reopenWorktreePopup.d.ts +7 -0
  11. package/dist/components/popups/reopenWorktreePopup.d.ts.map +1 -0
  12. package/dist/components/popups/reopenWorktreePopup.js +96 -0
  13. package/dist/components/popups/reopenWorktreePopup.js.map +1 -0
  14. package/dist/components/popups/shortcutsPopup.js +2 -1
  15. package/dist/components/popups/shortcutsPopup.js.map +1 -1
  16. package/dist/components/ui/FooterHelp.js +2 -2
  17. package/dist/hooks/useInputHandling.d.ts +2 -0
  18. package/dist/hooks/useInputHandling.d.ts.map +1 -1
  19. package/dist/hooks/useInputHandling.js +24 -9
  20. package/dist/hooks/useInputHandling.js.map +1 -1
  21. package/dist/server/embedded-assets.d.ts.map +1 -1
  22. package/dist/server/embedded-assets.js +42 -2
  23. package/dist/server/embedded-assets.js.map +1 -1
  24. package/dist/services/PopupManager.d.ts +10 -0
  25. package/dist/services/PopupManager.d.ts.map +1 -1
  26. package/dist/services/PopupManager.js +30 -2
  27. package/dist/services/PopupManager.js.map +1 -1
  28. package/dist/utils/aiMerge.d.ts.map +1 -1
  29. package/dist/utils/aiMerge.js +7 -1
  30. package/dist/utils/aiMerge.js.map +1 -1
  31. package/dist/utils/generated-agents-doc.d.ts +1 -1
  32. package/dist/utils/generated-agents-doc.js +1 -1
  33. package/dist/utils/git.d.ts +15 -0
  34. package/dist/utils/git.d.ts.map +1 -1
  35. package/dist/utils/git.js +70 -0
  36. package/dist/utils/git.js.map +1 -1
  37. package/dist/utils/hooksDocs.d.ts +1 -1
  38. package/dist/utils/mergeValidation.d.ts.map +1 -1
  39. package/dist/utils/mergeValidation.js +48 -2
  40. package/dist/utils/mergeValidation.js.map +1 -1
  41. package/dist/utils/reopenWorktree.d.ts +16 -0
  42. package/dist/utils/reopenWorktree.d.ts.map +1 -0
  43. package/dist/utils/reopenWorktree.js +121 -0
  44. package/dist/utils/reopenWorktree.js.map +1 -0
  45. package/package.json +1 -1
@@ -0,0 +1,121 @@
1
+ import path from 'path';
2
+ import * as fs from 'fs';
3
+ import { TmuxService } from '../services/TmuxService.js';
4
+ import { setupSidebarLayout, getTerminalDimensions, splitPane, } from './tmux.js';
5
+ import { SIDEBAR_WIDTH, recalculateAndApplyLayout } from './layoutManager.js';
6
+ import { atomicWriteJsonSync } from './atomicWrite.js';
7
+ /**
8
+ * Reopens a closed worktree by creating a new pane in the existing worktree
9
+ * and running `claude --continue` to resume the previous session
10
+ */
11
+ export async function reopenWorktree(options) {
12
+ const { slug, worktreePath, projectRoot, existingPanes } = options;
13
+ const tmuxService = TmuxService.getInstance();
14
+ const originalPaneId = tmuxService.getCurrentPaneIdSync();
15
+ // Load config to get control pane info
16
+ const configPath = path.join(projectRoot, '.dmux', 'dmux.config.json');
17
+ let controlPaneId;
18
+ try {
19
+ const configContent = fs.readFileSync(configPath, 'utf-8');
20
+ const config = JSON.parse(configContent);
21
+ controlPaneId = config.controlPaneId;
22
+ // Verify the control pane ID from config still exists
23
+ if (controlPaneId) {
24
+ const exists = await tmuxService.paneExists(controlPaneId);
25
+ if (!exists) {
26
+ controlPaneId = originalPaneId;
27
+ config.controlPaneId = controlPaneId;
28
+ config.controlPaneSize = SIDEBAR_WIDTH;
29
+ config.lastUpdated = new Date().toISOString();
30
+ atomicWriteJsonSync(configPath, config);
31
+ }
32
+ }
33
+ if (!controlPaneId) {
34
+ controlPaneId = originalPaneId;
35
+ config.controlPaneId = controlPaneId;
36
+ config.controlPaneSize = SIDEBAR_WIDTH;
37
+ config.lastUpdated = new Date().toISOString();
38
+ atomicWriteJsonSync(configPath, config);
39
+ }
40
+ }
41
+ catch {
42
+ controlPaneId = originalPaneId;
43
+ }
44
+ // Enable pane borders to show titles
45
+ try {
46
+ tmuxService.setGlobalOptionSync('pane-border-status', 'top');
47
+ }
48
+ catch {
49
+ // Ignore if already set or fails
50
+ }
51
+ // Determine if this is the first content pane
52
+ const isFirstContentPane = existingPanes.length === 0;
53
+ let paneInfo;
54
+ if (isFirstContentPane) {
55
+ paneInfo = setupSidebarLayout(controlPaneId);
56
+ await new Promise((resolve) => setTimeout(resolve, 300));
57
+ }
58
+ else {
59
+ // Subsequent panes - always split horizontally
60
+ const dmuxPaneIds = existingPanes.map(p => p.paneId);
61
+ const targetPane = dmuxPaneIds[dmuxPaneIds.length - 1];
62
+ paneInfo = splitPane({ targetPane });
63
+ }
64
+ await new Promise((resolve) => setTimeout(resolve, 500));
65
+ // Set pane title
66
+ try {
67
+ await tmuxService.setPaneTitle(paneInfo, slug);
68
+ }
69
+ catch {
70
+ // Ignore if setting title fails
71
+ }
72
+ // Apply optimal layout
73
+ if (controlPaneId) {
74
+ const dimensions = getTerminalDimensions();
75
+ const allContentPaneIds = [...existingPanes.map(p => p.paneId), paneInfo];
76
+ await recalculateAndApplyLayout(controlPaneId, allContentPaneIds, dimensions.width, dimensions.height);
77
+ await tmuxService.refreshClient();
78
+ }
79
+ // CD into the worktree
80
+ await tmuxService.sendShellCommand(paneInfo, `cd "${worktreePath}"`);
81
+ await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
82
+ // Wait for CD to complete
83
+ await new Promise((resolve) => setTimeout(resolve, 300));
84
+ // Run claude --continue to resume the session
85
+ const claudeCmd = 'claude --continue --permission-mode=acceptEdits';
86
+ await tmuxService.sendShellCommand(paneInfo, claudeCmd);
87
+ await tmuxService.sendTmuxKeys(paneInfo, 'Enter');
88
+ // Keep focus on the new pane
89
+ await tmuxService.selectPane(paneInfo);
90
+ // Create the pane object
91
+ const newPane = {
92
+ id: `dmux-${Date.now()}`,
93
+ slug,
94
+ prompt: '(Reopened session)',
95
+ paneId: paneInfo,
96
+ worktreePath,
97
+ agent: 'claude',
98
+ autopilot: false,
99
+ };
100
+ // Handle welcome pane destruction if first content pane
101
+ if (isFirstContentPane) {
102
+ try {
103
+ const configContent = fs.readFileSync(configPath, 'utf-8');
104
+ const config = JSON.parse(configContent);
105
+ config.panes = [...existingPanes, newPane];
106
+ config.lastUpdated = new Date().toISOString();
107
+ atomicWriteJsonSync(configPath, config);
108
+ const { destroyWelcomePaneCoordinated } = await import('./welcomePaneManager.js');
109
+ destroyWelcomePaneCoordinated(projectRoot);
110
+ }
111
+ catch {
112
+ // Log but don't fail
113
+ }
114
+ }
115
+ // Switch back to the original pane
116
+ await tmuxService.selectPane(originalPaneId);
117
+ return {
118
+ pane: newPane,
119
+ };
120
+ }
121
+ //# sourceMappingURL=reopenWorktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reopenWorktree.js","sourceRoot":"","sources":["../../src/utils/reopenWorktree.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dmux",
3
- "version": "3.5.0",
3
+ "version": "3.5.2",
4
4
  "description": "Tmux pane manager with AI agent integration for parallel development workflows",
5
5
  "type": "module",
6
6
  "author": "Justin Schroeder",