dmux 2.0.0 → 2.1.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/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +6 -8
- package/dist/DmuxApp.js.map +1 -1
- package/dist/components/PanesGrid.d.ts +2 -0
- package/dist/components/PanesGrid.d.ts.map +1 -1
- package/dist/components/PanesGrid.js +9 -2
- package/dist/components/PanesGrid.js.map +1 -1
- package/dist/hooks/useAgentStatus.d.ts +2 -4
- package/dist/hooks/useAgentStatus.d.ts.map +1 -1
- package/dist/hooks/useAgentStatus.js +126 -92
- package/dist/hooks/useAgentStatus.js.map +1 -1
- package/dist/hooks/usePaneCreation.d.ts +2 -1
- package/dist/hooks/usePaneCreation.d.ts.map +1 -1
- package/dist/hooks/usePaneCreation.js +20 -2
- package/dist/hooks/usePaneCreation.js.map +1 -1
- package/dist/hooks/usePaneRunner.js +1 -1
- package/dist/hooks/usePaneRunner.js.map +1 -1
- package/dist/hooks/usePanes.d.ts.map +1 -1
- package/dist/hooks/usePanes.js +135 -68
- package/dist/hooks/usePanes.js.map +1 -1
- package/dist/index.js +100 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { execSync } from 'child_process';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { applySmartLayout } from '../utils/tmux.js';
|
|
4
4
|
import { generateSlug } from '../utils/slug.js';
|
|
5
|
-
export default function usePaneCreation({ panes, savePanes, projectName, setIsCreatingPane, setStatusMessage, setNewPanePrompt, loadPanes }) {
|
|
5
|
+
export default function usePaneCreation({ panes, savePanes, projectName, setIsCreatingPane, setStatusMessage, setNewPanePrompt, loadPanes, panesFile }) {
|
|
6
6
|
const openInEditor = async (currentPrompt, setPrompt) => {
|
|
7
7
|
try {
|
|
8
8
|
const os = await import('os');
|
|
@@ -37,7 +37,7 @@ export default function usePaneCreation({ panes, savePanes, projectName, setIsCr
|
|
|
37
37
|
catch {
|
|
38
38
|
projectRoot = process.cwd();
|
|
39
39
|
}
|
|
40
|
-
const worktreePath = path.join(
|
|
40
|
+
const worktreePath = path.join(projectRoot, '.dmux', 'worktrees', slug);
|
|
41
41
|
const originalPaneId = execSync('tmux display-message -p "#{pane_id}"', { encoding: 'utf-8' }).trim();
|
|
42
42
|
process.stdout.write('\x1b[2J\x1b[H');
|
|
43
43
|
process.stdout.write('\n'.repeat(100));
|
|
@@ -117,6 +117,24 @@ export default function usePaneCreation({ panes, savePanes, projectName, setIsCr
|
|
|
117
117
|
};
|
|
118
118
|
const updatedPanes = [...panes, newPane];
|
|
119
119
|
await savePanes(updatedPanes);
|
|
120
|
+
// Validate the pane was saved by checking the config
|
|
121
|
+
// This helps catch race conditions
|
|
122
|
+
await new Promise(r => setTimeout(r, 100)); // Small delay to ensure write completes
|
|
123
|
+
try {
|
|
124
|
+
const fs = await import('fs');
|
|
125
|
+
const configContent = await fs.promises.readFile(panesFile, 'utf-8');
|
|
126
|
+
const config = JSON.parse(configContent);
|
|
127
|
+
const savedPanes = Array.isArray(config) ? config : config.panes || [];
|
|
128
|
+
const paneExists = savedPanes.some((p) => p.id === newPane.id);
|
|
129
|
+
if (!paneExists) {
|
|
130
|
+
// Retry the save if pane wasn't found
|
|
131
|
+
console.error('Warning: Pane not found in config after save, retrying...');
|
|
132
|
+
await savePanes(updatedPanes);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('Warning: Could not validate pane save:', error);
|
|
137
|
+
}
|
|
120
138
|
execSync(`tmux select-pane -t '${originalPaneId}'`, { stdio: 'pipe' });
|
|
121
139
|
try {
|
|
122
140
|
execSync(`tmux select-pane -t '${originalPaneId}' -T "dmux-${projectName}"`, { stdio: 'pipe' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePaneCreation.js","sourceRoot":"","sources":["../../src/hooks/usePaneCreation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"usePaneCreation.js","sourceRoot":"","sources":["../../src/hooks/usePaneCreation.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export default function usePaneRunner({ panes, savePanes, projectSettings, setSt
|
|
|
6
6
|
try {
|
|
7
7
|
setStatusMessage('Copying non-git files from main...');
|
|
8
8
|
const projectRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf-8', stdio: 'pipe' }).trim();
|
|
9
|
-
const rsyncCmd = `rsync -avz --exclude='.git' --exclude='node_modules' --exclude='dist' --exclude='build' --exclude='.next' --exclude='.turbo' "${projectRoot}/" "${worktreePath}/"`;
|
|
9
|
+
const rsyncCmd = `rsync -avz --exclude='.git' --exclude='.dmux' --exclude='node_modules' --exclude='dist' --exclude='build' --exclude='.next' --exclude='.turbo' "${projectRoot}/" "${worktreePath}/"`;
|
|
10
10
|
execSync(rsyncCmd, { stdio: 'pipe' });
|
|
11
11
|
setStatusMessage('Non-git files copied successfully');
|
|
12
12
|
setTimeout(() => setStatusMessage(''), 2000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePaneRunner.js","sourceRoot":"","sources":["../../src/hooks/usePaneRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAUpD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAU;IACtH,MAAM,eAAe,GAAG,KAAK,EAAE,YAAoB,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,gBAAgB,CAAC,oCAAoC,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3G,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"usePaneRunner.js","sourceRoot":"","sources":["../../src/hooks/usePaneRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanes.d.ts","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"usePanes.d.ts","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4C5C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;;;;;mCAsMnC,QAAQ,EAAE;EA8D9C"}
|
package/dist/hooks/usePanes.js
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
2
|
import { execSync } from 'child_process';
|
|
3
3
|
import fs from 'fs/promises';
|
|
4
|
+
// Simple write lock to prevent concurrent config writes
|
|
5
|
+
let isWriting = false;
|
|
6
|
+
const writeQueue = [];
|
|
7
|
+
async function withWriteLock(operation) {
|
|
8
|
+
if (isWriting) {
|
|
9
|
+
// Queue this operation
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
writeQueue.push(async () => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await operation();
|
|
14
|
+
resolve(result);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
reject(err);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
isWriting = true;
|
|
23
|
+
try {
|
|
24
|
+
const result = await operation();
|
|
25
|
+
// Process any queued operations
|
|
26
|
+
while (writeQueue.length > 0) {
|
|
27
|
+
const nextOp = writeQueue.shift();
|
|
28
|
+
if (nextOp)
|
|
29
|
+
await nextOp();
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
isWriting = false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
4
37
|
export default function usePanes(panesFile, skipLoading) {
|
|
5
38
|
const [panes, setPanes] = useState([]);
|
|
6
39
|
const [isLoading, setIsLoading] = useState(true);
|
|
@@ -59,11 +92,12 @@ export default function usePanes(panesFile, skipLoading) {
|
|
|
59
92
|
}
|
|
60
93
|
return p;
|
|
61
94
|
});
|
|
62
|
-
//
|
|
63
|
-
|
|
95
|
+
// Only attempt to recreate missing panes on initial load
|
|
96
|
+
// This prevents disruptive recreation during regular polling
|
|
97
|
+
const missingPanes = (allPaneIds.length > 0 && panes.length === 0)
|
|
64
98
|
? reboundPanes.filter(pane => !allPaneIds.includes(pane.paneId))
|
|
65
99
|
: [];
|
|
66
|
-
// Recreate missing panes
|
|
100
|
+
// Recreate missing panes (only on initial load)
|
|
67
101
|
for (const missingPane of missingPanes) {
|
|
68
102
|
try {
|
|
69
103
|
// Create new pane
|
|
@@ -122,32 +156,65 @@ export default function usePanes(panesFile, skipLoading) {
|
|
|
122
156
|
}
|
|
123
157
|
});
|
|
124
158
|
}
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
159
|
+
// Update pane IDs if they've changed (rebinding), but DON'T filter out panes
|
|
160
|
+
// This prevents race conditions where panes get removed from config
|
|
161
|
+
const activePanes = loadedPanes.map(loadedPane => {
|
|
162
|
+
// If we have tmux data and this pane's ID isn't found, try to rebind by title
|
|
163
|
+
if (allPaneIds.length > 0 && !allPaneIds.includes(loadedPane.paneId)) {
|
|
164
|
+
const remappedId = titleToId.get(loadedPane.slug);
|
|
165
|
+
if (remappedId) {
|
|
166
|
+
return { ...loadedPane, paneId: remappedId };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return loadedPane;
|
|
170
|
+
});
|
|
171
|
+
// For initial load (when panes is empty), always set the loaded panes
|
|
172
|
+
if (panes.length === 0 && activePanes.length > 0) {
|
|
173
|
+
// Initial load - set pane titles and update state
|
|
174
|
+
activePanes.forEach(pane => {
|
|
175
|
+
try {
|
|
176
|
+
execSync(`tmux select-pane -t '${pane.paneId}' -T "${pane.slug}"`, { stdio: 'pipe' });
|
|
177
|
+
}
|
|
178
|
+
catch { }
|
|
179
|
+
});
|
|
180
|
+
setPanes(activePanes);
|
|
181
|
+
return; // Exit early for initial load
|
|
182
|
+
}
|
|
183
|
+
// For subsequent loads, check if any pane IDs were remapped
|
|
184
|
+
const idsChanged = activePanes.some((pane, idx) => loadedPanes[idx] && loadedPanes[idx].paneId !== pane.paneId);
|
|
185
|
+
// Only update state if there's a meaningful change
|
|
186
|
+
// Compare only IDs and paneIds, not agentStatus which changes separately
|
|
187
|
+
const currentPaneIds = panes.map(p => `${p.id}:${p.paneId}`).sort().join(',');
|
|
188
|
+
const newPaneIds = activePanes.map(p => `${p.id}:${p.paneId}`).sort().join(',');
|
|
189
|
+
if (currentPaneIds !== newPaneIds) {
|
|
190
|
+
// Update pane titles in tmux
|
|
191
|
+
activePanes.forEach(pane => {
|
|
192
|
+
if (allPaneIds.includes(pane.paneId)) {
|
|
135
193
|
try {
|
|
136
194
|
execSync(`tmux select-pane -t '${pane.paneId}' -T "${pane.slug}"`, { stdio: 'pipe' });
|
|
137
195
|
}
|
|
138
196
|
catch { }
|
|
139
|
-
}
|
|
140
|
-
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
141
199
|
setPanes(activePanes);
|
|
142
|
-
//
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
200
|
+
// Only save to file if IDs were remapped (not just reordered)
|
|
201
|
+
if (idsChanged) {
|
|
202
|
+
await withWriteLock(async () => {
|
|
203
|
+
// Re-read config in case it changed
|
|
204
|
+
let currentConfig = { panes: [] };
|
|
205
|
+
try {
|
|
206
|
+
const content = await fs.readFile(panesFile, 'utf-8');
|
|
207
|
+
const parsed = JSON.parse(content);
|
|
208
|
+
if (!Array.isArray(parsed)) {
|
|
209
|
+
currentConfig = parsed;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch { }
|
|
213
|
+
// Update with remapped panes
|
|
214
|
+
currentConfig.panes = activePanes;
|
|
215
|
+
currentConfig.lastUpdated = new Date().toISOString();
|
|
216
|
+
await fs.writeFile(panesFile, JSON.stringify(currentConfig, null, 2));
|
|
217
|
+
});
|
|
151
218
|
}
|
|
152
219
|
}
|
|
153
220
|
}
|
|
@@ -160,54 +227,54 @@ export default function usePanes(panesFile, skipLoading) {
|
|
|
160
227
|
}
|
|
161
228
|
};
|
|
162
229
|
const savePanes = async (newPanes) => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
out
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
.map(p => {
|
|
184
|
-
if (!paneIds.includes(p.paneId)) {
|
|
230
|
+
await withWriteLock(async () => {
|
|
231
|
+
let activePanes = newPanes;
|
|
232
|
+
// Try to update pane IDs if they've changed (rebinding)
|
|
233
|
+
try {
|
|
234
|
+
const out = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
|
|
235
|
+
encoding: 'utf-8',
|
|
236
|
+
stdio: 'pipe',
|
|
237
|
+
timeout: 1000
|
|
238
|
+
}).trim();
|
|
239
|
+
const titleToId = new Map();
|
|
240
|
+
if (out) {
|
|
241
|
+
out.split('\n').forEach(line => {
|
|
242
|
+
const [id, title] = line.split('::');
|
|
243
|
+
if (id && id.startsWith('%') && title) {
|
|
244
|
+
titleToId.set(title.trim(), id);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// Only rebind IDs, don't filter out panes
|
|
249
|
+
// This prevents losing panes during concurrent operations
|
|
250
|
+
activePanes = newPanes.map(p => {
|
|
185
251
|
const remappedId = titleToId.get(p.slug);
|
|
186
|
-
if (remappedId)
|
|
252
|
+
if (remappedId && remappedId !== p.paneId) {
|
|
187
253
|
return { ...p, paneId: remappedId };
|
|
254
|
+
}
|
|
255
|
+
return p;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// If tmux command fails, keep panes as-is
|
|
260
|
+
activePanes = newPanes;
|
|
261
|
+
}
|
|
262
|
+
// Read existing config to preserve other fields
|
|
263
|
+
let config = { panes: [] };
|
|
264
|
+
try {
|
|
265
|
+
const content = await fs.readFile(panesFile, 'utf-8');
|
|
266
|
+
const parsed = JSON.parse(content);
|
|
267
|
+
if (!Array.isArray(parsed)) {
|
|
268
|
+
config = parsed;
|
|
188
269
|
}
|
|
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
270
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
271
|
+
catch { }
|
|
272
|
+
// Save in config format
|
|
273
|
+
config.panes = activePanes;
|
|
274
|
+
config.lastUpdated = new Date().toISOString();
|
|
275
|
+
await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
|
|
276
|
+
setPanes(activePanes);
|
|
277
|
+
});
|
|
211
278
|
};
|
|
212
279
|
useEffect(() => {
|
|
213
280
|
loadPanes();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanes.js","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"usePanes.js","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { execSync } from 'child_process';
|
|
3
|
+
import chalk from 'chalk';
|
|
3
4
|
import fs from 'fs/promises';
|
|
4
5
|
import path from 'path';
|
|
5
6
|
import { fileURLToPath } from 'url';
|
|
@@ -8,6 +9,7 @@ import React from 'react';
|
|
|
8
9
|
import { createHash } from 'crypto';
|
|
9
10
|
import DmuxApp from './DmuxApp.js';
|
|
10
11
|
import { AutoUpdater } from './AutoUpdater.js';
|
|
12
|
+
import readline from 'readline';
|
|
11
13
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
14
|
class Dmux {
|
|
13
15
|
panesFile;
|
|
@@ -30,16 +32,18 @@ class Dmux {
|
|
|
30
32
|
// tmux converts dots to underscores, so we do it explicitly to avoid mismatches
|
|
31
33
|
const sanitizedProjectIdentifier = projectIdentifier.replace(/\./g, '-');
|
|
32
34
|
this.sessionName = `dmux-${sanitizedProjectIdentifier}`;
|
|
33
|
-
// Store config in
|
|
34
|
-
const
|
|
35
|
-
const configFile = path.join(
|
|
36
|
-
// Always use the
|
|
35
|
+
// Store config in .dmux directory inside project root
|
|
36
|
+
const dmuxDir = path.join(this.projectRoot, '.dmux');
|
|
37
|
+
const configFile = path.join(dmuxDir, 'dmux.config.json');
|
|
38
|
+
// Always use the .dmux directory config location
|
|
37
39
|
this.panesFile = configFile;
|
|
38
40
|
this.settingsFile = configFile; // Same file for all config
|
|
39
41
|
// Initialize auto-updater with config file
|
|
40
42
|
this.autoUpdater = new AutoUpdater(configFile);
|
|
41
43
|
}
|
|
42
44
|
async init() {
|
|
45
|
+
// Ensure .dmux directory exists and is in .gitignore
|
|
46
|
+
await this.ensureDmuxDirectory();
|
|
43
47
|
// Check for migration from old config location
|
|
44
48
|
await this.migrateOldConfig();
|
|
45
49
|
// Initialize config file if it doesn't exist
|
|
@@ -115,7 +119,20 @@ class Dmux {
|
|
|
115
119
|
return Dmux.cachedProjectRoot;
|
|
116
120
|
}
|
|
117
121
|
try {
|
|
118
|
-
//
|
|
122
|
+
// First, try to get the main worktree if we're in a git repository
|
|
123
|
+
// This ensures we always use the main repository root, even when run from a worktree
|
|
124
|
+
const worktreeList = execSync('git worktree list --porcelain', {
|
|
125
|
+
encoding: 'utf-8',
|
|
126
|
+
stdio: 'pipe'
|
|
127
|
+
}).trim();
|
|
128
|
+
// The first line contains the main worktree path
|
|
129
|
+
const mainWorktreeLine = worktreeList.split('\n')[0];
|
|
130
|
+
if (mainWorktreeLine && mainWorktreeLine.startsWith('worktree ')) {
|
|
131
|
+
const mainWorktreePath = mainWorktreeLine.substring(9).trim();
|
|
132
|
+
Dmux.cachedProjectRoot = mainWorktreePath;
|
|
133
|
+
return mainWorktreePath;
|
|
134
|
+
}
|
|
135
|
+
// Fallback to git rev-parse if worktree list fails
|
|
119
136
|
const gitRoot = execSync('git rev-parse --show-toplevel', {
|
|
120
137
|
encoding: 'utf-8',
|
|
121
138
|
stdio: 'pipe'
|
|
@@ -130,18 +147,73 @@ class Dmux {
|
|
|
130
147
|
return cwd;
|
|
131
148
|
}
|
|
132
149
|
}
|
|
150
|
+
async ensureDmuxDirectory() {
|
|
151
|
+
const dmuxDir = path.join(this.projectRoot, '.dmux');
|
|
152
|
+
const worktreesDir = path.join(dmuxDir, 'worktrees');
|
|
153
|
+
// Create .dmux directory if it doesn't exist
|
|
154
|
+
if (!await this.fileExists(dmuxDir)) {
|
|
155
|
+
await fs.mkdir(dmuxDir, { recursive: true });
|
|
156
|
+
}
|
|
157
|
+
// Create worktrees directory if it doesn't exist
|
|
158
|
+
if (!await this.fileExists(worktreesDir)) {
|
|
159
|
+
await fs.mkdir(worktreesDir, { recursive: true });
|
|
160
|
+
}
|
|
161
|
+
// Check if .gitignore exists and if .dmux is in it
|
|
162
|
+
const gitignorePath = path.join(this.projectRoot, '.gitignore');
|
|
163
|
+
if (await this.fileExists(gitignorePath)) {
|
|
164
|
+
const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
|
|
165
|
+
const lines = gitignoreContent.split('\n');
|
|
166
|
+
const hasDmuxEntry = lines.some(line => line.trim() === '.dmux' ||
|
|
167
|
+
line.trim() === '.dmux/' ||
|
|
168
|
+
line.trim() === '/.dmux' ||
|
|
169
|
+
line.trim() === '/.dmux/');
|
|
170
|
+
if (!hasDmuxEntry) {
|
|
171
|
+
// Prompt user to add .dmux to .gitignore
|
|
172
|
+
const shouldAdd = await this.promptUser('The .dmux directory is not in .gitignore. Would you like to add it? (y/n): ');
|
|
173
|
+
if (shouldAdd) {
|
|
174
|
+
// Add .dmux to .gitignore
|
|
175
|
+
const newGitignore = gitignoreContent.endsWith('\n')
|
|
176
|
+
? gitignoreContent + '.dmux/\n'
|
|
177
|
+
: gitignoreContent + '\n.dmux/\n';
|
|
178
|
+
await fs.writeFile(gitignorePath, newGitignore);
|
|
179
|
+
console.log(chalk.green('✓ Added .dmux/ to .gitignore'));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// No .gitignore exists, prompt to create one
|
|
185
|
+
const shouldCreate = await this.promptUser('No .gitignore file found. Would you like to create one with .dmux/ entry? (y/n): ');
|
|
186
|
+
if (shouldCreate) {
|
|
187
|
+
await fs.writeFile(gitignorePath, '.dmux/\n');
|
|
188
|
+
console.log(chalk.green('✓ Created .gitignore with .dmux/ entry'));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async promptUser(question) {
|
|
193
|
+
const rl = readline.createInterface({
|
|
194
|
+
input: process.stdin,
|
|
195
|
+
output: process.stdout
|
|
196
|
+
});
|
|
197
|
+
return new Promise((resolve) => {
|
|
198
|
+
rl.question(question, (answer) => {
|
|
199
|
+
rl.close();
|
|
200
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
}
|
|
133
204
|
async migrateOldConfig() {
|
|
134
205
|
// Check if we're using the new config location
|
|
135
|
-
const
|
|
136
|
-
const newConfigFile = path.join(
|
|
137
|
-
const
|
|
206
|
+
const dmuxDir = path.join(this.projectRoot, '.dmux');
|
|
207
|
+
const newConfigFile = path.join(dmuxDir, 'dmux.config.json');
|
|
208
|
+
const oldParentConfigFile = path.join(path.dirname(this.projectRoot), 'dmux.config.json');
|
|
209
|
+
const homeDmuxDir = path.join(process.env.HOME, '.dmux');
|
|
138
210
|
if (this.panesFile === newConfigFile && !await this.fileExists(newConfigFile)) {
|
|
139
211
|
// Look for old config files to migrate
|
|
140
212
|
const projectHash = createHash('md5').update(this.projectRoot).digest('hex').substring(0, 8);
|
|
141
213
|
const projectIdentifier = `${this.projectName}-${projectHash}`;
|
|
142
|
-
const oldPanesFile = path.join(
|
|
143
|
-
const oldSettingsFile = path.join(
|
|
144
|
-
const oldUpdateSettingsFile = path.join(
|
|
214
|
+
const oldPanesFile = path.join(homeDmuxDir, `${projectIdentifier}-panes.json`);
|
|
215
|
+
const oldSettingsFile = path.join(homeDmuxDir, `${projectIdentifier}-settings.json`);
|
|
216
|
+
const oldUpdateSettingsFile = path.join(homeDmuxDir, 'update-settings.json');
|
|
145
217
|
let panes = [];
|
|
146
218
|
let settings = {};
|
|
147
219
|
let updateSettings = {};
|
|
@@ -169,6 +241,19 @@ class Dmux {
|
|
|
169
241
|
}
|
|
170
242
|
catch { }
|
|
171
243
|
}
|
|
244
|
+
// Check for config from previous parent directory location
|
|
245
|
+
if (await this.fileExists(oldParentConfigFile)) {
|
|
246
|
+
try {
|
|
247
|
+
const oldConfig = JSON.parse(await fs.readFile(oldParentConfigFile, 'utf-8'));
|
|
248
|
+
if (oldConfig.panes)
|
|
249
|
+
panes = oldConfig.panes;
|
|
250
|
+
if (oldConfig.settings)
|
|
251
|
+
settings = oldConfig.settings;
|
|
252
|
+
if (oldConfig.updateSettings)
|
|
253
|
+
updateSettings = oldConfig.updateSettings;
|
|
254
|
+
}
|
|
255
|
+
catch { }
|
|
256
|
+
}
|
|
172
257
|
// If we found old config, migrate it
|
|
173
258
|
if (panes.length > 0 || Object.keys(settings).length > 0 || Object.keys(updateSettings).length > 0) {
|
|
174
259
|
const migratedConfig = {
|
|
@@ -194,6 +279,10 @@ class Dmux {
|
|
|
194
279
|
await fs.unlink(oldUpdateSettingsFile);
|
|
195
280
|
}
|
|
196
281
|
catch { }
|
|
282
|
+
try {
|
|
283
|
+
await fs.unlink(oldParentConfigFile);
|
|
284
|
+
}
|
|
285
|
+
catch { }
|
|
197
286
|
}
|
|
198
287
|
}
|
|
199
288
|
}
|