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.
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +41 -1
- package/dist/DmuxApp.js.map +1 -1
- package/dist/actions/merge/commitMessageHandler.d.ts.map +1 -1
- package/dist/actions/merge/commitMessageHandler.js +7 -0
- package/dist/actions/merge/commitMessageHandler.js.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -1
- package/dist/actions/merge/multiMergeOrchestrator.js +215 -38
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -1
- package/dist/components/popups/reopenWorktreePopup.d.ts +7 -0
- package/dist/components/popups/reopenWorktreePopup.d.ts.map +1 -0
- package/dist/components/popups/reopenWorktreePopup.js +96 -0
- package/dist/components/popups/reopenWorktreePopup.js.map +1 -0
- package/dist/components/popups/shortcutsPopup.js +2 -1
- package/dist/components/popups/shortcutsPopup.js.map +1 -1
- package/dist/components/ui/FooterHelp.js +2 -2
- package/dist/hooks/useInputHandling.d.ts +2 -0
- package/dist/hooks/useInputHandling.d.ts.map +1 -1
- package/dist/hooks/useInputHandling.js +24 -9
- package/dist/hooks/useInputHandling.js.map +1 -1
- package/dist/server/embedded-assets.d.ts.map +1 -1
- package/dist/server/embedded-assets.js +42 -2
- package/dist/server/embedded-assets.js.map +1 -1
- package/dist/services/PopupManager.d.ts +10 -0
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +30 -2
- package/dist/services/PopupManager.js.map +1 -1
- package/dist/utils/aiMerge.d.ts.map +1 -1
- package/dist/utils/aiMerge.js +7 -1
- package/dist/utils/aiMerge.js.map +1 -1
- package/dist/utils/generated-agents-doc.d.ts +1 -1
- package/dist/utils/generated-agents-doc.js +1 -1
- package/dist/utils/git.d.ts +15 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +70 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/hooksDocs.d.ts +1 -1
- package/dist/utils/mergeValidation.d.ts.map +1 -1
- package/dist/utils/mergeValidation.js +48 -2
- package/dist/utils/mergeValidation.js.map +1 -1
- package/dist/utils/reopenWorktree.d.ts +16 -0
- package/dist/utils/reopenWorktree.d.ts.map +1 -0
- package/dist/utils/reopenWorktree.js +121 -0
- package/dist/utils/reopenWorktree.js.map +1 -0
- 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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"}
|