# v0.2.5 — SVN 작업 사본 패널, SourceTree 스타일 멀티 브랜치 Push, Electron 자동 업데이트 + 한글 IME 복구

릴리즈 일자: 2026-05-05
이전 버전: v0.2.4

## 요약 (TL;DR)

- **SVN 워킹 카피 지원이 opt-in으로 추가**됐습니다. 프로젝트 설정의 **Enable SVN** 체크박스를 켜면 git 패널과 동일한 레이아웃의 SVN 패널(파일 상태 / 히스토리 / 커밋 / Update / Resolve)이 활성화됩니다. 안 켠 사용자는 추가 UI나 `svn` 프로세스를 일절 보지 않습니다.
- **Push 버튼이 SourceTree 스타일 다이얼로그**로 바뀌었습니다. 원격 선택, 여러 브랜치 동시 push, 태그 동기화(`--tags`), 강제 push(`--force-with-lease`), 새 브랜치 upstream 추적까지 GUI에서 종결됩니다.
- **데스크톱 빌드(.exe / .dmg / .AppImage)가 자동 업데이트**됩니다. 다음 릴리즈부터 GitHub Releases를 자동으로 체크하고 백그라운드에서 받아 "지금 재시작 / 나중에"를 묻습니다. v0.2.4 사용자는 이번에 한 번만 수동 설치하면 그 이후로는 자동.
- **Windows EXE에서 한글 IME가 죽는 두 케이스 복구**: (1) 세션을 한 번 사용한 뒤 SessionForm 클릭 시 캐럿이 활성화되지 않던 문제, (2) 잠금화면/스크린세이버 해제 후 모든 입력이 데드되던 문제.

## 주요 변경

### Opt-in SVN 작업 사본 패널 (선택)

git이 아닌 SVN 워킹 카피로 굴러가는 프로젝트(사내 / 게임 업계 등)를 위한 SVN 지원이 추가됐습니다.

- **opt-in per project**: 프로젝트 설정에서 **Enable SVN**을 켜면 그제서야 `.svn/` 검출이 돌아갑니다. SVN을 안 쓰는 사용자는 추가 UI / 라우트 / `svn` 프로세스 스폰을 절대 보지 않음 (기본 OFF).
- **레이아웃은 git 패널과 동일**: 좌측 사이드바에서 **File Status** / **History** 뷰 전환. 파일 상태 뷰는 멀티 셀렉트 + Refresh / Update / Add / Revert / Delete / Resolve 액션 + 작업 사본 diff + Cmd/Ctrl+Enter 커밋 텍스트영역. 히스토리 뷰는 리비전 목록 + 각 리비전의 변경 파일 + 파일별 diff.
- **컴포넌트 재사용**: 서버 측에서 SVN status를 git porcelain 모양으로 정규화하므로 기존 `DiffViewer` / 파일 리스트가 분기 없이 그대로 동작합니다.
- **인코딩 안전**: 모든 svn 호출에 `LC_ALL=en_US.UTF-8` + `--non-interactive` 강제 — 한글/CJK/이모지 파일명도 깨지지 않으며, 자격증명 프롬프트 hang은 차단됨.
- **충돌 해결**: `accept` 옵션 4종(`working` / `mine-full` / `theirs-full` / `base`).
- **svn 미설치 시**: 패널 상단에 "svn 명령어를 설치해주세요" 배너가 뜹니다 (TortoiseSVN의 command-line client 또는 `apt install subversion` / `brew install subversion`).

> SVN 프로젝트는 phase 1에서 단일 공유 워킹 카피만 지원하므로, Todo / Discussion / Session이 자동으로 직렬 실행(`max_concurrent=1`)됩니다. 향후 `.worktrees/<wc>/` checkout copy 격리는 phase-2로 분리.

### SourceTree 스타일 멀티 브랜치 Push 다이얼로그

기존 Push 툴바 버튼은 한 번 누르면 곧장 현재 브랜치를 `origin`으로 밀어내는 단일 동작이라, 다음 시나리오에선 사용자가 다시 터미널로 돌아가야 했습니다 — (1) 태그 동기화, (2) 여러 브랜치를 한 번에 밀기, (3) 처음 push 하는 새 브랜치에 upstream 설정, (4) 강제 push.

이번 버전부터 Push 버튼은 SourceTree와 같은 다이얼로그를 엽니다:

- **원격 선택**: 드롭다운으로 원격(`origin` 등)을 고르고 URL 확인.
- **브랜치 테이블**: 4컬럼 — `Push?` 체크박스 / 로컬 브랜치명 / 원격 브랜치 select(직접 입력 fallback) / `Track?` upstream 토글. 헤더 `Select all`로 전체 on/off.
- **태그 동기화**: `Push all tags`를 켜면 같은 호출에 `--tags` 부착.
- **강제 Push**: `Force push` 토글 — 항상 `--force-with-lease`로 동작해서 stale한 로컬 뷰가 원격을 덮을 수 없습니다. 다른 사람이 같은 브랜치에 push 했으면 거절되며, fetch 후 재시도하라고 안내.
- **새 브랜치 + upstream**: 처음 push 하는 브랜치에 `Track?`를 켜두면 별도의 `git push -u`로 분리 호출되어 upstream이 자동 설정됨.

> 레거시 콜러(post-commit auto-push, 컨텍스트 메뉴 Push 등)는 서버 라우트에서 자동 어댑팅되므로 그대로 동작합니다.

### 데스크톱 자동 업데이트 (electron-updater)

기존 데스크톱 빌드(.exe / .dmg / .AppImage)는 자동 업데이트 경로가 없어서 사용자가 매번 setup을 수동 다운로드해야 했고, stale한 설치본이 조용히 계속 돌아갔습니다. 이번 버전부터:

- **자동 백그라운드 업데이트**: `app.isPackaged`인 데스크톱 빌드만 — 윈도우 생성 5초 후 첫 GitHub Releases 체크(런치 UX 비차단), 백그라운드 다운로드.
- **다운로드 완료 시 프롬프트**: "지금 재시작 / 나중에" 다이얼로그. 나중에 선택 시 다음 종료 시점에 자동 설치(`autoInstallOnAppQuit`).
- **수동 체크**: Help 메뉴에 **업데이트 확인** 항목 추가 — 백그라운드 체크가 실패해도 다시 트리거 가능, 결과를 다이얼로그로 노출.
- **인프라 변경 0**: `release.yml`이 이미 `electron-builder --publish always`로 `latest.yml` + blockmap을 업로드하고 있어 워크플로 변경 없음.

> v0.2.4 사용자는 이번 한 번만 수동으로 setup.exe를 받아 설치하셔야 자동 업데이트 와이어링이 들어갑니다. **그 이후 릴리즈부터는 자동 적용**.

### Windows EXE 한글 IME 복구

세션을 한 번 사용한 뒤 SessionForm 입력 필드를 클릭해도 캐럿이 활성화되지 않던 문제, 그리고 잠금화면/스크린세이버 해제 후 모든 입력이 데드되던 문제를 함께 잡았습니다.

- **세션 사용 후 SessionForm 클릭 무반응**: xterm의 helper textarea가 native HWND 키보드 포커스를 점유한 채 놓아주지 않아, React `autoFocus`로는 DOM 포커스만 옮기고 OS 레벨 캐럿이 따라오지 않던 문제. SessionForm mount 시점에 main 프로세스의 `webContents.focus()`를 IPC로 호출해서 OS 레벨 포커스를 강제 회수, 두 RAF 뒤 타이틀 입력에 포커스를 옮기는 식으로 해결. 폼 사용 동안엔 모든 xterm helper textarea를 포커스 traversal에서 park.
- **잠금화면/스크린세이버 복귀 후 입력 데드**: BrowserWindow는 활성화되지만 webContents로 native 포커스가 돌아오지 않던 문제. 모든 윈도우 활성화 이벤트(`focus` event)에서 `webContents.focus()`를 무조건 다시 호출해 OS-level focus를 routing.

> 두 fix 모두 Windows에 영향, Linux/macOS에는 무관(둘 다 native focus를 자동으로 webContents로 routing).

## 마이그레이션

별도 마이그레이션 작업 불필요. 다만:

- **데스크톱 앱(v0.2.4) 사용자**: 이번 한 번만 GitHub Release의 setup.exe / .dmg / .AppImage를 받아 수동 설치해야 자동 업데이트 와이어링이 들어갑니다. 이후 릴리즈는 자동.
- **SVN 프로젝트 추가하려면**: 프로젝트 설정 → **Enable SVN** 체크. 호스트에 `svn` 바이너리가 없으면 패널이 설치 안내 배너를 띄워줍니다.
- **DB 마이그레이션 자동**: `projects.vcs_type` / `svn_enabled` / `is_svn_wc` 컬럼이 자동 추가됩니다. 기존 git 프로젝트는 `vcs_type='git'`으로 backfill — 별도 작업 불요.

## 설치 / 업데이트

```bash
npm i -g clitrigger@0.2.5
```

데스크탑 앱: GitHub Release 자산의 `.exe` / `.dmg` / `.AppImage` 사용. v0.2.4에서 업그레이드하는 데스크톱 사용자는 이번에 한 번만 수동 설치, 이후엔 자동.

## 전체 커밋 목록

- 06d0e83 WIP(docs): document SVN panel, multi-branch push, and Electron polish
- aa97f07 feat(electron): wire electron-updater for GitHub Releases auto-update
- 4c935e4 fix(svn): add missing is_svn_wc migration entry
- d872ebf feat(svn): add opt-in SVN working-copy panel with file status, log, and commit UI
- 75cda44 fix(electron): refocus webContents on window focus to recover from screensaver
- 6c63ed0 feat: session 8-way resize + Korean IME focus + settings version
- 3b3eddc feat(git): add SourceTree-style multi-branch push dialog

## 관련 문서

- [상세 changelog](../changelog/) — 날짜별 기술 결정 기록 (특히 2026-05-05-1 ~ 2026-05-05-3)
