dmux 3.4.3 → 3.5.1
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/actions/implementations/mergeAction.d.ts +3 -1
- package/dist/actions/implementations/mergeAction.d.ts.map +1 -1
- package/dist/actions/implementations/mergeAction.js +38 -4
- package/dist/actions/implementations/mergeAction.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 +22 -0
- package/dist/actions/merge/multiMergeOrchestrator.d.ts.map +1 -0
- package/dist/actions/merge/multiMergeOrchestrator.js +629 -0
- package/dist/actions/merge/multiMergeOrchestrator.js.map +1 -0
- package/dist/actions/merge/types.d.ts +62 -0
- package/dist/actions/merge/types.d.ts.map +1 -0
- package/dist/actions/merge/types.js +7 -0
- package/dist/actions/merge/types.js.map +1 -0
- package/dist/services/PopupManager.d.ts.map +1 -1
- package/dist/services/PopupManager.js +9 -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/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/worktreeDiscovery.d.ts +39 -0
- package/dist/utils/worktreeDiscovery.d.ts.map +1 -0
- package/dist/utils/worktreeDiscovery.js +241 -0
- package/dist/utils/worktreeDiscovery.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Discovery Utilities
|
|
3
|
+
*
|
|
4
|
+
* Scans a directory for nested git worktrees (including the root).
|
|
5
|
+
* Used for multi-merge to find sub-worktrees created by hooks.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import { readdirSync, statSync, existsSync } from 'fs';
|
|
9
|
+
import { join, basename, relative } from 'path';
|
|
10
|
+
import { getCurrentBranch } from './git.js';
|
|
11
|
+
/**
|
|
12
|
+
* Detect all git worktrees within a directory (recursively)
|
|
13
|
+
*
|
|
14
|
+
* @param rootWorktreePath - The root worktree path (dmux pane's worktree)
|
|
15
|
+
* @returns Array of WorktreeInfo objects, ordered by depth (deepest first, root last)
|
|
16
|
+
*/
|
|
17
|
+
export function detectAllWorktrees(rootWorktreePath) {
|
|
18
|
+
const worktrees = [];
|
|
19
|
+
// Add the root worktree first
|
|
20
|
+
const rootInfo = getWorktreeInfo(rootWorktreePath, rootWorktreePath, true);
|
|
21
|
+
if (rootInfo) {
|
|
22
|
+
worktrees.push(rootInfo);
|
|
23
|
+
}
|
|
24
|
+
// Recursively scan for sub-worktrees
|
|
25
|
+
scanForWorktrees(rootWorktreePath, rootWorktreePath, worktrees, 1);
|
|
26
|
+
// Sort by depth descending (deepest first, root last)
|
|
27
|
+
// This ensures sub-worktrees are merged before their parents
|
|
28
|
+
worktrees.sort((a, b) => b.depth - a.depth);
|
|
29
|
+
return worktrees;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Recursively scan a directory for git worktrees
|
|
33
|
+
*/
|
|
34
|
+
function scanForWorktrees(dirPath, rootWorktreePath, worktrees, depth) {
|
|
35
|
+
try {
|
|
36
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
// Skip hidden directories (except we need to check for .git)
|
|
39
|
+
if (entry.name.startsWith('.') && entry.name !== '.git') {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Skip node_modules and other common large directories
|
|
43
|
+
if (entry.name === 'node_modules' || entry.name === 'vendor' || entry.name === '.pnpm') {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const fullPath = join(dirPath, entry.name);
|
|
47
|
+
if (entry.isDirectory()) {
|
|
48
|
+
// Check if this directory is a worktree (has .git file, not directory)
|
|
49
|
+
const gitPath = join(fullPath, '.git');
|
|
50
|
+
if (existsSync(gitPath)) {
|
|
51
|
+
const gitStat = statSync(gitPath);
|
|
52
|
+
if (gitStat.isFile()) {
|
|
53
|
+
// This is a worktree (has .git file pointing to parent)
|
|
54
|
+
const worktreeInfo = getWorktreeInfo(fullPath, rootWorktreePath, false, depth);
|
|
55
|
+
if (worktreeInfo) {
|
|
56
|
+
worktrees.push(worktreeInfo);
|
|
57
|
+
}
|
|
58
|
+
// Continue scanning inside this worktree for nested worktrees
|
|
59
|
+
scanForWorktrees(fullPath, rootWorktreePath, worktrees, depth + 1);
|
|
60
|
+
}
|
|
61
|
+
else if (gitStat.isDirectory()) {
|
|
62
|
+
// This is a full git repository, not a worktree
|
|
63
|
+
// It could still contain worktrees inside it, but we skip the repo itself
|
|
64
|
+
// (it's not a worktree of another repo)
|
|
65
|
+
scanForWorktrees(fullPath, rootWorktreePath, worktrees, depth + 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Regular directory, continue scanning
|
|
70
|
+
scanForWorktrees(fullPath, rootWorktreePath, worktrees, depth);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Permission denied or other errors - skip this directory
|
|
77
|
+
console.error(`[worktreeDiscovery] Error scanning ${dirPath}: ${error}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get detailed information about a worktree
|
|
82
|
+
*/
|
|
83
|
+
function getWorktreeInfo(worktreePath, rootWorktreePath, isRoot, depth = 0) {
|
|
84
|
+
try {
|
|
85
|
+
// Get the parent repo path using git rev-parse
|
|
86
|
+
const parentRepoPath = getWorktreeParentPath(worktreePath);
|
|
87
|
+
if (!parentRepoPath) {
|
|
88
|
+
console.error(`[worktreeDiscovery] Could not determine parent for ${worktreePath}`);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// Get repo name from parent path
|
|
92
|
+
const repoName = getRepoName(parentRepoPath);
|
|
93
|
+
// Get current branch in worktree
|
|
94
|
+
const branch = getCurrentBranch(worktreePath);
|
|
95
|
+
// Get main branch in parent repo
|
|
96
|
+
const mainBranch = getMainBranchForRepo(parentRepoPath);
|
|
97
|
+
// Calculate relative path from root
|
|
98
|
+
const relativePath = isRoot ? '.' : relative(rootWorktreePath, worktreePath);
|
|
99
|
+
return {
|
|
100
|
+
worktreePath,
|
|
101
|
+
parentRepoPath,
|
|
102
|
+
repoName,
|
|
103
|
+
branch,
|
|
104
|
+
mainBranch,
|
|
105
|
+
isRoot,
|
|
106
|
+
relativePath,
|
|
107
|
+
depth,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(`[worktreeDiscovery] Error getting info for ${worktreePath}: ${error}`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the parent repository path for a worktree
|
|
117
|
+
*
|
|
118
|
+
* Uses: git rev-parse --path-format=absolute --git-common-dir
|
|
119
|
+
* Then removes ".git" suffix to get repo root
|
|
120
|
+
*/
|
|
121
|
+
export function getWorktreeParentPath(worktreePath) {
|
|
122
|
+
try {
|
|
123
|
+
// Get the common git directory (the parent repo's .git or .git/worktrees/...)
|
|
124
|
+
const gitCommonDir = execSync('git rev-parse --path-format=absolute --git-common-dir', {
|
|
125
|
+
cwd: worktreePath,
|
|
126
|
+
encoding: 'utf-8',
|
|
127
|
+
stdio: 'pipe',
|
|
128
|
+
}).trim();
|
|
129
|
+
// The git-common-dir returns the .git directory path
|
|
130
|
+
// Remove the ".git" suffix to get the repo root
|
|
131
|
+
// Handle both "/path/to/repo/.git" and "/path/to/repo/.git/worktrees/name"
|
|
132
|
+
let parentPath = gitCommonDir;
|
|
133
|
+
// If it ends with .git, remove it
|
|
134
|
+
if (parentPath.endsWith('.git')) {
|
|
135
|
+
parentPath = parentPath.slice(0, -4); // Remove ".git"
|
|
136
|
+
if (parentPath.endsWith('/')) {
|
|
137
|
+
parentPath = parentPath.slice(0, -1); // Remove trailing slash
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (parentPath.includes('/.git/')) {
|
|
141
|
+
// It's a path like /repo/.git/worktrees/name, extract the repo path
|
|
142
|
+
parentPath = parentPath.split('/.git/')[0];
|
|
143
|
+
}
|
|
144
|
+
// Verify by getting the toplevel
|
|
145
|
+
const topLevel = execSync('git rev-parse --path-format=absolute --show-toplevel', {
|
|
146
|
+
cwd: parentPath,
|
|
147
|
+
encoding: 'utf-8',
|
|
148
|
+
stdio: 'pipe',
|
|
149
|
+
}).trim();
|
|
150
|
+
return topLevel;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(`[worktreeDiscovery] Error getting parent path for ${worktreePath}: ${error}`);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get repository name from path (directory name)
|
|
159
|
+
*/
|
|
160
|
+
export function getRepoName(repoPath) {
|
|
161
|
+
return basename(repoPath);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get main branch for a specific repo (running git commands in that repo's context)
|
|
165
|
+
*/
|
|
166
|
+
function getMainBranchForRepo(repoPath) {
|
|
167
|
+
try {
|
|
168
|
+
// First try to get the default branch from origin
|
|
169
|
+
const originHead = execSync('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null', {
|
|
170
|
+
cwd: repoPath,
|
|
171
|
+
encoding: 'utf8',
|
|
172
|
+
stdio: 'pipe',
|
|
173
|
+
}).trim();
|
|
174
|
+
if (originHead) {
|
|
175
|
+
const match = originHead.match(/refs\/remotes\/origin\/(.+)/);
|
|
176
|
+
if (match) {
|
|
177
|
+
return match[1];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Fallback if origin/HEAD is not set
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
// Check if 'main' branch exists
|
|
186
|
+
execSync('git show-ref --verify --quiet refs/heads/main', {
|
|
187
|
+
cwd: repoPath,
|
|
188
|
+
stdio: 'pipe',
|
|
189
|
+
});
|
|
190
|
+
return 'main';
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// main doesn't exist
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
// Check if 'master' branch exists
|
|
197
|
+
execSync('git show-ref --verify --quiet refs/heads/master', {
|
|
198
|
+
cwd: repoPath,
|
|
199
|
+
stdio: 'pipe',
|
|
200
|
+
});
|
|
201
|
+
return 'master';
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// master doesn't exist
|
|
205
|
+
}
|
|
206
|
+
return 'main'; // Default fallback
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check if a directory is a git worktree (has .git file, not directory)
|
|
210
|
+
*/
|
|
211
|
+
export function isGitWorktree(dirPath) {
|
|
212
|
+
const gitPath = join(dirPath, '.git');
|
|
213
|
+
if (!existsSync(gitPath)) {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
const stat = statSync(gitPath);
|
|
217
|
+
return stat.isFile();
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if a directory is a git repository root (has .git directory)
|
|
221
|
+
*/
|
|
222
|
+
export function isGitRepository(dirPath) {
|
|
223
|
+
const gitPath = join(dirPath, '.git');
|
|
224
|
+
if (!existsSync(gitPath)) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const stat = statSync(gitPath);
|
|
228
|
+
return stat.isDirectory();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Generate a display label for a worktree
|
|
232
|
+
* Format: "repo-name (branch)" or "repo-name (branch) - relative/path"
|
|
233
|
+
*/
|
|
234
|
+
export function getWorktreeDisplayLabel(worktree) {
|
|
235
|
+
const baseLabel = `${worktree.repoName} (${worktree.branch})`;
|
|
236
|
+
if (worktree.isRoot || worktree.relativePath === '.') {
|
|
237
|
+
return baseLabel;
|
|
238
|
+
}
|
|
239
|
+
return `${baseLabel} - ${worktree.relativePath}`;
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=worktreeDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktreeDiscovery.js","sourceRoot":"","sources":["../../src/utils/worktreeDiscovery.ts"],"names":[],"mappings":"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"}
|