ccmanager 3.5.1 → 3.5.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/dist/cli.js +3 -2
- package/dist/components/App.d.ts +1 -0
- package/dist/components/App.js +17 -39
- package/dist/components/App.test.js +12 -44
- package/dist/components/Configuration.js +10 -15
- package/dist/components/ConfigureCommand.js +18 -106
- package/dist/components/ConfigureCustomCommand.js +2 -17
- package/dist/components/ConfigureOther.js +5 -23
- package/dist/components/ConfigureOther.test.js +7 -31
- package/dist/components/ConfigureShortcuts.js +4 -31
- package/dist/components/ConfigureStatusHooks.js +5 -44
- package/dist/components/ConfigureStatusHooks.test.js +7 -31
- package/dist/components/ConfigureTimeout.js +2 -14
- package/dist/components/ConfigureWorktree.js +4 -47
- package/dist/components/ConfigureWorktreeHooks.js +5 -37
- package/dist/components/ConfigureWorktreeHooks.test.js +8 -33
- package/dist/components/Confirmation.js +9 -21
- package/dist/components/CustomCommandSummary.js +2 -5
- package/dist/components/DeleteConfirmation.js +10 -47
- package/dist/components/DeleteWorktree.js +14 -42
- package/dist/components/DeleteWorktree.test.js +6 -6
- package/dist/components/LoadingSpinner.js +3 -6
- package/dist/components/LoadingSpinner.test.js +22 -22
- package/dist/components/Menu.d.ts +1 -0
- package/dist/components/Menu.js +10 -42
- package/dist/components/Menu.recent-projects.test.js +8 -8
- package/dist/components/Menu.test.js +10 -10
- package/dist/components/MergeWorktree.js +16 -88
- package/dist/components/MergeWorktree.test.js +5 -5
- package/dist/components/NewWorktree.js +25 -105
- package/dist/components/NewWorktree.test.js +8 -8
- package/dist/components/PresetSelector.js +3 -9
- package/dist/components/ProjectList.js +9 -38
- package/dist/components/ProjectList.recent-projects.test.js +7 -7
- package/dist/components/ProjectList.test.js +37 -37
- package/dist/components/RemoteBranchSelector.js +2 -21
- package/dist/components/RemoteBranchSelector.test.js +8 -8
- package/dist/components/TextInputWrapper.js +2 -2
- package/dist/contexts/ConfigEditorContext.d.ts +1 -1
- package/dist/contexts/ConfigEditorContext.js +3 -2
- package/dist/services/autoApprovalVerifier.js +1 -8
- package/dist/services/bunTerminal.js +41 -136
- package/dist/services/config/configEditor.js +2 -12
- package/dist/services/config/globalConfigManager.js +4 -24
- package/dist/services/config/projectConfigManager.js +3 -18
- package/dist/services/globalSessionOrchestrator.js +3 -12
- package/dist/services/globalSessionOrchestrator.test.js +1 -8
- package/dist/services/projectManager.js +13 -68
- package/dist/services/sessionManager.effect.test.js +9 -37
- package/dist/services/sessionManager.js +3 -18
- package/dist/services/sessionManager.test.js +9 -37
- package/dist/services/shortcutManager.js +7 -13
- package/dist/services/worktreeConfigManager.js +3 -8
- package/dist/services/worktreeService.js +2 -12
- package/dist/types/index.js +4 -12
- package/dist/utils/logger.js +12 -33
- package/dist/utils/mutex.js +3 -18
- package/dist/utils/worktreeUtils.js +3 -3
- package/package.json +13 -13
|
@@ -12,19 +12,9 @@ import { projectConfigManager } from './projectConfigManager.js';
|
|
|
12
12
|
* immediately visible to all components (e.g., shortcutManager, configReader).
|
|
13
13
|
*/
|
|
14
14
|
export class ConfigEditor {
|
|
15
|
+
scope;
|
|
16
|
+
configEditor;
|
|
15
17
|
constructor(scope) {
|
|
16
|
-
Object.defineProperty(this, "scope", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
configurable: true,
|
|
19
|
-
writable: true,
|
|
20
|
-
value: void 0
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(this, "configEditor", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
configurable: true,
|
|
25
|
-
writable: true,
|
|
26
|
-
value: void 0
|
|
27
|
-
});
|
|
28
18
|
this.scope = scope;
|
|
29
19
|
this.configEditor =
|
|
30
20
|
scope === 'global' ? globalConfigManager : projectConfigManager;
|
|
@@ -8,31 +8,11 @@ import { join } from 'path';
|
|
|
8
8
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
9
9
|
import { DEFAULT_SHORTCUTS, } from '../../types/index.js';
|
|
10
10
|
class GlobalConfigManager {
|
|
11
|
+
configPath;
|
|
12
|
+
legacyShortcutsPath;
|
|
13
|
+
configDir;
|
|
14
|
+
config = {};
|
|
11
15
|
constructor() {
|
|
12
|
-
Object.defineProperty(this, "configPath", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
configurable: true,
|
|
15
|
-
writable: true,
|
|
16
|
-
value: void 0
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(this, "legacyShortcutsPath", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true,
|
|
21
|
-
writable: true,
|
|
22
|
-
value: void 0
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(this, "configDir", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
configurable: true,
|
|
27
|
-
writable: true,
|
|
28
|
-
value: void 0
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(this, "config", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
configurable: true,
|
|
33
|
-
writable: true,
|
|
34
|
-
value: {}
|
|
35
|
-
});
|
|
36
16
|
// Determine config directory based on platform
|
|
37
17
|
const homeDir = homedir();
|
|
38
18
|
this.configDir =
|
|
@@ -14,25 +14,10 @@ const PROJECT_CONFIG_FILENAME = '.ccmanager.json';
|
|
|
14
14
|
* Implements IConfigEditor for consistent API with GlobalConfigManager.
|
|
15
15
|
*/
|
|
16
16
|
class ProjectConfigManager {
|
|
17
|
+
gitRoot;
|
|
18
|
+
configPath;
|
|
19
|
+
projectConfig = null;
|
|
17
20
|
constructor(cwd) {
|
|
18
|
-
Object.defineProperty(this, "gitRoot", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
configurable: true,
|
|
21
|
-
writable: true,
|
|
22
|
-
value: void 0
|
|
23
|
-
});
|
|
24
|
-
Object.defineProperty(this, "configPath", {
|
|
25
|
-
enumerable: true,
|
|
26
|
-
configurable: true,
|
|
27
|
-
writable: true,
|
|
28
|
-
value: void 0
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(this, "projectConfig", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
configurable: true,
|
|
33
|
-
writable: true,
|
|
34
|
-
value: null
|
|
35
|
-
});
|
|
36
21
|
// Use git repository root
|
|
37
22
|
this.gitRoot = getGitRepositoryRoot(cwd);
|
|
38
23
|
this.configPath = this.gitRoot
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { SessionManager } from './sessionManager.js';
|
|
2
2
|
class GlobalSessionOrchestrator {
|
|
3
|
+
static instance;
|
|
4
|
+
projectManagers = new Map();
|
|
5
|
+
globalManager;
|
|
3
6
|
constructor() {
|
|
4
|
-
Object.defineProperty(this, "projectManagers", {
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true,
|
|
8
|
-
value: new Map()
|
|
9
|
-
});
|
|
10
|
-
Object.defineProperty(this, "globalManager", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
writable: true,
|
|
14
|
-
value: void 0
|
|
15
|
-
});
|
|
16
7
|
// Create a global session manager for single-project mode
|
|
17
8
|
this.globalManager = new SessionManager();
|
|
18
9
|
}
|
|
@@ -3,14 +3,7 @@ import { globalSessionOrchestrator } from './globalSessionOrchestrator.js';
|
|
|
3
3
|
// Mock SessionManager
|
|
4
4
|
vi.mock('./sessionManager.js', () => {
|
|
5
5
|
class MockSessionManager {
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(this, "sessions", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
configurable: true,
|
|
10
|
-
writable: true,
|
|
11
|
-
value: new Map()
|
|
12
|
-
});
|
|
13
|
-
}
|
|
6
|
+
sessions = new Map();
|
|
14
7
|
getAllSessions() {
|
|
15
8
|
return Array.from(this.sessions.values());
|
|
16
9
|
}
|
|
@@ -7,68 +7,20 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
|
7
7
|
import { Effect } from 'effect';
|
|
8
8
|
import { FileSystemError, ConfigError } from '../types/errors.js';
|
|
9
9
|
export class ProjectManager {
|
|
10
|
+
currentMode;
|
|
11
|
+
currentProject;
|
|
12
|
+
projects = [];
|
|
13
|
+
worktreeServiceCache = new Map();
|
|
14
|
+
projectsDir;
|
|
15
|
+
// Multi-project discovery
|
|
16
|
+
projectCache = new Map();
|
|
17
|
+
discoveryWorkers = 4;
|
|
18
|
+
// Recent projects
|
|
19
|
+
static MAX_RECENT_PROJECTS = 5;
|
|
20
|
+
recentProjects = [];
|
|
21
|
+
dataPath;
|
|
22
|
+
configDir;
|
|
10
23
|
constructor() {
|
|
11
|
-
Object.defineProperty(this, "currentMode", {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
configurable: true,
|
|
14
|
-
writable: true,
|
|
15
|
-
value: void 0
|
|
16
|
-
});
|
|
17
|
-
Object.defineProperty(this, "currentProject", {
|
|
18
|
-
enumerable: true,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true,
|
|
21
|
-
value: void 0
|
|
22
|
-
});
|
|
23
|
-
Object.defineProperty(this, "projects", {
|
|
24
|
-
enumerable: true,
|
|
25
|
-
configurable: true,
|
|
26
|
-
writable: true,
|
|
27
|
-
value: []
|
|
28
|
-
});
|
|
29
|
-
Object.defineProperty(this, "worktreeServiceCache", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true,
|
|
33
|
-
value: new Map()
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(this, "projectsDir", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true,
|
|
39
|
-
value: void 0
|
|
40
|
-
});
|
|
41
|
-
// Multi-project discovery
|
|
42
|
-
Object.defineProperty(this, "projectCache", {
|
|
43
|
-
enumerable: true,
|
|
44
|
-
configurable: true,
|
|
45
|
-
writable: true,
|
|
46
|
-
value: new Map()
|
|
47
|
-
});
|
|
48
|
-
Object.defineProperty(this, "discoveryWorkers", {
|
|
49
|
-
enumerable: true,
|
|
50
|
-
configurable: true,
|
|
51
|
-
writable: true,
|
|
52
|
-
value: 4
|
|
53
|
-
});
|
|
54
|
-
Object.defineProperty(this, "recentProjects", {
|
|
55
|
-
enumerable: true,
|
|
56
|
-
configurable: true,
|
|
57
|
-
writable: true,
|
|
58
|
-
value: []
|
|
59
|
-
});
|
|
60
|
-
Object.defineProperty(this, "dataPath", {
|
|
61
|
-
enumerable: true,
|
|
62
|
-
configurable: true,
|
|
63
|
-
writable: true,
|
|
64
|
-
value: void 0
|
|
65
|
-
});
|
|
66
|
-
Object.defineProperty(this, "configDir", {
|
|
67
|
-
enumerable: true,
|
|
68
|
-
configurable: true,
|
|
69
|
-
writable: true,
|
|
70
|
-
value: void 0
|
|
71
|
-
});
|
|
72
24
|
// Initialize mode based on environment variables
|
|
73
25
|
const multiProjectRoot = process.env[ENV_VARS.MULTI_PROJECT_ROOT];
|
|
74
26
|
this.projectsDir = process.env[ENV_VARS.MULTI_PROJECT_ROOT];
|
|
@@ -554,13 +506,6 @@ export class ProjectManager {
|
|
|
554
506
|
})));
|
|
555
507
|
}
|
|
556
508
|
}
|
|
557
|
-
// Recent projects
|
|
558
|
-
Object.defineProperty(ProjectManager, "MAX_RECENT_PROJECTS", {
|
|
559
|
-
enumerable: true,
|
|
560
|
-
configurable: true,
|
|
561
|
-
writable: true,
|
|
562
|
-
value: 5
|
|
563
|
-
});
|
|
564
509
|
// Create singleton instance
|
|
565
510
|
let _instance = null;
|
|
566
511
|
export const projectManager = {
|
|
@@ -42,43 +42,15 @@ vi.mock('@xterm/headless', () => ({
|
|
|
42
42
|
}));
|
|
43
43
|
// Create a mock IPty class
|
|
44
44
|
class MockPty extends EventEmitter {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
enumerable: true,
|
|
55
|
-
configurable: true,
|
|
56
|
-
writable: true,
|
|
57
|
-
value: vi.fn()
|
|
58
|
-
});
|
|
59
|
-
Object.defineProperty(this, "write", {
|
|
60
|
-
enumerable: true,
|
|
61
|
-
configurable: true,
|
|
62
|
-
writable: true,
|
|
63
|
-
value: vi.fn()
|
|
64
|
-
});
|
|
65
|
-
Object.defineProperty(this, "onData", {
|
|
66
|
-
enumerable: true,
|
|
67
|
-
configurable: true,
|
|
68
|
-
writable: true,
|
|
69
|
-
value: vi.fn((callback) => {
|
|
70
|
-
this.on('data', callback);
|
|
71
|
-
})
|
|
72
|
-
});
|
|
73
|
-
Object.defineProperty(this, "onExit", {
|
|
74
|
-
enumerable: true,
|
|
75
|
-
configurable: true,
|
|
76
|
-
writable: true,
|
|
77
|
-
value: vi.fn((callback) => {
|
|
78
|
-
this.on('exit', callback);
|
|
79
|
-
})
|
|
80
|
-
});
|
|
81
|
-
}
|
|
45
|
+
kill = vi.fn();
|
|
46
|
+
resize = vi.fn();
|
|
47
|
+
write = vi.fn();
|
|
48
|
+
onData = vi.fn((callback) => {
|
|
49
|
+
this.on('data', callback);
|
|
50
|
+
});
|
|
51
|
+
onExit = vi.fn((callback) => {
|
|
52
|
+
this.on('exit', callback);
|
|
53
|
+
});
|
|
82
54
|
}
|
|
83
55
|
describe('SessionManager Effect-based Operations', () => {
|
|
84
56
|
let sessionManager;
|
|
@@ -19,6 +19,9 @@ const { Terminal } = pkg;
|
|
|
19
19
|
const execAsync = promisify(exec);
|
|
20
20
|
const TERMINAL_CONTENT_MAX_LINES = 300;
|
|
21
21
|
export class SessionManager extends EventEmitter {
|
|
22
|
+
sessions;
|
|
23
|
+
waitingWithBottomBorder = new Map();
|
|
24
|
+
busyTimers = new Map();
|
|
22
25
|
async spawn(command, args, worktreePath) {
|
|
23
26
|
const spawnOptions = {
|
|
24
27
|
name: 'xterm-256color',
|
|
@@ -158,24 +161,6 @@ export class SessionManager extends EventEmitter {
|
|
|
158
161
|
}
|
|
159
162
|
constructor() {
|
|
160
163
|
super();
|
|
161
|
-
Object.defineProperty(this, "sessions", {
|
|
162
|
-
enumerable: true,
|
|
163
|
-
configurable: true,
|
|
164
|
-
writable: true,
|
|
165
|
-
value: void 0
|
|
166
|
-
});
|
|
167
|
-
Object.defineProperty(this, "waitingWithBottomBorder", {
|
|
168
|
-
enumerable: true,
|
|
169
|
-
configurable: true,
|
|
170
|
-
writable: true,
|
|
171
|
-
value: new Map()
|
|
172
|
-
});
|
|
173
|
-
Object.defineProperty(this, "busyTimers", {
|
|
174
|
-
enumerable: true,
|
|
175
|
-
configurable: true,
|
|
176
|
-
writable: true,
|
|
177
|
-
value: new Map()
|
|
178
|
-
});
|
|
179
164
|
this.sessions = new Map();
|
|
180
165
|
}
|
|
181
166
|
createSessionId() {
|
|
@@ -63,43 +63,15 @@ vi.mock('./worktreeService.js', () => ({
|
|
|
63
63
|
}));
|
|
64
64
|
// Create a mock IPty class
|
|
65
65
|
class MockPty extends EventEmitter {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
enumerable: true,
|
|
76
|
-
configurable: true,
|
|
77
|
-
writable: true,
|
|
78
|
-
value: vi.fn()
|
|
79
|
-
});
|
|
80
|
-
Object.defineProperty(this, "write", {
|
|
81
|
-
enumerable: true,
|
|
82
|
-
configurable: true,
|
|
83
|
-
writable: true,
|
|
84
|
-
value: vi.fn()
|
|
85
|
-
});
|
|
86
|
-
Object.defineProperty(this, "onData", {
|
|
87
|
-
enumerable: true,
|
|
88
|
-
configurable: true,
|
|
89
|
-
writable: true,
|
|
90
|
-
value: vi.fn((callback) => {
|
|
91
|
-
this.on('data', callback);
|
|
92
|
-
})
|
|
93
|
-
});
|
|
94
|
-
Object.defineProperty(this, "onExit", {
|
|
95
|
-
enumerable: true,
|
|
96
|
-
configurable: true,
|
|
97
|
-
writable: true,
|
|
98
|
-
value: vi.fn((callback) => {
|
|
99
|
-
this.on('exit', callback);
|
|
100
|
-
})
|
|
101
|
-
});
|
|
102
|
-
}
|
|
66
|
+
kill = vi.fn();
|
|
67
|
+
resize = vi.fn();
|
|
68
|
+
write = vi.fn();
|
|
69
|
+
onData = vi.fn((callback) => {
|
|
70
|
+
this.on('data', callback);
|
|
71
|
+
});
|
|
72
|
+
onExit = vi.fn((callback) => {
|
|
73
|
+
this.on('exit', callback);
|
|
74
|
+
});
|
|
103
75
|
}
|
|
104
76
|
describe('SessionManager', () => {
|
|
105
77
|
let sessionManager;
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { configReader } from './config/configReader.js';
|
|
2
2
|
export class ShortcutManager {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{ ctrl: true, key: 'd' },
|
|
11
|
-
{ key: 'escape' }, // Ctrl+[ is equivalent to Escape
|
|
12
|
-
{ ctrl: true, key: '[' },
|
|
13
|
-
]
|
|
14
|
-
});
|
|
15
|
-
}
|
|
3
|
+
reservedKeys = [
|
|
4
|
+
{ ctrl: true, key: 'c' },
|
|
5
|
+
{ ctrl: true, key: 'd' },
|
|
6
|
+
{ key: 'escape' }, // Ctrl+[ is equivalent to Escape
|
|
7
|
+
{ ctrl: true, key: '[' },
|
|
8
|
+
];
|
|
9
|
+
constructor() { }
|
|
16
10
|
validateShortcut(shortcut) {
|
|
17
11
|
if (!shortcut || typeof shortcut !== 'object') {
|
|
18
12
|
return null;
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
import { isWorktreeConfigEnabled } from '../utils/worktreeConfig.js';
|
|
2
2
|
class WorktreeConfigManager {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true,
|
|
8
|
-
value: null
|
|
9
|
-
});
|
|
10
|
-
}
|
|
3
|
+
static instance;
|
|
4
|
+
isExtensionAvailable = null;
|
|
5
|
+
constructor() { }
|
|
11
6
|
static getInstance() {
|
|
12
7
|
if (!WorktreeConfigManager.instance) {
|
|
13
8
|
WorktreeConfigManager.instance = new WorktreeConfigManager();
|
|
@@ -54,19 +54,9 @@ export function getWorktreeLastOpenedTime(worktreePath) {
|
|
|
54
54
|
* ```
|
|
55
55
|
*/
|
|
56
56
|
export class WorktreeService {
|
|
57
|
+
rootPath;
|
|
58
|
+
gitRootPath;
|
|
57
59
|
constructor(rootPath) {
|
|
58
|
-
Object.defineProperty(this, "rootPath", {
|
|
59
|
-
enumerable: true,
|
|
60
|
-
configurable: true,
|
|
61
|
-
writable: true,
|
|
62
|
-
value: void 0
|
|
63
|
-
});
|
|
64
|
-
Object.defineProperty(this, "gitRootPath", {
|
|
65
|
-
enumerable: true,
|
|
66
|
-
configurable: true,
|
|
67
|
-
writable: true,
|
|
68
|
-
value: void 0
|
|
69
|
-
});
|
|
70
60
|
this.rootPath = path.resolve(rootPath || process.cwd());
|
|
71
61
|
// Get the actual git repository root for worktree operations
|
|
72
62
|
this.gitRootPath = this.getGitRepositoryRoot();
|
package/dist/types/index.js
CHANGED
|
@@ -3,22 +3,14 @@ export const DEFAULT_SHORTCUTS = {
|
|
|
3
3
|
cancel: { key: 'escape' },
|
|
4
4
|
};
|
|
5
5
|
export class AmbiguousBranchError extends Error {
|
|
6
|
+
branchName;
|
|
7
|
+
matches;
|
|
6
8
|
constructor(branchName, matches) {
|
|
7
9
|
super(`Ambiguous branch '${branchName}' found in multiple remotes: ${matches
|
|
8
10
|
.map(m => m.fullRef)
|
|
9
11
|
.join(', ')}. Please specify which remote to use.`);
|
|
10
|
-
Object.defineProperty(this, "branchName", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
writable: true,
|
|
14
|
-
value: branchName
|
|
15
|
-
});
|
|
16
|
-
Object.defineProperty(this, "matches", {
|
|
17
|
-
enumerable: true,
|
|
18
|
-
configurable: true,
|
|
19
|
-
writable: true,
|
|
20
|
-
value: matches
|
|
21
|
-
});
|
|
22
12
|
this.name = 'AmbiguousBranchError';
|
|
13
|
+
this.branchName = branchName;
|
|
14
|
+
this.matches = matches;
|
|
23
15
|
}
|
|
24
16
|
}
|
package/dist/utils/logger.js
CHANGED
|
@@ -3,16 +3,15 @@ import * as path from 'path';
|
|
|
3
3
|
import { format } from 'util';
|
|
4
4
|
import os from 'os';
|
|
5
5
|
/**
|
|
6
|
-
* Log level
|
|
6
|
+
* Log level constants for structured logging
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
})(LogLevel || (LogLevel = {}));
|
|
8
|
+
const LogLevel = {
|
|
9
|
+
DEBUG: 'DEBUG',
|
|
10
|
+
INFO: 'INFO',
|
|
11
|
+
WARN: 'WARN',
|
|
12
|
+
ERROR: 'ERROR',
|
|
13
|
+
LOG: 'LOG',
|
|
14
|
+
};
|
|
16
15
|
/**
|
|
17
16
|
* CLI-optimized logger with size management and rotation
|
|
18
17
|
*
|
|
@@ -25,31 +24,11 @@ var LogLevel;
|
|
|
25
24
|
* - Sensitive information filtering on console output
|
|
26
25
|
*/
|
|
27
26
|
class Logger {
|
|
27
|
+
logFile;
|
|
28
|
+
config;
|
|
29
|
+
writeQueue = [];
|
|
30
|
+
isWriting = false;
|
|
28
31
|
constructor(config = {}) {
|
|
29
|
-
Object.defineProperty(this, "logFile", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true,
|
|
33
|
-
value: void 0
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(this, "config", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true,
|
|
39
|
-
value: void 0
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(this, "writeQueue", {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
configurable: true,
|
|
44
|
-
writable: true,
|
|
45
|
-
value: []
|
|
46
|
-
});
|
|
47
|
-
Object.defineProperty(this, "isWriting", {
|
|
48
|
-
enumerable: true,
|
|
49
|
-
configurable: true,
|
|
50
|
-
writable: true,
|
|
51
|
-
value: false
|
|
52
|
-
});
|
|
53
32
|
this.config = {
|
|
54
33
|
maxSizeBytes: config.maxSizeBytes ?? 5 * 1024 * 1024, // 5MB default
|
|
55
34
|
maxRotatedFiles: config.maxRotatedFiles ?? 3,
|
package/dist/utils/mutex.js
CHANGED
|
@@ -3,25 +3,10 @@
|
|
|
3
3
|
* Provides exclusive access to wrapped data through async locking.
|
|
4
4
|
*/
|
|
5
5
|
export class Mutex {
|
|
6
|
+
data;
|
|
7
|
+
locked = false;
|
|
8
|
+
waitQueue = [];
|
|
6
9
|
constructor(initialData) {
|
|
7
|
-
Object.defineProperty(this, "data", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
configurable: true,
|
|
10
|
-
writable: true,
|
|
11
|
-
value: void 0
|
|
12
|
-
});
|
|
13
|
-
Object.defineProperty(this, "locked", {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
configurable: true,
|
|
16
|
-
writable: true,
|
|
17
|
-
value: false
|
|
18
|
-
});
|
|
19
|
-
Object.defineProperty(this, "waitQueue", {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true,
|
|
23
|
-
value: []
|
|
24
|
-
});
|
|
25
10
|
this.data = initialData;
|
|
26
11
|
}
|
|
27
12
|
/**
|
|
@@ -39,14 +39,14 @@ export function generateWorktreeDirectory(projectPath, branchName, pattern) {
|
|
|
39
39
|
case 'branch':
|
|
40
40
|
case 'branch-name':
|
|
41
41
|
// Sanitize branch name for filesystem
|
|
42
|
-
sanitizedBranch
|
|
42
|
+
sanitizedBranch ??= branchName
|
|
43
43
|
.replace(/\//g, '-') // Replace forward slashes with dashes
|
|
44
44
|
.replace(/[^a-zA-Z0-9-_.]+/g, '') // Remove special characters except dash, dot, underscore
|
|
45
45
|
.replace(/^-+|-+$/g, '') // Remove leading/trailing dashes
|
|
46
|
-
.toLowerCase()
|
|
46
|
+
.toLowerCase(); // Convert to lowercase for consistency
|
|
47
47
|
return sanitizedBranch;
|
|
48
48
|
case 'project':
|
|
49
|
-
projectName
|
|
49
|
+
projectName ??= getGitRepositoryName(projectPath);
|
|
50
50
|
return projectName;
|
|
51
51
|
default:
|
|
52
52
|
return placeholder;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ccmanager",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.3",
|
|
4
4
|
"description": "TUI application for managing multiple Claude Code sessions across Git worktrees",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Kodai Kabasawa",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"build:binary:native": "bun run scripts/build-binaries.ts --target=native",
|
|
27
27
|
"build:binary:all": "bun run scripts/build-binaries.ts --target=all",
|
|
28
28
|
"dev": "bun run tsc --watch",
|
|
29
|
-
"start": "bun dist/cli.js",
|
|
29
|
+
"start": "bun --no-env-file dist/cli.js",
|
|
30
30
|
"test": "vitest --run",
|
|
31
31
|
"lint": "bun run eslint src",
|
|
32
32
|
"lint:fix": "bun run eslint src --fix",
|
|
@@ -41,17 +41,17 @@
|
|
|
41
41
|
"bin"
|
|
42
42
|
],
|
|
43
43
|
"optionalDependencies": {
|
|
44
|
-
"@kodaikabasawa/ccmanager-darwin-arm64": "3.5.
|
|
45
|
-
"@kodaikabasawa/ccmanager-darwin-x64": "3.5.
|
|
46
|
-
"@kodaikabasawa/ccmanager-linux-arm64": "3.5.
|
|
47
|
-
"@kodaikabasawa/ccmanager-linux-x64": "3.5.
|
|
48
|
-
"@kodaikabasawa/ccmanager-win32-x64": "3.5.
|
|
44
|
+
"@kodaikabasawa/ccmanager-darwin-arm64": "3.5.3",
|
|
45
|
+
"@kodaikabasawa/ccmanager-darwin-x64": "3.5.3",
|
|
46
|
+
"@kodaikabasawa/ccmanager-linux-arm64": "3.5.3",
|
|
47
|
+
"@kodaikabasawa/ccmanager-linux-x64": "3.5.3",
|
|
48
|
+
"@kodaikabasawa/ccmanager-win32-x64": "3.5.3"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@eslint/js": "^9.28.0",
|
|
52
|
-
"@sindresorhus/tsconfig": "^
|
|
52
|
+
"@sindresorhus/tsconfig": "^8.1.0",
|
|
53
53
|
"@types/bun": "latest",
|
|
54
|
-
"@types/react": "^
|
|
54
|
+
"@types/react": "^19.2.9",
|
|
55
55
|
"@typescript-eslint/eslint-plugin": "^8.33.1",
|
|
56
56
|
"@typescript-eslint/parser": "^8.33.1",
|
|
57
57
|
"@vdemedes/prettier-config": "^2.0.1",
|
|
@@ -70,13 +70,13 @@
|
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"@xterm/headless": "^6.0.0",
|
|
72
72
|
"effect": "^3.18.2",
|
|
73
|
-
"ink": "
|
|
73
|
+
"ink": "^6.6.0",
|
|
74
74
|
"ink-select-input": "^6.0.0",
|
|
75
75
|
"ink-text-input": "^6.0.0",
|
|
76
76
|
"meow": "^14.0.0",
|
|
77
|
-
"react": "
|
|
78
|
-
"react-devtools-core": "^
|
|
79
|
-
"react-dom": "
|
|
77
|
+
"react": "^19.2.3",
|
|
78
|
+
"react-devtools-core": "^6.1.2",
|
|
79
|
+
"react-dom": "^19.2.3",
|
|
80
80
|
"strip-ansi": "^7.1.0"
|
|
81
81
|
}
|
|
82
82
|
}
|