247-cli 2.23.2 → 2.23.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.
Files changed (55) hide show
  1. package/agent/dist/db/index.d.ts +0 -1
  2. package/agent/dist/db/index.d.ts.map +1 -1
  3. package/agent/dist/db/index.js +62 -381
  4. package/agent/dist/db/index.js.map +1 -1
  5. package/agent/dist/db/schema.d.ts +2 -42
  6. package/agent/dist/db/schema.d.ts.map +1 -1
  7. package/agent/dist/db/schema.js +4 -40
  8. package/agent/dist/db/schema.js.map +1 -1
  9. package/agent/dist/db/sessions.d.ts +0 -33
  10. package/agent/dist/db/sessions.d.ts.map +1 -1
  11. package/agent/dist/db/sessions.js +3 -138
  12. package/agent/dist/db/sessions.js.map +1 -1
  13. package/agent/dist/routes/sessions.d.ts +1 -0
  14. package/agent/dist/routes/sessions.d.ts.map +1 -1
  15. package/agent/dist/routes/sessions.js +3 -309
  16. package/agent/dist/routes/sessions.js.map +1 -1
  17. package/agent/dist/services/index.d.ts +1 -6
  18. package/agent/dist/services/index.d.ts.map +1 -1
  19. package/agent/dist/services/index.js +4 -4
  20. package/agent/dist/services/index.js.map +1 -1
  21. package/agent/dist/status.d.ts +0 -6
  22. package/agent/dist/status.d.ts.map +1 -1
  23. package/agent/dist/status.js +2 -4
  24. package/agent/dist/status.js.map +1 -1
  25. package/agent/dist/terminal.d.ts +0 -11
  26. package/agent/dist/terminal.d.ts.map +1 -1
  27. package/agent/dist/terminal.js +6 -60
  28. package/agent/dist/terminal.js.map +1 -1
  29. package/agent/dist/websocket-handlers.d.ts +1 -0
  30. package/agent/dist/websocket-handlers.d.ts.map +1 -1
  31. package/agent/dist/websocket-handlers.js +2 -49
  32. package/agent/dist/websocket-handlers.js.map +1 -1
  33. package/agent/node_modules/247-shared/dist/types/index.d.ts +0 -85
  34. package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -1
  35. package/agent/node_modules/247-shared/dist/types/index.js +1 -47
  36. package/agent/node_modules/247-shared/dist/types/index.js.map +1 -1
  37. package/agent/node_modules/247-shared/package.json +1 -1
  38. package/dist/index.js +1 -1
  39. package/package.json +1 -1
  40. package/agent/dist/db/history.d.ts +0 -37
  41. package/agent/dist/db/history.d.ts.map +0 -1
  42. package/agent/dist/db/history.js +0 -98
  43. package/agent/dist/db/history.js.map +0 -1
  44. package/agent/dist/services/cleanup.d.ts +0 -45
  45. package/agent/dist/services/cleanup.d.ts.map +0 -1
  46. package/agent/dist/services/cleanup.js +0 -130
  47. package/agent/dist/services/cleanup.js.map +0 -1
  48. package/agent/dist/services/execution.d.ts +0 -53
  49. package/agent/dist/services/execution.d.ts.map +0 -1
  50. package/agent/dist/services/execution.js +0 -75
  51. package/agent/dist/services/execution.js.map +0 -1
  52. package/agent/dist/services/worktree.d.ts +0 -41
  53. package/agent/dist/services/worktree.d.ts.map +0 -1
  54. package/agent/dist/services/worktree.js +0 -139
  55. package/agent/dist/services/worktree.js.map +0 -1
@@ -1,98 +0,0 @@
1
- import { getDatabase } from './index.js';
2
- /**
3
- * Record a status change in history
4
- */
5
- export function recordStatusChange(sessionName, status, attentionReason, event) {
6
- const db = getDatabase();
7
- const now = Date.now();
8
- db.prepare(`
9
- INSERT INTO status_history (session_name, status, attention_reason, event, timestamp)
10
- VALUES (?, ?, ?, ?, ?)
11
- `).run(sessionName, status, attentionReason, event, now);
12
- }
13
- /**
14
- * Get status history for a session
15
- */
16
- export function getSessionHistory(sessionName, limit = 100) {
17
- const db = getDatabase();
18
- return db
19
- .prepare(`
20
- SELECT * FROM status_history
21
- WHERE session_name = ?
22
- ORDER BY timestamp DESC
23
- LIMIT ?
24
- `)
25
- .all(sessionName, limit);
26
- }
27
- /**
28
- * Get recent history across all sessions
29
- */
30
- export function getRecentHistory(limit = 100) {
31
- const db = getDatabase();
32
- return db
33
- .prepare(`
34
- SELECT * FROM status_history
35
- ORDER BY timestamp DESC
36
- LIMIT ?
37
- `)
38
- .all(limit);
39
- }
40
- /**
41
- * Get history within a time range
42
- */
43
- export function getHistoryInRange(startTime, endTime) {
44
- const db = getDatabase();
45
- return db
46
- .prepare(`
47
- SELECT * FROM status_history
48
- WHERE timestamp >= ? AND timestamp <= ?
49
- ORDER BY timestamp DESC
50
- `)
51
- .all(startTime, endTime);
52
- }
53
- /**
54
- * Cleanup old history entries
55
- * Returns number of deleted entries
56
- */
57
- export function cleanupOldHistory(maxAge) {
58
- const db = getDatabase();
59
- const cutoff = Date.now() - maxAge;
60
- const result = db.prepare('DELETE FROM status_history WHERE timestamp < ?').run(cutoff);
61
- if (result.changes > 0) {
62
- console.log(`[DB] Cleaned up ${result.changes} old history entries`);
63
- }
64
- return result.changes;
65
- }
66
- /**
67
- * Get statistics about status history
68
- */
69
- export function getHistoryStats() {
70
- const db = getDatabase();
71
- const total = db.prepare('SELECT COUNT(*) as count FROM status_history').get();
72
- const oldest = db.prepare('SELECT MIN(timestamp) as ts FROM status_history').get();
73
- const newest = db.prepare('SELECT MAX(timestamp) as ts FROM status_history').get();
74
- const byStatus = db
75
- .prepare(`
76
- SELECT status, COUNT(*) as count FROM status_history GROUP BY status
77
- `)
78
- .all();
79
- const entriesByStatus = {};
80
- for (const row of byStatus) {
81
- entriesByStatus[row.status] = row.count;
82
- }
83
- return {
84
- totalEntries: total.count,
85
- oldestEntry: oldest.ts,
86
- newestEntry: newest.ts,
87
- entriesByStatus,
88
- };
89
- }
90
- /**
91
- * Delete all history for a session
92
- */
93
- export function deleteSessionHistory(sessionName) {
94
- const db = getDatabase();
95
- const result = db.prepare('DELETE FROM status_history WHERE session_name = ?').run(sessionName);
96
- return result.changes;
97
- }
98
- //# sourceMappingURL=history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- export interface CleanupConfig {
2
- maxIdleMs: number;
3
- intervalMs: number;
4
- }
5
- export interface CleanupResult {
6
- cleanedSessions: string[];
7
- errors: Array<{
8
- session: string;
9
- error: string;
10
- }>;
11
- }
12
- /**
13
- * CleanupService - Automatically cleans up stale worktrees.
14
- * Runs periodically to remove worktrees from archived sessions.
15
- */
16
- export declare class CleanupService {
17
- private intervalHandle;
18
- private config;
19
- private projectPathResolver;
20
- constructor(projectPathResolver: (project: string) => string, config?: Partial<CleanupConfig>);
21
- /**
22
- * Start the cleanup job.
23
- */
24
- start(): void;
25
- /**
26
- * Stop the cleanup job.
27
- */
28
- stop(): void;
29
- /**
30
- * Run a cleanup cycle.
31
- * Returns info about what was cleaned up.
32
- */
33
- runCleanup(): Promise<CleanupResult>;
34
- /**
35
- * Check if cleanup job is running.
36
- */
37
- isRunning(): boolean;
38
- /**
39
- * Update cleanup configuration.
40
- */
41
- updateConfig(config: Partial<CleanupConfig>): void;
42
- }
43
- export declare function initCleanupService(projectPathResolver: (project: string) => string, config?: Partial<CleanupConfig>): CleanupService;
44
- export declare function getCleanupService(): CleanupService | null;
45
- //# sourceMappingURL=cleanup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/services/cleanup.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,mBAAmB,CAA8B;gBAGvD,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAChD,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IASrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAuBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAgD1C;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;CAanD;AAMD,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAChD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,cAAc,CAGhB;AAED,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD"}
@@ -1,130 +0,0 @@
1
- import { getCleanableWorktreeSessions, clearSessionWorktree } from '../db/sessions.js';
2
- import { worktreeManager } from './worktree.js';
3
- // Default: 72 hours before cleaning up archived session worktrees
4
- const DEFAULT_MAX_IDLE_MS = 72 * 60 * 60 * 1000;
5
- // Default: run cleanup every 30 minutes
6
- const DEFAULT_CLEANUP_INTERVAL_MS = 30 * 60 * 1000;
7
- /**
8
- * CleanupService - Automatically cleans up stale worktrees.
9
- * Runs periodically to remove worktrees from archived sessions.
10
- */
11
- export class CleanupService {
12
- intervalHandle = null;
13
- config;
14
- projectPathResolver;
15
- constructor(projectPathResolver, config = {}) {
16
- this.projectPathResolver = projectPathResolver;
17
- this.config = {
18
- maxIdleMs: config.maxIdleMs ?? DEFAULT_MAX_IDLE_MS,
19
- intervalMs: config.intervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS,
20
- };
21
- }
22
- /**
23
- * Start the cleanup job.
24
- */
25
- start() {
26
- if (this.intervalHandle) {
27
- console.log('[Cleanup] Already running');
28
- return;
29
- }
30
- console.log(`[Cleanup] Starting cleanup job (interval: ${this.config.intervalMs / 1000 / 60}min, max idle: ${this.config.maxIdleMs / 1000 / 60 / 60}h)`);
31
- // Run immediately on start
32
- this.runCleanup().catch((err) => {
33
- console.error('[Cleanup] Initial cleanup failed:', err);
34
- });
35
- // Then run periodically
36
- this.intervalHandle = setInterval(() => {
37
- this.runCleanup().catch((err) => {
38
- console.error('[Cleanup] Periodic cleanup failed:', err);
39
- });
40
- }, this.config.intervalMs);
41
- }
42
- /**
43
- * Stop the cleanup job.
44
- */
45
- stop() {
46
- if (this.intervalHandle) {
47
- clearInterval(this.intervalHandle);
48
- this.intervalHandle = null;
49
- console.log('[Cleanup] Stopped cleanup job');
50
- }
51
- }
52
- /**
53
- * Run a cleanup cycle.
54
- * Returns info about what was cleaned up.
55
- */
56
- async runCleanup() {
57
- const result = {
58
- cleanedSessions: [],
59
- errors: [],
60
- };
61
- try {
62
- // Get archived sessions with worktrees that are old enough to clean
63
- const sessions = getCleanableWorktreeSessions(this.config.maxIdleMs);
64
- if (sessions.length === 0) {
65
- return result;
66
- }
67
- console.log(`[Cleanup] Found ${sessions.length} sessions to clean up`);
68
- for (const session of sessions) {
69
- if (!session.worktree_path)
70
- continue;
71
- try {
72
- const projectPath = this.projectPathResolver(session.project);
73
- // Remove the worktree
74
- const removed = await worktreeManager.remove(projectPath, session.worktree_path);
75
- if (removed) {
76
- // Clear worktree info in DB
77
- clearSessionWorktree(session.name);
78
- result.cleanedSessions.push(session.name);
79
- console.log(`[Cleanup] Cleaned up worktree for session ${session.name}`);
80
- }
81
- }
82
- catch (error) {
83
- const errorMsg = error instanceof Error ? error.message : String(error);
84
- result.errors.push({ session: session.name, error: errorMsg });
85
- console.error(`[Cleanup] Failed to clean up session ${session.name}:`, error);
86
- }
87
- }
88
- if (result.cleanedSessions.length > 0) {
89
- console.log(`[Cleanup] Cleaned up ${result.cleanedSessions.length} worktrees`);
90
- }
91
- }
92
- catch (error) {
93
- console.error('[Cleanup] Error during cleanup:', error);
94
- }
95
- return result;
96
- }
97
- /**
98
- * Check if cleanup job is running.
99
- */
100
- isRunning() {
101
- return this.intervalHandle !== null;
102
- }
103
- /**
104
- * Update cleanup configuration.
105
- */
106
- updateConfig(config) {
107
- if (config.maxIdleMs !== undefined) {
108
- this.config.maxIdleMs = config.maxIdleMs;
109
- }
110
- if (config.intervalMs !== undefined) {
111
- this.config.intervalMs = config.intervalMs;
112
- // Restart with new interval if running
113
- if (this.isRunning()) {
114
- this.stop();
115
- this.start();
116
- }
117
- }
118
- }
119
- }
120
- // Factory function to create cleanup service
121
- // Needs to be initialized with project path resolver
122
- let cleanupService = null;
123
- export function initCleanupService(projectPathResolver, config) {
124
- cleanupService = new CleanupService(projectPathResolver, config);
125
- return cleanupService;
126
- }
127
- export function getCleanupService() {
128
- return cleanupService;
129
- }
130
- //# sourceMappingURL=cleanup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/services/cleanup.ts"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- /**
2
- * ExecutionManager - Manages parallel session execution limits.
3
- * Limits the number of concurrent Claude sessions to prevent resource exhaustion.
4
- */
5
- export interface SessionInfo {
6
- project: string;
7
- worktreePath: string | null;
8
- startedAt: number;
9
- }
10
- export interface CapacityInfo {
11
- max: number;
12
- running: number;
13
- available: number;
14
- }
15
- export declare class ExecutionManager {
16
- private maxParallel;
17
- private running;
18
- constructor(maxParallel?: number);
19
- /**
20
- * Check if a new session can be started.
21
- */
22
- canStart(): boolean;
23
- /**
24
- * Register a running session.
25
- */
26
- register(sessionName: string, project: string, worktreePath: string | null): void;
27
- /**
28
- * Unregister a session when it stops.
29
- */
30
- unregister(sessionName: string): void;
31
- /**
32
- * Get current capacity information.
33
- */
34
- getCapacity(): CapacityInfo;
35
- /**
36
- * Get information about a specific running session.
37
- */
38
- getSession(sessionName: string): SessionInfo | undefined;
39
- /**
40
- * Get all running sessions.
41
- */
42
- getRunningSessions(): Map<string, SessionInfo>;
43
- /**
44
- * Check if a specific session is running.
45
- */
46
- isRunning(sessionName: string): boolean;
47
- /**
48
- * Update the maximum parallel sessions limit.
49
- */
50
- setMaxParallel(max: number): void;
51
- }
52
- export declare const executionManager: ExecutionManager;
53
- //# sourceMappingURL=execution.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/services/execution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA2B;gBAE9B,WAAW,GAAE,MAAU;IAKnC;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAWjF;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQrC;;OAEG;IACH,WAAW,IAAI,YAAY;IAQ3B;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIxD;;OAEG;IACH,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAI9C;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAIlC;AAGD,eAAO,MAAM,gBAAgB,kBAA0B,CAAC"}
@@ -1,75 +0,0 @@
1
- /**
2
- * ExecutionManager - Manages parallel session execution limits.
3
- * Limits the number of concurrent Claude sessions to prevent resource exhaustion.
4
- */
5
- export class ExecutionManager {
6
- maxParallel;
7
- running;
8
- constructor(maxParallel = 3) {
9
- this.maxParallel = maxParallel;
10
- this.running = new Map();
11
- }
12
- /**
13
- * Check if a new session can be started.
14
- */
15
- canStart() {
16
- return this.running.size < this.maxParallel;
17
- }
18
- /**
19
- * Register a running session.
20
- */
21
- register(sessionName, project, worktreePath) {
22
- this.running.set(sessionName, {
23
- project,
24
- worktreePath,
25
- startedAt: Date.now(),
26
- });
27
- console.log(`[Execution] Registered session ${sessionName} (${this.running.size}/${this.maxParallel})`);
28
- }
29
- /**
30
- * Unregister a session when it stops.
31
- */
32
- unregister(sessionName) {
33
- if (this.running.delete(sessionName)) {
34
- console.log(`[Execution] Unregistered session ${sessionName} (${this.running.size}/${this.maxParallel})`);
35
- }
36
- }
37
- /**
38
- * Get current capacity information.
39
- */
40
- getCapacity() {
41
- return {
42
- max: this.maxParallel,
43
- running: this.running.size,
44
- available: this.maxParallel - this.running.size,
45
- };
46
- }
47
- /**
48
- * Get information about a specific running session.
49
- */
50
- getSession(sessionName) {
51
- return this.running.get(sessionName);
52
- }
53
- /**
54
- * Get all running sessions.
55
- */
56
- getRunningSessions() {
57
- return new Map(this.running);
58
- }
59
- /**
60
- * Check if a specific session is running.
61
- */
62
- isRunning(sessionName) {
63
- return this.running.has(sessionName);
64
- }
65
- /**
66
- * Update the maximum parallel sessions limit.
67
- */
68
- setMaxParallel(max) {
69
- this.maxParallel = max;
70
- console.log(`[Execution] Max parallel sessions set to ${max}`);
71
- }
72
- }
73
- // Singleton instance with default max of 3
74
- export const executionManager = new ExecutionManager(3);
75
- //# sourceMappingURL=execution.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/services/execution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,OAAO,gBAAgB;IACnB,WAAW,CAAS;IACpB,OAAO,CAA2B;IAE1C,YAAY,cAAsB,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,WAAmB,EAAE,OAAe,EAAE,YAA2B;QACxE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;YAC5B,OAAO;YACP,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CACT,kCAAkC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,CAC3F,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,WAAmB;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,oCAAoC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,WAAW;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YAC1B,SAAS,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;SAChD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,WAAmB;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,GAAW;QACxB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,4CAA4C,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC"}
@@ -1,41 +0,0 @@
1
- export interface WorktreeInfo {
2
- worktreePath: string;
3
- branch: string;
4
- }
5
- /**
6
- * Manages Git worktrees for session isolation.
7
- * Each session gets its own worktree with a dedicated branch.
8
- */
9
- export declare class WorktreeManager {
10
- private basePath;
11
- constructor(basePath?: string);
12
- /**
13
- * Create a new worktree for a session.
14
- * If branchName is not provided, creates a branch named `session/<sessionName>`.
15
- */
16
- create(projectPath: string, sessionName: string, branchName?: string): Promise<WorktreeInfo>;
17
- /**
18
- * Remove a worktree.
19
- * Uses --force to remove even if there are uncommitted changes.
20
- */
21
- remove(projectPath: string, worktreePath: string): Promise<boolean>;
22
- /**
23
- * List all worktrees for a project.
24
- */
25
- list(projectPath: string): Promise<string[]>;
26
- /**
27
- * Check if a worktree exists for a session.
28
- */
29
- exists(sessionName: string): Promise<boolean>;
30
- /**
31
- * Get the worktree path for a session.
32
- */
33
- getPath(sessionName: string): string;
34
- /**
35
- * Copy Claude configuration files (CLAUDE.md, .claude/) from source to destination.
36
- * These files contain project-specific context that Claude needs.
37
- */
38
- private copyClaudeConfig;
39
- }
40
- export declare const worktreeManager: WorktreeManager;
41
- //# sourceMappingURL=worktree.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/services/worktree.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,GAAE,MAAuB;IAI7C;;;OAGG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAwCxB;;;OAGG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBzE;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBlD;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnD;;OAEG;IACH,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIpC;;;OAGG;YACW,gBAAgB;CAsB/B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -1,139 +0,0 @@
1
- import { execa } from 'execa';
2
- import { existsSync } from 'fs';
3
- import { mkdir, stat, copyFile, cp } from 'fs/promises';
4
- import { join } from 'path';
5
- const WORKTREES_BASE = '/tmp/247-workspaces';
6
- /**
7
- * Manages Git worktrees for session isolation.
8
- * Each session gets its own worktree with a dedicated branch.
9
- */
10
- export class WorktreeManager {
11
- basePath;
12
- constructor(basePath = WORKTREES_BASE) {
13
- this.basePath = basePath;
14
- }
15
- /**
16
- * Create a new worktree for a session.
17
- * If branchName is not provided, creates a branch named `session/<sessionName>`.
18
- */
19
- async create(projectPath, sessionName, branchName) {
20
- const branch = branchName || `session/${sessionName}`;
21
- const worktreePath = join(this.basePath, sessionName);
22
- // Ensure base directory exists
23
- await mkdir(this.basePath, { recursive: true });
24
- // Check if worktree already exists
25
- if (existsSync(worktreePath)) {
26
- console.log(`[Worktree] Worktree already exists at ${worktreePath}`);
27
- return { worktreePath, branch };
28
- }
29
- // Check if branch already exists
30
- const { exitCode } = await execa('git', ['rev-parse', '--verify', branch], {
31
- cwd: projectPath,
32
- reject: false,
33
- });
34
- if (exitCode !== 0) {
35
- // Branch doesn't exist - create new branch with worktree
36
- console.log(`[Worktree] Creating new worktree with branch ${branch}`);
37
- await execa('git', ['worktree', 'add', '-b', branch, worktreePath], {
38
- cwd: projectPath,
39
- });
40
- }
41
- else {
42
- // Branch exists - create worktree on existing branch
43
- console.log(`[Worktree] Creating worktree on existing branch ${branch}`);
44
- await execa('git', ['worktree', 'add', worktreePath, branch], {
45
- cwd: projectPath,
46
- });
47
- }
48
- // Copy Claude configuration files
49
- await this.copyClaudeConfig(projectPath, worktreePath);
50
- console.log(`[Worktree] Created worktree at ${worktreePath} on branch ${branch}`);
51
- return { worktreePath, branch };
52
- }
53
- /**
54
- * Remove a worktree.
55
- * Uses --force to remove even if there are uncommitted changes.
56
- */
57
- async remove(projectPath, worktreePath) {
58
- try {
59
- // First try to prune any stale worktrees
60
- await execa('git', ['worktree', 'prune'], {
61
- cwd: projectPath,
62
- reject: false,
63
- });
64
- // Then remove the specific worktree
65
- await execa('git', ['worktree', 'remove', worktreePath, '--force'], {
66
- cwd: projectPath,
67
- reject: false,
68
- });
69
- console.log(`[Worktree] Removed worktree at ${worktreePath}`);
70
- return true;
71
- }
72
- catch (error) {
73
- console.error(`[Worktree] Failed to remove worktree at ${worktreePath}:`, error);
74
- return false;
75
- }
76
- }
77
- /**
78
- * List all worktrees for a project.
79
- */
80
- async list(projectPath) {
81
- try {
82
- const { stdout } = await execa('git', ['worktree', 'list', '--porcelain'], {
83
- cwd: projectPath,
84
- });
85
- const worktrees = [];
86
- for (const line of stdout.split('\n')) {
87
- if (line.startsWith('worktree ')) {
88
- worktrees.push(line.replace('worktree ', ''));
89
- }
90
- }
91
- return worktrees;
92
- }
93
- catch (error) {
94
- console.error(`[Worktree] Failed to list worktrees:`, error);
95
- return [];
96
- }
97
- }
98
- /**
99
- * Check if a worktree exists for a session.
100
- */
101
- async exists(sessionName) {
102
- const worktreePath = join(this.basePath, sessionName);
103
- return existsSync(worktreePath);
104
- }
105
- /**
106
- * Get the worktree path for a session.
107
- */
108
- getPath(sessionName) {
109
- return join(this.basePath, sessionName);
110
- }
111
- /**
112
- * Copy Claude configuration files (CLAUDE.md, .claude/) from source to destination.
113
- * These files contain project-specific context that Claude needs.
114
- */
115
- async copyClaudeConfig(src, dest) {
116
- const filesToCopy = ['CLAUDE.md', '.claude'];
117
- for (const file of filesToCopy) {
118
- const srcPath = join(src, file);
119
- const destPath = join(dest, file);
120
- try {
121
- const fileStat = await stat(srcPath);
122
- if (fileStat.isDirectory()) {
123
- await cp(srcPath, destPath, { recursive: true });
124
- console.log(`[Worktree] Copied directory ${file}`);
125
- }
126
- else {
127
- await copyFile(srcPath, destPath);
128
- console.log(`[Worktree] Copied file ${file}`);
129
- }
130
- }
131
- catch {
132
- // File doesn't exist, skip silently
133
- }
134
- }
135
- }
136
- }
137
- // Singleton instance
138
- export const worktreeManager = new WorktreeManager();
139
- //# sourceMappingURL=worktree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/services/worktree.ts"],"names":[],"mappings":"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"}