hjworktree-cli 2.3.0 → 2.5.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/.context-snapshots/context-snapshot-20250107-221530.md +95 -0
- package/.context-snapshots/context-snapshot-20260106-211500.md +85 -0
- package/README.md +39 -10
- package/bin/cli.js +64 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/socketHandlers.d.ts.map +1 -1
- package/dist/server/socketHandlers.js +19 -18
- package/dist/server/socketHandlers.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -3
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -24
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/types/index.d.ts +3 -15
- package/dist/shared/types/index.d.ts.map +1 -1
- package/dist/shared/types/index.js +1 -1
- package/dist/shared/types/index.js.map +1 -1
- package/dist/web/assets/index-Dgl6wRHk.css +32 -0
- package/dist/web/assets/index-Jm7djWxU.js +53 -0
- package/dist/web/assets/index-Jm7djWxU.js.map +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +2 -1
- package/server/index.ts +11 -0
- package/server/socketHandlers.ts +24 -23
- package/shared/constants.ts +2 -27
- package/shared/types/index.ts +6 -21
- package/web/src/App.tsx +8 -6
- package/web/src/components/Layout/LeftNavBar.tsx +6 -17
- package/web/src/components/Modals/AddWorktreeModal.tsx +1 -21
- package/web/src/components/Steps/WorktreeStep.tsx +1 -8
- package/web/src/components/Terminal/SplitTerminalView.tsx +64 -0
- package/web/src/components/Terminal/TerminalPanel.tsx +3 -69
- package/web/src/components/Terminal/XTerminal.tsx +4 -6
- package/web/src/stores/useAppStore.ts +77 -35
- package/web/src/styles/global.css +127 -77
- package/dist/web/assets/index-CsixHL-D.css +0 -32
- package/dist/web/assets/index-De6xm4hO.js +0 -53
- package/dist/web/assets/index-De6xm4hO.js.map +0 -1
- package/web/src/components/Setup/AgentSelector.tsx +0 -27
- package/web/src/components/Steps/AgentStep.tsx +0 -20
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Context Snapshot
|
|
2
|
+
|
|
3
|
+
## Session Metadata
|
|
4
|
+
- **Created**: 2025-01-07T22:15:30+09:00
|
|
5
|
+
- **CLI**: Claude Code
|
|
6
|
+
- **Project**: /Users/hyungju-lee/workspace/work/new/utils/hjWorktree-cli
|
|
7
|
+
|
|
8
|
+
## Conversation Summary
|
|
9
|
+
|
|
10
|
+
### User Requests
|
|
11
|
+
1. AI agent 선택 기능 제거 (Codex CLI, Claude Code, Gemini CLI 선택 단계 삭제)
|
|
12
|
+
2. 새로고침 시 세션 중복 버그 수정 (터미널 6개로 늘어나는 문제)
|
|
13
|
+
3. npm publish를 위한 버전 업데이트 및 README.md 수정
|
|
14
|
+
|
|
15
|
+
### Completed Tasks
|
|
16
|
+
1. **AI Agent 선택 기능 제거**
|
|
17
|
+
- 4단계 wizard → 3단계 wizard (Branch → Count → Running)
|
|
18
|
+
- AgentStep.tsx, AgentSelector.tsx 컴포넌트 삭제
|
|
19
|
+
- 관련 타입, 상수, 상태 관리 코드 정리
|
|
20
|
+
- 터미널이 순수 shell로 열리도록 변경
|
|
21
|
+
|
|
22
|
+
2. **세션 중복 버그 수정**
|
|
23
|
+
- `addTerminal()`에 중복 체크 로직 추가
|
|
24
|
+
- `restoreExistingWorktrees()`에 조건 체크 추가
|
|
25
|
+
|
|
26
|
+
3. **버전 업데이트 및 문서화**
|
|
27
|
+
- 버전 2.3.0 → 2.4.0 업데이트
|
|
28
|
+
- README.md에 변경사항 반영
|
|
29
|
+
|
|
30
|
+
### Modified Files
|
|
31
|
+
- `shared/types/index.ts` - AgentId, AgentType 제거, NavigationStep에서 'agent' 제거
|
|
32
|
+
- `shared/constants.ts` - AI_AGENTS 배열 제거, APP_VERSION 업데이트
|
|
33
|
+
- `web/src/App.tsx` - AgentStep import 및 렌더링 제거
|
|
34
|
+
- `web/src/stores/useAppStore.ts` - selectedAgent 상태/액션 제거, 중복 체크 추가
|
|
35
|
+
- `web/src/components/Steps/WorktreeStep.tsx` - agent 표시 제거
|
|
36
|
+
- `web/src/components/Modals/AddWorktreeModal.tsx` - agent 선택 UI 제거
|
|
37
|
+
- `web/src/components/Terminal/SplitTerminalView.tsx` - agent 라벨 제거
|
|
38
|
+
- `web/src/components/Terminal/XTerminal.tsx` - agentType prop 제거
|
|
39
|
+
- `web/src/components/Layout/LeftNavBar.tsx` - agent step 및 표시 제거
|
|
40
|
+
- `server/socketHandlers.ts` - agent 자동실행 제거
|
|
41
|
+
- `web/src/styles/global.css` - agent 관련 CSS 제거
|
|
42
|
+
- `package.json` - 버전 2.4.0
|
|
43
|
+
- `README.md` - 문서 업데이트
|
|
44
|
+
|
|
45
|
+
### Deleted Files
|
|
46
|
+
- `web/src/components/Steps/AgentStep.tsx`
|
|
47
|
+
- `web/src/components/Setup/AgentSelector.tsx`
|
|
48
|
+
|
|
49
|
+
## Technical Context
|
|
50
|
+
|
|
51
|
+
### Key Concepts
|
|
52
|
+
- Git worktree 관리
|
|
53
|
+
- Zustand 상태 관리
|
|
54
|
+
- Socket.IO 실시간 터미널 통신
|
|
55
|
+
- node-pty 터미널 에뮬레이션
|
|
56
|
+
- React 컴포넌트 라이프사이클
|
|
57
|
+
|
|
58
|
+
### Important Changes
|
|
59
|
+
|
|
60
|
+
**web/src/stores/useAppStore.ts**
|
|
61
|
+
```typescript
|
|
62
|
+
// 중복 체크 추가
|
|
63
|
+
addTerminal: (terminal) => set((state) => {
|
|
64
|
+
if (state.terminals.some(t => t.sessionId === terminal.sessionId)) {
|
|
65
|
+
return state;
|
|
66
|
+
}
|
|
67
|
+
return { terminals: [...state.terminals, terminal] };
|
|
68
|
+
}),
|
|
69
|
+
|
|
70
|
+
// 조건 체크 추가
|
|
71
|
+
restoreExistingWorktrees: async () => {
|
|
72
|
+
const { terminals } = get();
|
|
73
|
+
if (terminals.length > 0) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// ...
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**server/socketHandlers.ts**
|
|
81
|
+
- agent 자동 실행 코드 제거
|
|
82
|
+
- 순수 shell만 열리도록 변경
|
|
83
|
+
|
|
84
|
+
### Issues Resolved
|
|
85
|
+
1. **세션 중복 버그**: 새로고침 시 `restoreExistingWorktrees()`가 무조건 실행되어 `addTerminal()`이 중복 호출됨
|
|
86
|
+
- 해결: 두 함수에 중복/조건 체크 추가
|
|
87
|
+
|
|
88
|
+
## Git Commits
|
|
89
|
+
1. `159f6499` - refactor: remove AI agent selection feature
|
|
90
|
+
2. `d382c1f7` - fix: prevent session duplication on page refresh
|
|
91
|
+
3. `8258b0f2` - chore: bump version to 2.4.0 for npm release
|
|
92
|
+
|
|
93
|
+
## Next Steps
|
|
94
|
+
- `npm publish`로 v2.4.0 배포
|
|
95
|
+
- 배포 후 실제 환경에서 테스트
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Context Snapshot
|
|
2
|
+
|
|
3
|
+
## Session Metadata
|
|
4
|
+
- **Created**: 2026-01-06T21:15:00+09:00
|
|
5
|
+
- **CLI**: Claude Code
|
|
6
|
+
- **Project**: /Users/hyungju-lee/workspace/work/new/utils/hjWorktree-cli
|
|
7
|
+
|
|
8
|
+
## Conversation Summary
|
|
9
|
+
|
|
10
|
+
### User Requests
|
|
11
|
+
- macOS에서 글로벌 설치 후 `hjWorktree` 실행 시 `[Error: posix_spawnp failed.]` 에러 해결
|
|
12
|
+
- 원인 분석 및 해결책 구현 (plan mode, context7, ultrathink 사용)
|
|
13
|
+
- 수정사항 커밋
|
|
14
|
+
- npm 배포를 위한 버전 업그레이드 및 README.md 업데이트
|
|
15
|
+
|
|
16
|
+
### Completed Tasks
|
|
17
|
+
1. **문제 분석**: node-pty의 spawn-helper 실행 권한 문제 및 심볼릭 링크 해석 문제 식별
|
|
18
|
+
2. **node-pty 업데이트**: ^1.0.0 → ^1.1.0 (spawn-helper 수정 포함)
|
|
19
|
+
3. **postinstall 스크립트 추가**: macOS/Linux에서 spawn-helper 실행 권한 자동 수정
|
|
20
|
+
4. **경로 정규화 함수 추가**: `normalizePath()` - 심볼릭 링크 해석 (예: `/tmp` → `/private/tmp`)
|
|
21
|
+
5. **환경 변수 정제 함수 추가**: `sanitizeEnv()` - undefined/null 값 필터링
|
|
22
|
+
6. **shell 경로 개선**: `getShell()` - 심볼릭 링크 해석 및 PATH 폴백
|
|
23
|
+
7. **버전 업데이트**: 2.2.0 → 2.3.0
|
|
24
|
+
8. **README.md 업데이트**: v2.3.0 changelog 추가
|
|
25
|
+
|
|
26
|
+
### Modified Files
|
|
27
|
+
- `package.json` - node-pty 버전 업데이트, postinstall 스크립트 추가, 버전 2.3.0
|
|
28
|
+
- `server/socketHandlers.ts` - sanitizeEnv(), normalizePath(), getShell() 개선
|
|
29
|
+
- `scripts/fix-pty-permissions.js` - 새 파일 (spawn-helper 권한 수정)
|
|
30
|
+
- `shared/constants.ts` - APP_VERSION = '2.3.0'
|
|
31
|
+
- `README.md` - v2.3.0 changelog 추가
|
|
32
|
+
|
|
33
|
+
## Technical Context
|
|
34
|
+
|
|
35
|
+
### Key Concepts
|
|
36
|
+
- **posix_spawnp**: POSIX 시스템에서 새 프로세스 생성하는 시스템 콜
|
|
37
|
+
- **node-pty spawn-helper**: macOS에서 PTY 프로세스 spawn에 사용되는 헬퍼 바이너리
|
|
38
|
+
- **심볼릭 링크 해석**: `fs.realpathSync()`로 실제 경로 획득
|
|
39
|
+
- **환경 변수 정제**: TypeScript의 타입 캐스팅은 런타임에서 효과 없음
|
|
40
|
+
|
|
41
|
+
### Important Changes
|
|
42
|
+
|
|
43
|
+
**server/socketHandlers.ts**
|
|
44
|
+
```typescript
|
|
45
|
+
// 새로 추가된 함수들
|
|
46
|
+
function sanitizeEnv(env: NodeJS.ProcessEnv): Record<string, string>
|
|
47
|
+
function normalizePath(targetPath: string): string
|
|
48
|
+
|
|
49
|
+
// getShell() 개선 - 심볼릭 링크 해석 + PATH 폴백
|
|
50
|
+
function getShell(): string {
|
|
51
|
+
if (process.platform === 'win32') return 'powershell.exe';
|
|
52
|
+
const shellPath = process.env.SHELL || '/bin/bash';
|
|
53
|
+
try {
|
|
54
|
+
const resolvedShell = realpathSync(shellPath);
|
|
55
|
+
fs.accessSync(resolvedShell, fs.constants.X_OK);
|
|
56
|
+
return resolvedShell;
|
|
57
|
+
} catch {
|
|
58
|
+
return path.basename(shellPath); // PATH에서 검색하도록 폴백
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// PTY spawn 시 정규화 적용
|
|
63
|
+
const normalizedCwd = normalizePath(worktreePath);
|
|
64
|
+
env: sanitizeEnv({ ...process.env, ... })
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**scripts/fix-pty-permissions.js**
|
|
68
|
+
- macOS/Linux에서 postinstall 시 자동 실행
|
|
69
|
+
- `find node_modules -name "spawn-helper"` 로 모든 spawn-helper 찾아서 chmod 755
|
|
70
|
+
|
|
71
|
+
### Resolved Issues
|
|
72
|
+
- **GitHub Issue #670**: node-pty posix_spawnp failed after calling spawn multiple times
|
|
73
|
+
- **spawn-helper 실행 권한 문제**: npm tarball에 실행 비트 없이 배포되는 문제
|
|
74
|
+
|
|
75
|
+
## Next Steps
|
|
76
|
+
- `npm publish`로 v2.3.0 npm에 배포
|
|
77
|
+
- 글로벌 설치 후 실제 테스트: `npm i -g hjworktree-cli && hjWorktree`
|
|
78
|
+
|
|
79
|
+
## Git Commits Made
|
|
80
|
+
1. `9b80d725` - fix: resolve macOS posix_spawnp failed error for global install
|
|
81
|
+
2. `44ce4009` - chore: bump version to 2.3.0 for npm release
|
|
82
|
+
|
|
83
|
+
## References
|
|
84
|
+
- [node-pty Issue #670](https://github.com/microsoft/node-pty/issues/670)
|
|
85
|
+
- [node-pty Releases](https://github.com/microsoft/node-pty/releases)
|
package/README.md
CHANGED
|
@@ -4,7 +4,8 @@ Web-based git worktree manager for running multiple AI coding agents in parallel
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- **Multiple
|
|
7
|
+
- **Multiple Terminals**: Run multiple terminal sessions in parallel across git worktrees
|
|
8
|
+
- **AI Agent Ready**: Execute any AI coding agent (Claude Code, Codex CLI, Gemini CLI, etc.) directly in terminals
|
|
8
9
|
- **Git Worktree Management**: Create, manage, and delete worktrees with automatic cleanup
|
|
9
10
|
- **Real-time Terminal**: xterm.js terminals with full PTY support via Socket.IO
|
|
10
11
|
- **Session Management**:
|
|
@@ -13,6 +14,7 @@ Web-based git worktree manager for running multiple AI coding agents in parallel
|
|
|
13
14
|
- Individual and bulk session deletion
|
|
14
15
|
- Add new worktrees while sessions are running
|
|
15
16
|
- **Modern Web UI**: React + Zustand state management
|
|
17
|
+
- **Auto Port Detection**: Automatically finds available port when running multiple instances
|
|
16
18
|
|
|
17
19
|
## Installation
|
|
18
20
|
|
|
@@ -33,10 +35,24 @@ hjWorktree
|
|
|
33
35
|
|
|
34
36
|
This opens a web UI in your browser where you can:
|
|
35
37
|
|
|
38
|
+
### Running Multiple Projects
|
|
39
|
+
|
|
40
|
+
You can run `hjWorktree` in multiple projects simultaneously. The CLI automatically detects available ports:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Project A - uses default port 3847
|
|
44
|
+
cd /path/to/project-a && hjWorktree
|
|
45
|
+
|
|
46
|
+
# Project B - automatically uses port 3848
|
|
47
|
+
cd /path/to/project-b && hjWorktree
|
|
48
|
+
|
|
49
|
+
# Or specify a custom port
|
|
50
|
+
PORT=5000 hjWorktree
|
|
51
|
+
```
|
|
52
|
+
|
|
36
53
|
1. **Select Branch**: Choose the base branch for worktrees
|
|
37
|
-
2. **
|
|
38
|
-
3. **
|
|
39
|
-
4. **Run**: Launch terminals with AI agents in each worktree
|
|
54
|
+
2. **Set Worktree Count**: Specify how many parallel worktrees to create
|
|
55
|
+
3. **Run**: Launch terminals in each worktree, then run your preferred AI agent
|
|
40
56
|
|
|
41
57
|
## UI Overview
|
|
42
58
|
|
|
@@ -44,11 +60,10 @@ This opens a web UI in your browser where you can:
|
|
|
44
60
|
+---------------------------+-----------------------------------+
|
|
45
61
|
| SETUP [−] | |
|
|
46
62
|
| ① Branch: main | |
|
|
47
|
-
| ②
|
|
48
|
-
| ③ Count: 3 | |
|
|
63
|
+
| ② Count: 3 | Terminal View |
|
|
49
64
|
+---------------------------+ |
|
|
50
|
-
| SESSIONS |
|
|
51
|
-
| ▼ main (3) |
|
|
65
|
+
| SESSIONS | $ claude |
|
|
66
|
+
| ▼ main (3) | > Ready to help! |
|
|
52
67
|
| ● main-project-1 | |
|
|
53
68
|
| ○ main-project-2 | |
|
|
54
69
|
| ○ main-project-3 | |
|
|
@@ -59,12 +74,16 @@ This opens a web UI in your browser where you can:
|
|
|
59
74
|
|
|
60
75
|
## Supported AI Agents
|
|
61
76
|
|
|
77
|
+
Run any AI coding agent directly in your terminals:
|
|
78
|
+
|
|
62
79
|
| Agent | Command | Description |
|
|
63
80
|
|-------|---------|-------------|
|
|
64
|
-
| Codex CLI | `codex` | OpenAI Codex CLI agent |
|
|
65
81
|
| Claude Code | `claude` | Anthropic Claude Code agent |
|
|
82
|
+
| Codex CLI | `codex` | OpenAI Codex CLI agent |
|
|
66
83
|
| Gemini CLI | `gemini` | Google Gemini CLI agent |
|
|
67
84
|
|
|
85
|
+
Simply type the agent command in any terminal session to start coding with AI assistance.
|
|
86
|
+
|
|
68
87
|
## Development
|
|
69
88
|
|
|
70
89
|
```bash
|
|
@@ -114,6 +133,16 @@ hjWorktree-cli/
|
|
|
114
133
|
|
|
115
134
|
## Changelog
|
|
116
135
|
|
|
136
|
+
### v2.5.0
|
|
137
|
+
- **Auto Port Detection**: Automatically finds available port (range 3847-3856) when default port is in use
|
|
138
|
+
- **Multi-Project Support**: Run hjWorktree in multiple projects simultaneously without port conflicts
|
|
139
|
+
- **Custom Port**: Support `PORT` environment variable for explicit port specification
|
|
140
|
+
|
|
141
|
+
### v2.4.0
|
|
142
|
+
- **Simplified Workflow**: Removed AI agent selection step (3-step wizard: Branch → Count → Run)
|
|
143
|
+
- **Pure Terminal**: Terminals now open as shell, run any AI agent manually (`claude`, `codex`, `gemini`)
|
|
144
|
+
- **Session Fix**: Fixed session duplication bug on page refresh
|
|
145
|
+
|
|
117
146
|
### v2.3.0
|
|
118
147
|
- **macOS Fix**: Resolved `posix_spawnp failed` error on global installation
|
|
119
148
|
- **node-pty Update**: Upgraded from v1.0.0 to v1.1.0 with spawn-helper fix
|
|
@@ -130,7 +159,7 @@ hjWorktree-cli/
|
|
|
130
159
|
|
|
131
160
|
### v2.1.0
|
|
132
161
|
- Improved LNB with session management and always-visible navigation
|
|
133
|
-
- Implemented
|
|
162
|
+
- Implemented wizard navigation with LNB
|
|
134
163
|
- Rebuilt as web-based application
|
|
135
164
|
|
|
136
165
|
## License
|
package/bin/cli.js
CHANGED
|
@@ -4,13 +4,65 @@ import { spawn, execSync } from 'child_process';
|
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import fs from 'fs';
|
|
7
|
+
import getPort, { portNumbers } from 'get-port';
|
|
7
8
|
|
|
8
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
10
|
const __dirname = path.dirname(__filename);
|
|
10
11
|
|
|
11
|
-
const
|
|
12
|
+
const DEFAULT_PORT = 3847;
|
|
13
|
+
const PORT_RANGE_SIZE = 10;
|
|
12
14
|
const CWD = process.cwd();
|
|
13
15
|
|
|
16
|
+
// Check if PORT is explicitly set by user
|
|
17
|
+
const userSpecifiedPort = process.env.PORT;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Find an available port within the configured range.
|
|
21
|
+
* If user explicitly set PORT env var, use that instead.
|
|
22
|
+
*/
|
|
23
|
+
async function findAvailablePort() {
|
|
24
|
+
if (userSpecifiedPort) {
|
|
25
|
+
const port = parseInt(userSpecifiedPort, 10);
|
|
26
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
27
|
+
console.error(`Error: Invalid PORT value "${userSpecifiedPort}". Must be a number between 1 and 65535.`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
port,
|
|
32
|
+
isExplicit: true,
|
|
33
|
+
isDefault: port === DEFAULT_PORT
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const maxPort = DEFAULT_PORT + PORT_RANGE_SIZE - 1;
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
const port = await getPort({
|
|
41
|
+
port: portNumbers(DEFAULT_PORT, maxPort)
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// get-port returns a random port if none in range are available
|
|
45
|
+
if (port < DEFAULT_PORT || port > maxPort) {
|
|
46
|
+
console.error(`Error: No available ports in range ${DEFAULT_PORT}-${maxPort}.`);
|
|
47
|
+
console.error('All ports in the range are currently in use.');
|
|
48
|
+
console.error('');
|
|
49
|
+
console.error('Solutions:');
|
|
50
|
+
console.error(` 1. Free up a port in the range ${DEFAULT_PORT}-${maxPort}`);
|
|
51
|
+
console.error(' 2. Specify a different port: PORT=4000 hjWorktree');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
port,
|
|
57
|
+
isExplicit: false,
|
|
58
|
+
isDefault: port === DEFAULT_PORT
|
|
59
|
+
};
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('Error finding available port:', error.message);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
14
66
|
// Check if it's a git repository
|
|
15
67
|
try {
|
|
16
68
|
execSync('git status', { cwd: CWD, stdio: 'ignore' });
|
|
@@ -20,6 +72,9 @@ try {
|
|
|
20
72
|
process.exit(1);
|
|
21
73
|
}
|
|
22
74
|
|
|
75
|
+
// Find available port
|
|
76
|
+
const { port: PORT, isExplicit, isDefault } = await findAvailablePort();
|
|
77
|
+
|
|
23
78
|
// Find the server entry point
|
|
24
79
|
let serverPath = path.join(__dirname, '../dist/server/index.js');
|
|
25
80
|
|
|
@@ -36,7 +91,14 @@ if (!fs.existsSync(serverPath)) {
|
|
|
36
91
|
|
|
37
92
|
console.log(`Starting hjWorktree CLI...`);
|
|
38
93
|
console.log(`Working directory: ${CWD}`);
|
|
39
|
-
|
|
94
|
+
|
|
95
|
+
if (isExplicit) {
|
|
96
|
+
console.log(`Server port: ${PORT} (user specified)`);
|
|
97
|
+
} else if (isDefault) {
|
|
98
|
+
console.log(`Server port: ${PORT}`);
|
|
99
|
+
} else {
|
|
100
|
+
console.log(`Server port: ${PORT} (default port ${DEFAULT_PORT} was in use)`);
|
|
101
|
+
}
|
|
40
102
|
|
|
41
103
|
// Start the server
|
|
42
104
|
const serverArgs = serverPath.endsWith('.ts')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWnC,QAAA,MAAM,GAAG,6CAAY,CAAC;AACtB,QAAA,MAAM,UAAU,oGAAoB,CAAC;AACrC,QAAA,MAAM,EAAE,+HAKN,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAWnC,QAAA,MAAM,GAAG,6CAAY,CAAC;AACtB,QAAA,MAAM,UAAU,oGAAoB,CAAC;AACrC,QAAA,MAAM,EAAE,+HAKN,CAAC;AAiEH,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -44,6 +44,16 @@ process.on('SIGTERM', () => {
|
|
|
44
44
|
killAllSessions();
|
|
45
45
|
process.exit(0);
|
|
46
46
|
});
|
|
47
|
+
// Handle port in use error (race condition protection)
|
|
48
|
+
httpServer.on('error', (error) => {
|
|
49
|
+
if (error.code === 'EADDRINUSE') {
|
|
50
|
+
console.error(`\nError: Port ${PORT} is already in use.`);
|
|
51
|
+
console.error('This may happen if another process started using the port just now.');
|
|
52
|
+
console.error('Please try again or specify a different port: PORT=4000 hjWorktree');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
});
|
|
47
57
|
// Start server
|
|
48
58
|
httpServer.listen(PORT, () => {
|
|
49
59
|
console.log(`
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socketHandlers.d.ts","sourceRoot":"","sources":["../../server/socketHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"socketHandlers.d.ts","sourceRoot":"","sources":["../../server/socketHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAC;AAkI3C,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAiJ1D;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as pty from 'node-pty';
|
|
2
|
-
import { AI_AGENTS } from '../shared/constants.js';
|
|
3
2
|
import fs, { realpathSync } from 'fs';
|
|
4
3
|
import path from 'path';
|
|
5
4
|
import { promisify } from 'util';
|
|
@@ -82,10 +81,6 @@ async function waitForSpawnInterval() {
|
|
|
82
81
|
lastSpawnTime = Date.now();
|
|
83
82
|
}
|
|
84
83
|
const sessions = new Map();
|
|
85
|
-
function getAgentCommand(agentType) {
|
|
86
|
-
const agent = AI_AGENTS.find(a => a.id === agentType);
|
|
87
|
-
return agent?.command || 'bash';
|
|
88
|
-
}
|
|
89
84
|
function getShell() {
|
|
90
85
|
if (process.platform === 'win32') {
|
|
91
86
|
return 'powershell.exe';
|
|
@@ -106,11 +101,23 @@ export function setupSocketHandlers(io, cwd) {
|
|
|
106
101
|
console.log(`Client connected: ${socket.id}`);
|
|
107
102
|
// Terminal create
|
|
108
103
|
socket.on('terminal:create', async (data) => {
|
|
109
|
-
const { sessionId, worktreePath
|
|
110
|
-
console.log(`Creating terminal session: ${sessionId} at ${worktreePath}
|
|
104
|
+
const { sessionId, worktreePath } = data;
|
|
105
|
+
console.log(`Creating terminal session: ${sessionId} at ${worktreePath}`);
|
|
106
|
+
// Check if session already exists (reattach scenario)
|
|
107
|
+
const existingSession = sessions.get(sessionId);
|
|
108
|
+
if (existingSession && existingSession.pty) {
|
|
109
|
+
console.log(`Reattaching to existing session: ${sessionId}`);
|
|
110
|
+
// Update socketId for the existing session
|
|
111
|
+
existingSession.socketId = socket.id;
|
|
112
|
+
// Re-register output handler for new socket
|
|
113
|
+
existingSession.pty.onData((output) => {
|
|
114
|
+
socket.emit('terminal:output', { sessionId, data: output });
|
|
115
|
+
});
|
|
116
|
+
socket.emit('terminal:created', { sessionId, reattached: true });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
111
119
|
try {
|
|
112
120
|
const shell = getShell();
|
|
113
|
-
const agentCommand = getAgentCommand(agentType);
|
|
114
121
|
// Validate path before spawning
|
|
115
122
|
const pathValidation = await validatePath(worktreePath);
|
|
116
123
|
if (!pathValidation.valid) {
|
|
@@ -140,7 +147,6 @@ export function setupSocketHandlers(io, cwd) {
|
|
|
140
147
|
sessions.set(sessionId, {
|
|
141
148
|
pty: ptyProcess,
|
|
142
149
|
worktreePath,
|
|
143
|
-
agentType,
|
|
144
150
|
socketId: socket.id,
|
|
145
151
|
});
|
|
146
152
|
// Send output to client
|
|
@@ -153,10 +159,6 @@ export function setupSocketHandlers(io, cwd) {
|
|
|
153
159
|
socket.emit('terminal:exit', { sessionId, exitCode });
|
|
154
160
|
sessions.delete(sessionId);
|
|
155
161
|
});
|
|
156
|
-
// Start the AI agent after a short delay
|
|
157
|
-
setTimeout(() => {
|
|
158
|
-
ptyProcess.write(`${agentCommand}\r`);
|
|
159
|
-
}, 500);
|
|
160
162
|
socket.emit('terminal:created', { sessionId });
|
|
161
163
|
}
|
|
162
164
|
catch (error) {
|
|
@@ -197,20 +199,19 @@ export function setupSocketHandlers(io, cwd) {
|
|
|
197
199
|
socket.on('terminal:broadcast', (data) => {
|
|
198
200
|
const socketSessions = Array.from(sessions.entries())
|
|
199
201
|
.filter(([, session]) => session.socketId === socket.id);
|
|
200
|
-
for (const [
|
|
202
|
+
for (const [, session] of socketSessions) {
|
|
201
203
|
session.pty.write(data.data);
|
|
202
204
|
}
|
|
203
205
|
});
|
|
204
206
|
// Disconnect handling
|
|
205
207
|
socket.on('disconnect', () => {
|
|
206
208
|
console.log(`Client disconnected: ${socket.id}`);
|
|
207
|
-
//
|
|
209
|
+
// Keep sessions alive but mark socketId as null for potential reattach
|
|
208
210
|
const socketSessions = Array.from(sessions.entries())
|
|
209
211
|
.filter(([, session]) => session.socketId === socket.id);
|
|
210
212
|
for (const [sessionId, session] of socketSessions) {
|
|
211
|
-
console.log(`
|
|
212
|
-
session.
|
|
213
|
-
sessions.delete(sessionId);
|
|
213
|
+
console.log(`Detaching terminal session (keeping alive): ${sessionId}`);
|
|
214
|
+
session.socketId = null;
|
|
214
215
|
}
|
|
215
216
|
});
|
|
216
217
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socketHandlers.js","sourceRoot":"","sources":["../../server/socketHandlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"socketHandlers.js","sourceRoot":"","sources":["../../server/socketHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type { AgentType } from './types/index.js';
|
|
2
|
-
export declare const AI_AGENTS: AgentType[];
|
|
3
1
|
export declare const MAX_PARALLEL_COUNT = 10;
|
|
4
2
|
export declare const MIN_PARALLEL_COUNT = 1;
|
|
5
3
|
export declare const DEFAULT_PARALLEL_COUNT = 3;
|
|
6
4
|
export declare const BRANCH_POLL_INTERVAL = 5000;
|
|
7
5
|
export declare const APP_NAME = "hjWorktree CLI";
|
|
8
|
-
export declare const APP_VERSION = "2.
|
|
6
|
+
export declare const APP_VERSION = "2.5.0";
|
|
9
7
|
export declare const DEFAULT_PORT = 3847;
|
|
8
|
+
export declare const PORT_RANGE_SIZE = 10;
|
|
10
9
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../shared/constants.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../shared/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,eAAO,MAAM,QAAQ,mBAAmB,CAAC;AACzC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC"}
|
package/dist/shared/constants.js
CHANGED
|
@@ -1,31 +1,9 @@
|
|
|
1
|
-
export const AI_AGENTS = [
|
|
2
|
-
{
|
|
3
|
-
id: 'codex',
|
|
4
|
-
name: 'Codex CLI',
|
|
5
|
-
command: 'codex',
|
|
6
|
-
installCommand: 'npm install -g @openai/codex',
|
|
7
|
-
description: 'OpenAI Codex CLI - AI-powered coding assistant'
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
id: 'claude',
|
|
11
|
-
name: 'Claude Code',
|
|
12
|
-
command: 'claude',
|
|
13
|
-
installCommand: 'npm install -g @anthropic-ai/claude-code',
|
|
14
|
-
description: 'Anthropic Claude Code - Advanced AI coding assistant'
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
id: 'gemini',
|
|
18
|
-
name: 'Gemini CLI',
|
|
19
|
-
command: 'gemini',
|
|
20
|
-
installCommand: 'npm install -g @google/gemini-cli',
|
|
21
|
-
description: 'Google Gemini CLI - Multi-modal AI assistant'
|
|
22
|
-
}
|
|
23
|
-
];
|
|
24
1
|
export const MAX_PARALLEL_COUNT = 10;
|
|
25
2
|
export const MIN_PARALLEL_COUNT = 1;
|
|
26
3
|
export const DEFAULT_PARALLEL_COUNT = 3;
|
|
27
4
|
export const BRANCH_POLL_INTERVAL = 5000; // 5 seconds
|
|
28
5
|
export const APP_NAME = 'hjWorktree CLI';
|
|
29
|
-
export const APP_VERSION = '2.
|
|
6
|
+
export const APP_VERSION = '2.5.0';
|
|
30
7
|
export const DEFAULT_PORT = 3847;
|
|
8
|
+
export const PORT_RANGE_SIZE = 10; // Will try ports 3847-3856
|
|
31
9
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../shared/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../shared/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,YAAY;AAEtD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,2BAA2B"}
|