dmux 1.6.0 → 2.0.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.
- package/README.md +12 -8
- package/dist/AutoUpdater.d.ts +2 -2
- package/dist/AutoUpdater.d.ts.map +1 -1
- package/dist/AutoUpdater.js +18 -7
- package/dist/AutoUpdater.js.map +1 -1
- package/dist/CleanTextInput.d.ts.map +1 -1
- package/dist/CleanTextInput.js +12 -4
- package/dist/CleanTextInput.js.map +1 -1
- package/dist/DmuxApp.d.ts +1 -10
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +146 -1483
- package/dist/DmuxApp.js.map +1 -1
- package/dist/components/AgentChoiceDialog.d.ts +7 -0
- package/dist/components/AgentChoiceDialog.d.ts.map +1 -0
- package/dist/components/AgentChoiceDialog.js +12 -0
- package/dist/components/AgentChoiceDialog.js.map +1 -0
- package/dist/components/CloseOptionsDialog.d.ts +9 -0
- package/dist/components/CloseOptionsDialog.d.ts.map +1 -0
- package/dist/components/CloseOptionsDialog.js +30 -0
- package/dist/components/CloseOptionsDialog.js.map +1 -0
- package/dist/components/CommandPromptDialog.d.ts +9 -0
- package/dist/components/CommandPromptDialog.d.ts.map +1 -0
- package/dist/components/CommandPromptDialog.js +20 -0
- package/dist/components/CommandPromptDialog.js.map +1 -0
- package/dist/components/CreatingIndicator.d.ts +7 -0
- package/dist/components/CreatingIndicator.d.ts.map +1 -0
- package/dist/components/CreatingIndicator.js +10 -0
- package/dist/components/CreatingIndicator.js.map +1 -0
- package/dist/components/FileCopyPrompt.d.ts +4 -0
- package/dist/components/FileCopyPrompt.d.ts.map +1 -0
- package/dist/components/FileCopyPrompt.js +13 -0
- package/dist/components/FileCopyPrompt.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +8 -0
- package/dist/components/FooterHelp.d.ts.map +1 -0
- package/dist/components/FooterHelp.js +12 -0
- package/dist/components/FooterHelp.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts +4 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/LoadingIndicator.js +10 -0
- package/dist/components/LoadingIndicator.js.map +1 -0
- package/dist/components/MergeConfirmationDialog.d.ts +8 -0
- package/dist/components/MergeConfirmationDialog.d.ts.map +1 -0
- package/dist/components/MergeConfirmationDialog.js +13 -0
- package/dist/components/MergeConfirmationDialog.js.map +1 -0
- package/dist/components/NewPaneDialog.d.ts +9 -0
- package/dist/components/NewPaneDialog.d.ts.map +1 -0
- package/dist/components/NewPaneDialog.js +13 -0
- package/dist/components/NewPaneDialog.js.map +1 -0
- package/dist/components/PaneCard.d.ts +9 -0
- package/dist/components/PaneCard.d.ts.map +1 -0
- package/dist/components/PaneCard.js +37 -0
- package/dist/components/PaneCard.js.map +1 -0
- package/dist/components/PanesGrid.d.ts +11 -0
- package/dist/components/PanesGrid.d.ts.map +1 -0
- package/dist/components/PanesGrid.js +11 -0
- package/dist/components/PanesGrid.js.map +1 -0
- package/dist/components/RunningIndicator.d.ts +4 -0
- package/dist/components/RunningIndicator.d.ts.map +1 -0
- package/dist/components/RunningIndicator.js +9 -0
- package/dist/components/RunningIndicator.js.map +1 -0
- package/dist/components/UpdateDialog.d.ts +7 -0
- package/dist/components/UpdateDialog.d.ts.map +1 -0
- package/dist/components/UpdateDialog.js +27 -0
- package/dist/components/UpdateDialog.js.map +1 -0
- package/dist/components/UpdatingIndicator.d.ts +4 -0
- package/dist/components/UpdatingIndicator.d.ts.map +1 -0
- package/dist/components/UpdatingIndicator.js +9 -0
- package/dist/components/UpdatingIndicator.js.map +1 -0
- package/dist/hooks/useAgentDetection.d.ts +4 -0
- package/dist/hooks/useAgentDetection.d.ts.map +1 -0
- package/dist/hooks/useAgentDetection.js +71 -0
- package/dist/hooks/useAgentDetection.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +11 -0
- package/dist/hooks/useAgentStatus.d.ts.map +1 -0
- package/dist/hooks/useAgentStatus.js +172 -0
- package/dist/hooks/useAgentStatus.js.map +1 -0
- package/dist/hooks/useAutoUpdater.d.ts +20 -0
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -0
- package/dist/hooks/useAutoUpdater.js +100 -0
- package/dist/hooks/useAutoUpdater.js.map +1 -0
- package/dist/hooks/useCommandRunner.d.ts +18 -0
- package/dist/hooks/useCommandRunner.d.ts.map +1 -0
- package/dist/hooks/useCommandRunner.js +44 -0
- package/dist/hooks/useCommandRunner.js.map +1 -0
- package/dist/hooks/useNavigation.d.ts +8 -0
- package/dist/hooks/useNavigation.d.ts.map +1 -0
- package/dist/hooks/useNavigation.js +62 -0
- package/dist/hooks/useNavigation.js.map +1 -0
- package/dist/hooks/usePaneCreation.d.ts +16 -0
- package/dist/hooks/usePaneCreation.d.ts.map +1 -0
- package/dist/hooks/usePaneCreation.js +133 -0
- package/dist/hooks/usePaneCreation.js.map +1 -0
- package/dist/hooks/usePaneRunner.d.ts +17 -0
- package/dist/hooks/usePaneRunner.d.ts.map +1 -0
- package/dist/hooks/usePaneRunner.js +149 -0
- package/dist/hooks/usePaneRunner.js.map +1 -0
- package/dist/hooks/usePanes.d.ts +9 -0
- package/dist/hooks/usePanes.d.ts.map +1 -0
- package/dist/hooks/usePanes.js +222 -0
- package/dist/hooks/usePanes.js.map +1 -0
- package/dist/hooks/useProjectSettings.d.ts +6 -0
- package/dist/hooks/useProjectSettings.d.ts.map +1 -0
- package/dist/hooks/useProjectSettings.js +46 -0
- package/dist/hooks/useProjectSettings.js.map +1 -0
- package/dist/hooks/useTerminalWidth.d.ts +2 -0
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
- package/dist/hooks/useTerminalWidth.js +13 -0
- package/dist/hooks/useTerminalWidth.js.map +1 -0
- package/dist/hooks/useWorktreeActions.d.ts +17 -0
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -0
- package/dist/hooks/useWorktreeActions.js +190 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -0
- package/dist/index.js +86 -11
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/commands.d.ts +6 -0
- package/dist/utils/commands.d.ts.map +1 -0
- package/dist/utils/commands.js +35 -0
- package/dist/utils/commands.js.map +1 -0
- package/dist/utils/input.d.ts +13 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +100 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/slug.d.ts +3 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +58 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/tmux.d.ts +4 -0
- package/dist/utils/tmux.d.ts.map +1 -0
- package/dist/utils/tmux.js +62 -0
- package/dist/utils/tmux.js.map +1 -0
- package/dist/workers/updateChecker.d.ts +2 -0
- package/dist/workers/updateChecker.d.ts.map +1 -0
- package/dist/workers/updateChecker.js +33 -0
- package/dist/workers/updateChecker.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
export default function usePanes(panesFile, skipLoading) {
|
|
5
|
+
const [panes, setPanes] = useState([]);
|
|
6
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
7
|
+
const loadPanes = async () => {
|
|
8
|
+
if (skipLoading)
|
|
9
|
+
return;
|
|
10
|
+
try {
|
|
11
|
+
const content = await fs.readFile(panesFile, 'utf-8');
|
|
12
|
+
// Handle both old array format and new config format
|
|
13
|
+
let loadedPanes;
|
|
14
|
+
let parsed = JSON.parse(content);
|
|
15
|
+
if (Array.isArray(parsed)) {
|
|
16
|
+
loadedPanes = parsed;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const config = parsed;
|
|
20
|
+
loadedPanes = config.panes || [];
|
|
21
|
+
}
|
|
22
|
+
let allPaneIds = [];
|
|
23
|
+
let titleToId = new Map();
|
|
24
|
+
let retryCount = 0;
|
|
25
|
+
const maxRetries = 2;
|
|
26
|
+
while (retryCount <= maxRetries) {
|
|
27
|
+
try {
|
|
28
|
+
const output = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
|
|
29
|
+
encoding: 'utf-8',
|
|
30
|
+
stdio: 'pipe',
|
|
31
|
+
timeout: 1000
|
|
32
|
+
}).trim();
|
|
33
|
+
if (output) {
|
|
34
|
+
const lines = output.split('\n');
|
|
35
|
+
for (const line of lines) {
|
|
36
|
+
const [id, title] = line.split('::');
|
|
37
|
+
if (id && id.startsWith('%')) {
|
|
38
|
+
allPaneIds.push(id);
|
|
39
|
+
if (title)
|
|
40
|
+
titleToId.set(title.trim(), id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (allPaneIds.length > 0 || retryCount === maxRetries)
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
if (retryCount < maxRetries)
|
|
49
|
+
await new Promise(r => setTimeout(r, 100));
|
|
50
|
+
}
|
|
51
|
+
retryCount++;
|
|
52
|
+
}
|
|
53
|
+
// Attempt to rebind panes whose IDs changed by matching on title (slug)
|
|
54
|
+
const reboundPanes = loadedPanes.map(p => {
|
|
55
|
+
if (allPaneIds.length > 0 && !allPaneIds.includes(p.paneId)) {
|
|
56
|
+
const remappedId = titleToId.get(p.slug);
|
|
57
|
+
if (remappedId)
|
|
58
|
+
return { ...p, paneId: remappedId };
|
|
59
|
+
}
|
|
60
|
+
return p;
|
|
61
|
+
});
|
|
62
|
+
// Find panes that exist in config but not in tmux
|
|
63
|
+
const missingPanes = allPaneIds.length > 0
|
|
64
|
+
? reboundPanes.filter(pane => !allPaneIds.includes(pane.paneId))
|
|
65
|
+
: [];
|
|
66
|
+
// Recreate missing panes
|
|
67
|
+
for (const missingPane of missingPanes) {
|
|
68
|
+
try {
|
|
69
|
+
// Create new pane
|
|
70
|
+
const newPaneId = execSync(`tmux split-window -h -P -F '#{pane_id}' -c "${missingPane.worktreePath || process.cwd()}"`, {
|
|
71
|
+
encoding: 'utf-8',
|
|
72
|
+
stdio: 'pipe'
|
|
73
|
+
}).trim();
|
|
74
|
+
// Set pane title
|
|
75
|
+
execSync(`tmux select-pane -t '${newPaneId}' -T "${missingPane.slug}"`, { stdio: 'pipe' });
|
|
76
|
+
// Update the pane with new ID
|
|
77
|
+
missingPane.paneId = newPaneId;
|
|
78
|
+
// Send a message to the pane indicating it was restored
|
|
79
|
+
execSync(`tmux send-keys -t '${newPaneId}' "# Pane restored: ${missingPane.slug}" Enter`, { stdio: 'pipe' });
|
|
80
|
+
execSync(`tmux send-keys -t '${newPaneId}' "# Original prompt: ${missingPane.prompt?.substring(0, 50)}..." Enter`, { stdio: 'pipe' });
|
|
81
|
+
execSync(`tmux send-keys -t '${newPaneId}' "cd ${missingPane.worktreePath || process.cwd()}" Enter`, { stdio: 'pipe' });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// If we can't create the pane, skip it
|
|
85
|
+
console.error(`Failed to recreate pane ${missingPane.slug}:`, error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Re-fetch pane IDs after recreation
|
|
89
|
+
if (missingPanes.length > 0) {
|
|
90
|
+
// Apply even-horizontal layout after creating panes
|
|
91
|
+
try {
|
|
92
|
+
execSync('tmux select-layout even-horizontal', { stdio: 'pipe' });
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
allPaneIds = [];
|
|
96
|
+
titleToId.clear();
|
|
97
|
+
try {
|
|
98
|
+
const output = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
|
|
99
|
+
encoding: 'utf-8',
|
|
100
|
+
stdio: 'pipe',
|
|
101
|
+
timeout: 1000
|
|
102
|
+
}).trim();
|
|
103
|
+
if (output) {
|
|
104
|
+
const lines = output.split('\n');
|
|
105
|
+
for (const line of lines) {
|
|
106
|
+
const [id, title] = line.split('::');
|
|
107
|
+
if (id && id.startsWith('%')) {
|
|
108
|
+
allPaneIds.push(id);
|
|
109
|
+
if (title)
|
|
110
|
+
titleToId.set(title.trim(), id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch { }
|
|
116
|
+
// Re-rebind after recreation
|
|
117
|
+
loadedPanes.forEach(p => {
|
|
118
|
+
if (!allPaneIds.includes(p.paneId)) {
|
|
119
|
+
const remappedId = titleToId.get(p.slug);
|
|
120
|
+
if (remappedId)
|
|
121
|
+
p.paneId = remappedId;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
// Now filter to only include panes that exist in tmux
|
|
126
|
+
const activePanes = allPaneIds.length > 0
|
|
127
|
+
? loadedPanes.filter(pane => allPaneIds.includes(pane.paneId))
|
|
128
|
+
: panes; // Always preserve existing panes when tmux fails
|
|
129
|
+
const currentPaneIds = panes.map(p => p.paneId).sort().join(',');
|
|
130
|
+
const newPaneIds = activePanes.map(p => p.paneId).sort().join(',');
|
|
131
|
+
// Only update if there's a real change, not just on initial load
|
|
132
|
+
if (currentPaneIds !== newPaneIds && (panes.length > 0 || activePanes.length > 0)) {
|
|
133
|
+
if (activePanes.length > 0) {
|
|
134
|
+
activePanes.forEach(pane => {
|
|
135
|
+
try {
|
|
136
|
+
execSync(`tmux select-pane -t '${pane.paneId}' -T "${pane.slug}"`, { stdio: 'pipe' });
|
|
137
|
+
}
|
|
138
|
+
catch { }
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
setPanes(activePanes);
|
|
142
|
+
// Persist updated list if IDs changed or panes were filtered
|
|
143
|
+
if (JSON.stringify(activePanes) !== JSON.stringify(loadedPanes)) {
|
|
144
|
+
// Save in new config format
|
|
145
|
+
const config = {
|
|
146
|
+
...parsed,
|
|
147
|
+
panes: activePanes,
|
|
148
|
+
lastUpdated: new Date().toISOString()
|
|
149
|
+
};
|
|
150
|
+
await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// ignore
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
if (isLoading)
|
|
159
|
+
setIsLoading(false);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
const savePanes = async (newPanes) => {
|
|
163
|
+
let activePanes = newPanes;
|
|
164
|
+
try {
|
|
165
|
+
const out = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
|
|
166
|
+
encoding: 'utf-8',
|
|
167
|
+
stdio: 'pipe',
|
|
168
|
+
timeout: 1000
|
|
169
|
+
}).trim();
|
|
170
|
+
const paneIds = [];
|
|
171
|
+
const titleToId = new Map();
|
|
172
|
+
if (out) {
|
|
173
|
+
out.split('\n').forEach(line => {
|
|
174
|
+
const [id, title] = line.split('::');
|
|
175
|
+
if (id && id.startsWith('%'))
|
|
176
|
+
paneIds.push(id);
|
|
177
|
+
if (title)
|
|
178
|
+
titleToId.set(title.trim(), id);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
// Rebind panes by title if their IDs changed, then filter to existing panes when possible
|
|
182
|
+
activePanes = newPanes
|
|
183
|
+
.map(p => {
|
|
184
|
+
if (!paneIds.includes(p.paneId)) {
|
|
185
|
+
const remappedId = titleToId.get(p.slug);
|
|
186
|
+
if (remappedId)
|
|
187
|
+
return { ...p, paneId: remappedId };
|
|
188
|
+
}
|
|
189
|
+
return p;
|
|
190
|
+
})
|
|
191
|
+
.filter(p => paneIds.length > 0 ? paneIds.includes(p.paneId) : true);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
activePanes = newPanes;
|
|
195
|
+
}
|
|
196
|
+
// Read existing config to preserve other fields
|
|
197
|
+
let config = { panes: [] };
|
|
198
|
+
try {
|
|
199
|
+
const content = await fs.readFile(panesFile, 'utf-8');
|
|
200
|
+
const parsed = JSON.parse(content);
|
|
201
|
+
if (!Array.isArray(parsed)) {
|
|
202
|
+
config = parsed;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch { }
|
|
206
|
+
// Save in config format
|
|
207
|
+
config.panes = activePanes;
|
|
208
|
+
config.lastUpdated = new Date().toISOString();
|
|
209
|
+
await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
|
|
210
|
+
setPanes(activePanes);
|
|
211
|
+
};
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
loadPanes();
|
|
214
|
+
const interval = setInterval(() => {
|
|
215
|
+
if (!skipLoading)
|
|
216
|
+
loadPanes();
|
|
217
|
+
}, 3000);
|
|
218
|
+
return () => clearInterval(interval);
|
|
219
|
+
}, [skipLoading, panesFile]);
|
|
220
|
+
return { panes, setPanes, isLoading, loadPanes, savePanes };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=usePanes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePanes.js","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ProjectSettings } from '../types.js';
|
|
2
|
+
export default function useProjectSettings(settingsFile: string): {
|
|
3
|
+
projectSettings: ProjectSettings;
|
|
4
|
+
saveSettings: (settings: ProjectSettings) => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=useProjectSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useProjectSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useProjectSettings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAY,EAAE,MAAM;;6BAyBvB,eAAe;EAoBtD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
export default function useProjectSettings(settingsFile) {
|
|
4
|
+
const [projectSettings, setProjectSettings] = useState({});
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
const load = async () => {
|
|
7
|
+
try {
|
|
8
|
+
const content = await fs.readFile(settingsFile, 'utf-8');
|
|
9
|
+
const parsed = JSON.parse(content);
|
|
10
|
+
// Handle both old format (direct settings) and new format (config with settings field)
|
|
11
|
+
if (parsed.settings !== undefined || parsed.panes !== undefined) {
|
|
12
|
+
// New config format
|
|
13
|
+
const config = parsed;
|
|
14
|
+
setProjectSettings(config.settings || {});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// Old format or direct settings
|
|
18
|
+
setProjectSettings(parsed);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
setProjectSettings({});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
load();
|
|
26
|
+
}, [settingsFile]);
|
|
27
|
+
const saveSettings = async (settings) => {
|
|
28
|
+
// Read existing config to preserve other fields
|
|
29
|
+
let config = {};
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.readFile(settingsFile, 'utf-8');
|
|
32
|
+
const parsed = JSON.parse(content);
|
|
33
|
+
if (parsed.panes !== undefined || parsed.settings !== undefined) {
|
|
34
|
+
config = parsed;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch { }
|
|
38
|
+
// Update settings in config
|
|
39
|
+
config.settings = settings;
|
|
40
|
+
config.lastUpdated = new Date().toISOString();
|
|
41
|
+
await fs.writeFile(settingsFile, JSON.stringify(config, null, 2));
|
|
42
|
+
setProjectSettings(settings);
|
|
43
|
+
};
|
|
44
|
+
return { projectSettings, saveSettings };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=useProjectSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useProjectSettings.js","sourceRoot":"","sources":["../../src/hooks/useProjectSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,aAAa,CAAC;AAY7B,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAoB;IAC7D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,uFAAuF;gBACvF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAChE,oBAAoB;oBACpB,MAAM,MAAM,GAAG,MAAoB,CAAC;oBACpC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,gCAAgC;oBAChC,kBAAkB,CAAC,MAAyB,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,YAAY,GAAG,KAAK,EAAE,QAAyB,EAAE,EAAE;QACvD,gDAAgD;QAChD,IAAI,MAAM,GAAe,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAChE,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,4BAA4B;QAC5B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTerminalWidth.d.ts","sourceRoot":"","sources":["../../src/hooks/useTerminalWidth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,gBAAgB,WAYvC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
export default function useTerminalWidth() {
|
|
3
|
+
const [terminalWidth, setTerminalWidth] = useState(process.stdout.columns || 80);
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
const handleResize = () => setTerminalWidth(process.stdout.columns || 80);
|
|
6
|
+
process.stdout.on('resize', handleResize);
|
|
7
|
+
return () => {
|
|
8
|
+
process.stdout.removeListener('resize', handleResize);
|
|
9
|
+
};
|
|
10
|
+
}, []);
|
|
11
|
+
return terminalWidth;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=useTerminalWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTerminalWidth.js","sourceRoot":"","sources":["../../src/hooks/useTerminalWidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEzF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DmuxPane } from '../types.js';
|
|
2
|
+
interface Params {
|
|
3
|
+
panes: DmuxPane[];
|
|
4
|
+
savePanes: (p: DmuxPane[]) => Promise<void>;
|
|
5
|
+
setStatusMessage: (msg: string) => void;
|
|
6
|
+
setShowMergeConfirmation: (v: boolean) => void;
|
|
7
|
+
setMergedPane: (pane: DmuxPane | null) => void;
|
|
8
|
+
}
|
|
9
|
+
export default function useWorktreeActions({ panes, savePanes, setStatusMessage, setShowMergeConfirmation, setMergedPane }: Params): {
|
|
10
|
+
readonly closePane: (pane: DmuxPane) => Promise<void>;
|
|
11
|
+
readonly mergeWorktree: (pane: DmuxPane) => Promise<void>;
|
|
12
|
+
readonly mergeAndPrune: (pane: DmuxPane) => Promise<void>;
|
|
13
|
+
readonly deleteUnsavedChanges: (pane: DmuxPane) => Promise<void>;
|
|
14
|
+
readonly handleCloseOption: (option: number, pane: DmuxPane) => Promise<void>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useWorktreeActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorktreeActions.d.ts","sourceRoot":"","sources":["../../src/hooks/useWorktreeActions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,MAAM;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,aAAa,EAAE,EAAE,MAAM;+BACrF,QAAQ;mCAiCJ,QAAQ;mCAuDR,QAAQ;0CAoDD,QAAQ;yCAmBT,MAAM,QAAQ,QAAQ;EAkB5E"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { applySmartLayout } from '../utils/tmux.js';
|
|
4
|
+
export default function useWorktreeActions({ panes, savePanes, setStatusMessage, setShowMergeConfirmation, setMergedPane }) {
|
|
5
|
+
const closePane = useCallback(async (pane) => {
|
|
6
|
+
try {
|
|
7
|
+
if (pane.testWindowId) {
|
|
8
|
+
try {
|
|
9
|
+
execSync(`tmux kill-window -t '${pane.testWindowId}'`, { stdio: 'pipe' });
|
|
10
|
+
}
|
|
11
|
+
catch { }
|
|
12
|
+
}
|
|
13
|
+
if (pane.devWindowId) {
|
|
14
|
+
try {
|
|
15
|
+
execSync(`tmux kill-window -t '${pane.devWindowId}'`, { stdio: 'pipe' });
|
|
16
|
+
}
|
|
17
|
+
catch { }
|
|
18
|
+
}
|
|
19
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
20
|
+
process.stdout.write('\n'.repeat(100));
|
|
21
|
+
try {
|
|
22
|
+
execSync('tmux clear-history', { stdio: 'pipe' });
|
|
23
|
+
execSync('tmux send-keys C-l', { stdio: 'pipe' });
|
|
24
|
+
}
|
|
25
|
+
catch { }
|
|
26
|
+
try {
|
|
27
|
+
execSync('tmux refresh-client', { stdio: 'pipe' });
|
|
28
|
+
}
|
|
29
|
+
catch { }
|
|
30
|
+
await new Promise(r => setTimeout(r, 100));
|
|
31
|
+
execSync(`tmux kill-pane -t '${pane.paneId}'`, { stdio: 'pipe' });
|
|
32
|
+
const paneCount = parseInt(execSync('tmux list-panes | wc -l', { encoding: 'utf-8' }).trim());
|
|
33
|
+
if (paneCount > 1)
|
|
34
|
+
applySmartLayout(paneCount);
|
|
35
|
+
const updatedPanes = panes.filter(p => p.id !== pane.id);
|
|
36
|
+
await savePanes(updatedPanes);
|
|
37
|
+
setStatusMessage(`Closed pane: ${pane.slug}`);
|
|
38
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
setStatusMessage('Failed to close pane');
|
|
42
|
+
setTimeout(() => setStatusMessage(''), 2000);
|
|
43
|
+
}
|
|
44
|
+
}, [panes, savePanes, setStatusMessage]);
|
|
45
|
+
const mergeWorktree = useCallback(async (pane) => {
|
|
46
|
+
if (!pane.worktreePath) {
|
|
47
|
+
setStatusMessage('No worktree to merge');
|
|
48
|
+
setTimeout(() => setStatusMessage(''), 2000);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
setStatusMessage('Checking worktree status...');
|
|
53
|
+
const mainBranch = execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
54
|
+
const statusOutput = execSync(`git -C "${pane.worktreePath}" status --porcelain`, { encoding: 'utf-8' });
|
|
55
|
+
if (statusOutput.trim()) {
|
|
56
|
+
setStatusMessage('Staging changes...');
|
|
57
|
+
execSync(`git -C "${pane.worktreePath}" add -A`, { stdio: 'pipe' });
|
|
58
|
+
setStatusMessage('Committing changes...');
|
|
59
|
+
// Use generic message to avoid bringing in LLM here
|
|
60
|
+
execSync(`git -C "${pane.worktreePath}" commit -m 'chore: worktree changes'`, { stdio: 'pipe' });
|
|
61
|
+
}
|
|
62
|
+
setStatusMessage('Merging into main...');
|
|
63
|
+
try {
|
|
64
|
+
execSync(`git merge ${pane.slug}`, { stdio: 'pipe' });
|
|
65
|
+
}
|
|
66
|
+
catch (mergeError) {
|
|
67
|
+
const errorMessage = mergeError.message || String(mergeError);
|
|
68
|
+
if (errorMessage.includes('CONFLICT') || errorMessage.includes('conflict')) {
|
|
69
|
+
process.stderr.write('\n\x1b[31m✗ Merge conflict detected!\x1b[0m\n');
|
|
70
|
+
process.stderr.write(`\nThere are merge conflicts when merging branch '${pane.slug}' into '${mainBranch}'.\n`);
|
|
71
|
+
process.stderr.write('\nTo resolve:\n');
|
|
72
|
+
process.stderr.write('1. Manually resolve the merge conflicts in your editor\n');
|
|
73
|
+
process.stderr.write('2. Stage the resolved files: git add <resolved-files>\n');
|
|
74
|
+
process.stderr.write('3. Complete the merge: git commit\n');
|
|
75
|
+
process.stderr.write('4. Run dmux again to continue managing your panes\n');
|
|
76
|
+
process.stderr.write('\nExiting dmux now...\n\n');
|
|
77
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
78
|
+
process.stdout.write('\x1b[3J');
|
|
79
|
+
try {
|
|
80
|
+
execSync('tmux clear-history', { stdio: 'pipe' });
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
throw mergeError;
|
|
86
|
+
}
|
|
87
|
+
execSync(`git worktree remove "${pane.worktreePath}"`, { stdio: 'pipe' });
|
|
88
|
+
execSync(`git branch -d ${pane.slug}`, { stdio: 'pipe' });
|
|
89
|
+
setStatusMessage(`Merged ${pane.slug} into ${mainBranch}`);
|
|
90
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
91
|
+
setMergedPane(pane);
|
|
92
|
+
setShowMergeConfirmation(true);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
setStatusMessage('Failed to merge - check git status');
|
|
96
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
97
|
+
}
|
|
98
|
+
}, [setStatusMessage, setMergedPane, setShowMergeConfirmation]);
|
|
99
|
+
const mergeAndPrune = useCallback(async (pane) => {
|
|
100
|
+
if (!pane.worktreePath) {
|
|
101
|
+
setStatusMessage('No worktree to merge');
|
|
102
|
+
setTimeout(() => setStatusMessage(''), 2000);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
setStatusMessage('Checking worktree status...');
|
|
107
|
+
const mainBranch = execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
|
|
108
|
+
const statusOutput = execSync(`git -C "${pane.worktreePath}" status --porcelain`, { encoding: 'utf-8' });
|
|
109
|
+
if (statusOutput.trim()) {
|
|
110
|
+
setStatusMessage('Staging changes...');
|
|
111
|
+
execSync(`git -C "${pane.worktreePath}" add -A`, { stdio: 'pipe' });
|
|
112
|
+
setStatusMessage('Committing changes...');
|
|
113
|
+
execSync(`git -C "${pane.worktreePath}" commit -m 'chore: worktree changes'`, { stdio: 'pipe' });
|
|
114
|
+
}
|
|
115
|
+
setStatusMessage('Merging into main...');
|
|
116
|
+
try {
|
|
117
|
+
execSync(`git merge ${pane.slug}`, { stdio: 'pipe' });
|
|
118
|
+
}
|
|
119
|
+
catch (mergeError) {
|
|
120
|
+
const errorMessage = mergeError.message || String(mergeError);
|
|
121
|
+
if (errorMessage.includes('CONFLICT') || errorMessage.includes('conflict')) {
|
|
122
|
+
process.stderr.write('\n\x1b[31m✗ Merge conflict detected!\x1b[0m\n');
|
|
123
|
+
process.stderr.write(`\nThere are merge conflicts when merging branch '${pane.slug}' into '${mainBranch}'.\n`);
|
|
124
|
+
process.stderr.write('\nTo resolve:\n');
|
|
125
|
+
process.stderr.write('1. Manually resolve the merge conflicts in your editor\n');
|
|
126
|
+
process.stderr.write('2. Stage the resolved files: git add <resolved-files>\n');
|
|
127
|
+
process.stderr.write('3. Complete the merge: git commit\n');
|
|
128
|
+
process.stderr.write('4. Run dmux again to continue managing your panes\n');
|
|
129
|
+
process.stderr.write('\nExiting dmux now...\n\n');
|
|
130
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
131
|
+
process.stdout.write('\x1b[3J');
|
|
132
|
+
try {
|
|
133
|
+
execSync('tmux clear-history', { stdio: 'pipe' });
|
|
134
|
+
}
|
|
135
|
+
catch { }
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
throw mergeError;
|
|
139
|
+
}
|
|
140
|
+
execSync(`git worktree remove "${pane.worktreePath}"`, { stdio: 'pipe' });
|
|
141
|
+
execSync(`git branch -d ${pane.slug}`, { stdio: 'pipe' });
|
|
142
|
+
await closePane(pane);
|
|
143
|
+
setStatusMessage(`Merged ${pane.slug} into ${mainBranch} and closed pane`);
|
|
144
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
setStatusMessage('Failed to merge - check git status');
|
|
148
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
149
|
+
}
|
|
150
|
+
}, [closePane, setStatusMessage]);
|
|
151
|
+
const deleteUnsavedChanges = useCallback(async (pane) => {
|
|
152
|
+
if (!pane.worktreePath) {
|
|
153
|
+
await closePane(pane);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
setStatusMessage('Removing worktree with unsaved changes...');
|
|
158
|
+
execSync(`git worktree remove --force "${pane.worktreePath}"`, { stdio: 'pipe' });
|
|
159
|
+
try {
|
|
160
|
+
execSync(`git branch -D ${pane.slug}`, { stdio: 'pipe' });
|
|
161
|
+
}
|
|
162
|
+
catch { }
|
|
163
|
+
await closePane(pane);
|
|
164
|
+
setStatusMessage(`Deleted worktree ${pane.slug} and closed pane`);
|
|
165
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
setStatusMessage('Failed to delete worktree');
|
|
169
|
+
setTimeout(() => setStatusMessage(''), 3000);
|
|
170
|
+
}
|
|
171
|
+
}, [closePane, setStatusMessage]);
|
|
172
|
+
const handleCloseOption = useCallback(async (option, pane) => {
|
|
173
|
+
switch (option) {
|
|
174
|
+
case 0:
|
|
175
|
+
await mergeAndPrune(pane);
|
|
176
|
+
break;
|
|
177
|
+
case 1:
|
|
178
|
+
await mergeWorktree(pane);
|
|
179
|
+
break;
|
|
180
|
+
case 2:
|
|
181
|
+
await deleteUnsavedChanges(pane);
|
|
182
|
+
break;
|
|
183
|
+
case 3:
|
|
184
|
+
await closePane(pane);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}, [mergeAndPrune, mergeWorktree, deleteUnsavedChanges, closePane]);
|
|
188
|
+
return { closePane, mergeWorktree, mergeAndPrune, deleteUnsavedChanges, handleCloseOption };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=useWorktreeActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorktreeActions.js","sourceRoot":"","sources":["../../src/hooks/useWorktreeActions.ts"],"names":[],"mappings":"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"}
|