@yu_robotics/remote-cli 1.0.2 → 1.0.3
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 +50 -0
- package/dist/client/MessageHandler.d.ts +3 -1
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +7 -3
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +26 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/config/ConfigManager.d.ts +6 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +21 -0
- package/dist/config/ConfigManager.js.map +1 -1
- package/dist/executor/ClaudeExecutor.d.ts +5 -1
- package/dist/executor/ClaudeExecutor.d.ts.map +1 -1
- package/dist/executor/ClaudeExecutor.js +16 -1
- package/dist/executor/ClaudeExecutor.js.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.d.ts +4 -5
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.js +35 -83
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/worktree/WorktreeManager.d.ts +119 -0
- package/dist/worktree/WorktreeManager.d.ts.map +1 -0
- package/dist/worktree/WorktreeManager.js +451 -0
- package/dist/worktree/WorktreeManager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorktreeManager = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
/**
|
|
41
|
+
* Git Worktree Manager
|
|
42
|
+
* Manages git worktrees for isolating Claude Code sessions
|
|
43
|
+
*/
|
|
44
|
+
class WorktreeManager {
|
|
45
|
+
constructor() {
|
|
46
|
+
// No parameters needed - will use current branch dynamically
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a new worktree for a session
|
|
50
|
+
* @param mainRepoPath Path to the main repository
|
|
51
|
+
* @param sessionId Session UUID
|
|
52
|
+
* @returns Path to the created worktree
|
|
53
|
+
*/
|
|
54
|
+
async createWorktree(mainRepoPath, sessionId) {
|
|
55
|
+
// Generate session abbreviation (last 8 chars)
|
|
56
|
+
const sessionAbbr = sessionId.slice(-8);
|
|
57
|
+
const branchName = `remote-cli/session-${sessionAbbr}`;
|
|
58
|
+
const worktreesDir = `${mainRepoPath}.worktrees`;
|
|
59
|
+
const worktreePath = path.join(worktreesDir, `session-${sessionAbbr}`);
|
|
60
|
+
// Ensure worktrees directory exists
|
|
61
|
+
if (!fs.existsSync(worktreesDir)) {
|
|
62
|
+
fs.mkdirSync(worktreesDir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
// Check if worktree already exists
|
|
65
|
+
if (fs.existsSync(worktreePath)) {
|
|
66
|
+
// Verify it's actually a worktree
|
|
67
|
+
if (this.isWorktree(worktreePath)) {
|
|
68
|
+
return worktreePath;
|
|
69
|
+
}
|
|
70
|
+
// If it's a regular directory, remove it
|
|
71
|
+
fs.rmSync(worktreePath, { recursive: true, force: true });
|
|
72
|
+
}
|
|
73
|
+
// Prune stale worktree references before creating new one
|
|
74
|
+
await this.pruneWorktreeReferences(mainRepoPath);
|
|
75
|
+
// Get current branch to use as base
|
|
76
|
+
const currentBranch = await this.getCurrentBranch(mainRepoPath);
|
|
77
|
+
const baseBranch = currentBranch || 'HEAD';
|
|
78
|
+
try {
|
|
79
|
+
// Create worktree from current branch
|
|
80
|
+
await this.execGit(['worktree', 'add', '-b', branchName, worktreePath, baseBranch], { cwd: mainRepoPath });
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
// If branch already exists, try without -b flag
|
|
84
|
+
if (error instanceof Error && error.message.includes('already exists')) {
|
|
85
|
+
await this.execGit(['worktree', 'add', worktreePath, branchName], { cwd: mainRepoPath });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Save session file in worktree
|
|
92
|
+
const sessionFile = path.join(worktreePath, '.claude-session');
|
|
93
|
+
const sessionData = {
|
|
94
|
+
id: sessionId,
|
|
95
|
+
savedAt: new Date().toISOString(),
|
|
96
|
+
};
|
|
97
|
+
fs.writeFileSync(sessionFile, JSON.stringify(sessionData, null, 2));
|
|
98
|
+
return worktreePath;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a new worktree with timestamp-based naming
|
|
102
|
+
* @param mainRepoPath Path to the main repository
|
|
103
|
+
* @param timestamp Timestamp string (e.g., "2026-02-17T14-30-00")
|
|
104
|
+
* @returns Path to the created worktree
|
|
105
|
+
*/
|
|
106
|
+
async createWorktreeWithTimestamp(mainRepoPath, timestamp) {
|
|
107
|
+
const branchName = `remote-cli/${timestamp}`;
|
|
108
|
+
const worktreesDir = `${mainRepoPath}.worktrees`;
|
|
109
|
+
const worktreePath = path.join(worktreesDir, timestamp);
|
|
110
|
+
// Ensure worktrees directory exists
|
|
111
|
+
if (!fs.existsSync(worktreesDir)) {
|
|
112
|
+
fs.mkdirSync(worktreesDir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
// Check if worktree already exists
|
|
115
|
+
if (fs.existsSync(worktreePath)) {
|
|
116
|
+
// Verify it's actually a worktree
|
|
117
|
+
if (this.isWorktree(worktreePath)) {
|
|
118
|
+
return worktreePath;
|
|
119
|
+
}
|
|
120
|
+
// If it's a regular directory, remove it
|
|
121
|
+
fs.rmSync(worktreePath, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
// Prune stale worktree references before creating new one
|
|
124
|
+
await this.pruneWorktreeReferences(mainRepoPath);
|
|
125
|
+
// Get current branch to use as base
|
|
126
|
+
const currentBranch = await this.getCurrentBranch(mainRepoPath);
|
|
127
|
+
const baseBranch = currentBranch || 'HEAD';
|
|
128
|
+
try {
|
|
129
|
+
// Create worktree from current branch
|
|
130
|
+
await this.execGit(['worktree', 'add', '-b', branchName, worktreePath, baseBranch], { cwd: mainRepoPath });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
// If branch already exists, try without -b flag
|
|
134
|
+
if (error instanceof Error && error.message.includes('already exists')) {
|
|
135
|
+
await this.execGit(['worktree', 'add', worktreePath, branchName], { cwd: mainRepoPath });
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return worktreePath;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get worktree path for a session
|
|
145
|
+
* @param mainRepoPath Path to the main repository
|
|
146
|
+
* @param sessionId Session UUID
|
|
147
|
+
* @returns Worktree path if exists, null otherwise
|
|
148
|
+
*/
|
|
149
|
+
getWorktreePath(mainRepoPath, sessionId) {
|
|
150
|
+
const sessionAbbr = sessionId.slice(-8);
|
|
151
|
+
const worktreesDir = `${mainRepoPath}.worktrees`;
|
|
152
|
+
const worktreePath = path.join(worktreesDir, `session-${sessionAbbr}`);
|
|
153
|
+
if (fs.existsSync(worktreePath) && this.isWorktree(worktreePath)) {
|
|
154
|
+
return worktreePath;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get existing worktree for session or create new one
|
|
160
|
+
* @param mainRepoPath Path to the main repository
|
|
161
|
+
* @param sessionId Session UUID
|
|
162
|
+
* @returns Path to the worktree
|
|
163
|
+
*/
|
|
164
|
+
async getOrCreateWorktree(mainRepoPath, sessionId) {
|
|
165
|
+
const existingPath = this.getWorktreePath(mainRepoPath, sessionId);
|
|
166
|
+
if (existingPath) {
|
|
167
|
+
return existingPath;
|
|
168
|
+
}
|
|
169
|
+
return await this.createWorktree(mainRepoPath, sessionId);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* List all worktrees for a repository
|
|
173
|
+
* @param mainRepoPath Path to the main repository
|
|
174
|
+
* @returns Array of worktree information
|
|
175
|
+
*/
|
|
176
|
+
async listWorktrees(mainRepoPath) {
|
|
177
|
+
try {
|
|
178
|
+
const output = await this.execGit(['worktree', 'list', '--porcelain'], { cwd: mainRepoPath });
|
|
179
|
+
return this.parseWorktreeList(output);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
// If git worktree list fails, return empty array
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Remove a worktree
|
|
188
|
+
* @param worktreePath Path to the worktree to remove
|
|
189
|
+
* @param mainRepoPath Path to the main repository (for branch deletion)
|
|
190
|
+
*/
|
|
191
|
+
async removeWorktree(worktreePath, mainRepoPath) {
|
|
192
|
+
if (!this.isWorktree(worktreePath)) {
|
|
193
|
+
throw new Error(`Not a worktree: ${worktreePath}`);
|
|
194
|
+
}
|
|
195
|
+
// Get branch name before removing worktree
|
|
196
|
+
const branchName = await this.getWorktreeBranch(worktreePath);
|
|
197
|
+
// Remove worktree
|
|
198
|
+
try {
|
|
199
|
+
// Find main repo path if not provided
|
|
200
|
+
if (!mainRepoPath) {
|
|
201
|
+
mainRepoPath = await this.getMainRepoPath(worktreePath);
|
|
202
|
+
}
|
|
203
|
+
await this.execGit(['worktree', 'remove', '--force', worktreePath], { cwd: mainRepoPath });
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
// If git worktree remove fails, manually delete directory
|
|
207
|
+
if (fs.existsSync(worktreePath)) {
|
|
208
|
+
fs.rmSync(worktreePath, { recursive: true, force: true });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Delete branch if it's a remote-cli session branch
|
|
212
|
+
if (branchName && branchName.startsWith('remote-cli/session-') && mainRepoPath) {
|
|
213
|
+
try {
|
|
214
|
+
await this.execGit(['branch', '-D', branchName], { cwd: mainRepoPath });
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Ignore errors if branch doesn't exist or can't be deleted
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Prune stale references
|
|
221
|
+
if (mainRepoPath) {
|
|
222
|
+
await this.pruneWorktreeReferences(mainRepoPath);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if a directory is a git worktree
|
|
227
|
+
* @param dirPath Directory path to check
|
|
228
|
+
* @returns true if directory is a worktree
|
|
229
|
+
*/
|
|
230
|
+
isWorktree(dirPath) {
|
|
231
|
+
const gitFile = path.join(dirPath, '.git');
|
|
232
|
+
if (!fs.existsSync(gitFile)) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
const stats = fs.statSync(gitFile);
|
|
236
|
+
if (stats.isFile()) {
|
|
237
|
+
// Worktrees have .git as a file containing "gitdir: ..."
|
|
238
|
+
const content = fs.readFileSync(gitFile, 'utf-8');
|
|
239
|
+
return content.trim().startsWith('gitdir:');
|
|
240
|
+
}
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check if a directory is a git repository
|
|
245
|
+
* @param dirPath Directory path to check
|
|
246
|
+
* @returns true if directory contains .git
|
|
247
|
+
*/
|
|
248
|
+
isGitRepository(dirPath) {
|
|
249
|
+
const gitPath = path.join(dirPath, '.git');
|
|
250
|
+
return fs.existsSync(gitPath);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Prune stale worktrees older than specified age
|
|
254
|
+
* @param mainRepoPath Path to the main repository
|
|
255
|
+
* @param maxAgeDays Maximum age in days (default: 7)
|
|
256
|
+
* @returns Number of worktrees removed
|
|
257
|
+
*/
|
|
258
|
+
async pruneStaleWorktrees(mainRepoPath, maxAgeDays = 7) {
|
|
259
|
+
const worktrees = await this.listWorktrees(mainRepoPath);
|
|
260
|
+
const now = Date.now();
|
|
261
|
+
const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
|
|
262
|
+
let removedCount = 0;
|
|
263
|
+
for (const worktree of worktrees) {
|
|
264
|
+
// Skip main worktree
|
|
265
|
+
if (worktree.isMain) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
// Check if session file exists and its modification time
|
|
269
|
+
const sessionFile = path.join(worktree.path, '.claude-session');
|
|
270
|
+
if (fs.existsSync(sessionFile)) {
|
|
271
|
+
const stats = fs.statSync(sessionFile);
|
|
272
|
+
const age = now - stats.mtime.getTime();
|
|
273
|
+
if (age > maxAgeMs) {
|
|
274
|
+
try {
|
|
275
|
+
await this.removeWorktree(worktree.path, mainRepoPath);
|
|
276
|
+
removedCount++;
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
console.error(`Failed to remove stale worktree ${worktree.path}:`, error);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return removedCount;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get main repository path from a worktree path
|
|
288
|
+
* @param worktreePath Path to the worktree
|
|
289
|
+
* @returns Main repository path
|
|
290
|
+
*/
|
|
291
|
+
async getMainRepoPath(worktreePath) {
|
|
292
|
+
// Parse .git file to find main repo
|
|
293
|
+
const gitFile = path.join(worktreePath, '.git');
|
|
294
|
+
if (!fs.existsSync(gitFile)) {
|
|
295
|
+
throw new Error(`Not a git worktree: ${worktreePath}`);
|
|
296
|
+
}
|
|
297
|
+
const content = fs.readFileSync(gitFile, 'utf-8');
|
|
298
|
+
const match = content.match(/gitdir:\s*(.+)/);
|
|
299
|
+
if (!match) {
|
|
300
|
+
throw new Error(`Invalid .git file format: ${worktreePath}`);
|
|
301
|
+
}
|
|
302
|
+
// The gitdir points to .git/worktrees/<name>
|
|
303
|
+
// We need to get the parent .git directory
|
|
304
|
+
const gitdir = match[1].trim();
|
|
305
|
+
const absoluteGitdir = path.isAbsolute(gitdir) ? gitdir : path.resolve(worktreePath, gitdir);
|
|
306
|
+
// Remove /worktrees/<name> to get main .git path
|
|
307
|
+
const mainGitPath = absoluteGitdir.replace(/\/worktrees\/[^/]+$/, '');
|
|
308
|
+
// Main repo is the parent of .git
|
|
309
|
+
return path.dirname(mainGitPath);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get current branch name of a repository
|
|
313
|
+
* @param repoPath Path to the repository
|
|
314
|
+
* @returns Branch name or null if detached HEAD
|
|
315
|
+
*/
|
|
316
|
+
async getCurrentBranch(repoPath) {
|
|
317
|
+
try {
|
|
318
|
+
const result = await this.execGit(['branch', '--show-current'], { cwd: repoPath });
|
|
319
|
+
const branch = result.trim();
|
|
320
|
+
return branch || null;
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Prune stale worktree references
|
|
328
|
+
* @param mainRepoPath Path to the main repository
|
|
329
|
+
*/
|
|
330
|
+
async pruneWorktreeReferences(mainRepoPath) {
|
|
331
|
+
try {
|
|
332
|
+
await this.execGit(['worktree', 'prune'], { cwd: mainRepoPath });
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// Ignore errors
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get branch name of a worktree
|
|
340
|
+
* @param worktreePath Path to the worktree
|
|
341
|
+
* @returns Branch name or null if not found
|
|
342
|
+
*/
|
|
343
|
+
async getWorktreeBranch(worktreePath) {
|
|
344
|
+
try {
|
|
345
|
+
const output = await this.execGit(['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: worktreePath });
|
|
346
|
+
return output.trim();
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Parse git worktree list --porcelain output
|
|
354
|
+
* @param output Output from git worktree list --porcelain
|
|
355
|
+
* @returns Array of worktree information
|
|
356
|
+
*/
|
|
357
|
+
parseWorktreeList(output) {
|
|
358
|
+
const worktrees = [];
|
|
359
|
+
const lines = output.trim().split('\n');
|
|
360
|
+
let current = {};
|
|
361
|
+
for (const line of lines) {
|
|
362
|
+
if (line.startsWith('worktree ')) {
|
|
363
|
+
// Save previous worktree if exists
|
|
364
|
+
if (current.path) {
|
|
365
|
+
worktrees.push(this.finalizeWorktreeInfo(current));
|
|
366
|
+
}
|
|
367
|
+
current = { path: line.substring(9), isMain: false };
|
|
368
|
+
}
|
|
369
|
+
else if (line.startsWith('HEAD ')) {
|
|
370
|
+
current.commit = line.substring(5);
|
|
371
|
+
}
|
|
372
|
+
else if (line.startsWith('branch ')) {
|
|
373
|
+
current.branch = line.substring(7).replace('refs/heads/', '');
|
|
374
|
+
}
|
|
375
|
+
else if (line === 'bare') {
|
|
376
|
+
// Bare repository (not a working tree)
|
|
377
|
+
current.isMain = true;
|
|
378
|
+
}
|
|
379
|
+
else if (line === '') {
|
|
380
|
+
// Empty line separates worktrees
|
|
381
|
+
if (current.path) {
|
|
382
|
+
worktrees.push(this.finalizeWorktreeInfo(current));
|
|
383
|
+
}
|
|
384
|
+
current = {};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Add last worktree if exists
|
|
388
|
+
if (current.path) {
|
|
389
|
+
worktrees.push(this.finalizeWorktreeInfo(current));
|
|
390
|
+
}
|
|
391
|
+
return worktrees;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Finalize worktree info by extracting session ID
|
|
395
|
+
* @param info Partial worktree info
|
|
396
|
+
* @returns Complete worktree info
|
|
397
|
+
*/
|
|
398
|
+
finalizeWorktreeInfo(info) {
|
|
399
|
+
// Extract session ID from path
|
|
400
|
+
const match = info.path.match(/session-([a-f0-9]{8})$/);
|
|
401
|
+
const sessionId = match ? match[1] : null;
|
|
402
|
+
// Detect main worktree (first in list, no session ID in path)
|
|
403
|
+
const isMain = info.isMain || !sessionId;
|
|
404
|
+
return {
|
|
405
|
+
path: info.path,
|
|
406
|
+
branch: info.branch || 'unknown',
|
|
407
|
+
commit: info.commit || 'unknown',
|
|
408
|
+
sessionId,
|
|
409
|
+
isMain,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Execute git command
|
|
414
|
+
* @param args Git command arguments
|
|
415
|
+
* @param options Spawn options
|
|
416
|
+
* @returns Command stdout
|
|
417
|
+
*/
|
|
418
|
+
async execGit(args, options) {
|
|
419
|
+
return new Promise((resolve, reject) => {
|
|
420
|
+
const child = (0, child_process_1.spawn)('git', args, {
|
|
421
|
+
...options,
|
|
422
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
423
|
+
});
|
|
424
|
+
let stdout = '';
|
|
425
|
+
let stderr = '';
|
|
426
|
+
if (child.stdout) {
|
|
427
|
+
child.stdout.on('data', (data) => {
|
|
428
|
+
stdout += data.toString();
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
if (child.stderr) {
|
|
432
|
+
child.stderr.on('data', (data) => {
|
|
433
|
+
stderr += data.toString();
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
child.on('exit', (code) => {
|
|
437
|
+
if (code === 0) {
|
|
438
|
+
resolve(stdout);
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
reject(new Error(`Git command failed (exit ${code}): ${stderr}`));
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
child.on('error', (error) => {
|
|
445
|
+
reject(error);
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
exports.WorktreeManager = WorktreeManager;
|
|
451
|
+
//# sourceMappingURL=WorktreeManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorktreeManager.js","sourceRoot":"","sources":["../../src/worktree/WorktreeManager.ts"],"names":[],"mappings":"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"}
|