# v0.2.10 — Obsidian-style VaultLayout + 세션 cleanup 버그 다발 수정

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

## 요약 (TL;DR)

Files 탭이 Obsidian-style **VaultLayout**(좌 사이드바 + 중앙 에디터 + 우 사이드바)으로 재구성되었고, 사이드바를 ribbon만 남도록 자유롭게 줄이거나 거의 무제한으로 키울 수 있습니다. Vault 에디터/프리뷰 위에서 **Ctrl+휠로 폰트 줌**이 가능해졌고(브라우저 페이지 줌은 자동 차단), 파일/폴더를 **트리 상단에 핀**할 수 있습니다. 세션 쪽에서는 stop 후 cleanup 버튼이 사라지던 버그, 엉뚱한 브랜치를 지울 수 있던 잠재 버그, cleanup 부분 실패 시 핸들을 잃던 문제를 한 번에 정리했습니다. 사이드바의 워크스페이스 항목은 **드래그 앤 드롭으로 재정렬**됩니다.

## 주요 변경

### Files 탭 → Obsidian-style VaultLayout

기존 좌(트리) / 우(미리보기) 2-paned 구조가 좌 사이드바 + 중앙 에디터 + 우 사이드바의 3-column 레이아웃으로 바뀌었습니다. 좌측 사이드바는 파일 탐색기 / 검색 / 태그, 우측 사이드바는 그래프 / 아웃라인 / 백링크 / 아웃고잉 링크 패널을 탭으로 전환할 수 있습니다.

### Vault 사이드바 너비 자유 조절 + Resizer 시각성 강화

- 좌/우 사이드바 너비 clamp를 32~100000px로 통일 — ribbon만 남기거나 화면 거의 끝까지 키우는 게 모두 가능
- Resizer 핸들 두께 4px → 6px, 배경 색 진하게, 드래그 중 accent 색 유지로 어디를 잡고 있는지 명확히 표시

### Vault 에디터/프리뷰 Ctrl+휠 폰트 줌

미리보기 또는 CodeMirror 에디터 위에서 **Ctrl/Cmd + 마우스 휠**로 폰트 사이즈를 8~28px 사이에서 조절할 수 있습니다. 브라우저 페이지 줌은 자동으로 차단되어 레이아웃이 흔들리지 않고, 좌/우 사이드바는 영향을 받지 않습니다. 줌 레벨은 프로젝트별로 localStorage에 저장됩니다.

### Files 탐색기 파일/폴더 핀-투-탑

트리에서 우클릭 → `Pin to top`으로 파일 또는 폴더를 트리 상단의 별도 섹션(amber 핀 아이콘)에 고정할 수 있습니다. 자주 여는 파일을 매번 스크롤로 찾을 필요 없이 최상단에 배치. `Unpin`으로 해제. 프로젝트별 localStorage 영속화.

### Vault 에디터 UX 정리

- 편집 종료 버튼이 `X Cancel` → `✓ Done`으로 라벨/아이콘 변경. 편집 내용은 그대로 보존되고 프리뷰 모드로 돌아가는 동작이라 "완료" 시맨틱이 더 정확
- "Rendered ↔ Source" 토글 제거 — 비편집 상태에서는 항상 rendered 모드로 표시, 소스를 보려면 Edit 버튼으로 진입
- 저장 성공 시 토스트 대신 Save 버튼 옆에 800ms간 인라인 ✓ saved 표시. 저장 실패 토스트는 그대로 유지

### 세션 워크트리 cleanup 버그 다발 수정

세션을 만들고 워크트리에서 한 번 돌린 다음 stop 하면 cleanup 버튼이 사라지던 현상을 해결했습니다. 원인은 세 가지가 얽혀 있었음:

- WS `session:status-changed: running` 이벤트가 `worktree_path`/`branch_name`을 동봉하지 않아 클라이언트 state가 null로 머물던 문제 — 이제 두 필드를 같이 broadcast하고 클라가 머지
- `createWorktree`의 suffix-bumped 실제 브랜치명을 반환하지 않아 DB에 잘못된 브랜치명이 저장되던 문제(예: 실제 `feature/session-7`인데 DB는 `feature/session`) — 함수 시그니처를 `{ worktreePath, branchName }`으로 변경해 정합화. cleanup 시 엉뚱한 브랜치를 지울 잠재 위험 제거
- cleanup의 git 단계가 부분 실패해도 DB 핸들을 null로 박아 사용자가 UI에서 재시도할 수단을 잃던 문제 — git이 *확실히* 성공한 필드만 null 박고, 실패는 alert로 어떤 단계가 실패했는지 사용자에게 노출

또한 `worktree remove --force`가 Windows에서 잠긴 파일 때문에 실패하면 `rmSync` + `prune` 폴백으로 한 번 더 시도, `branch -D`가 "checked out at" 으로 거부되면 prune 후 재시도합니다.

### TUI 대체 버퍼에서 폰트 사이즈 변경 시 스크롤백 보존

Claude / Codex / Gemini가 alternate screen 모드로 진입한 상태에서 세션 폰트 사이즈를 바꾸면 xterm의 `fit()`이 cols/rows를 다시 잡아 TUI 출력이 상단부터 잘리던 문제 수정. alternate 버퍼이면 글리프 크기만 바꾸고 PTY 리사이즈를 건너뛰어 스크롤백을 그대로 유지합니다. 일반 버퍼에서는 기존 reflow 경로 유지.

### 사이드바 워크스페이스 드래그 앤 드롭 재정렬

사이드바의 워크스페이스(프로젝트) 항목을 마우스로 드래그해 순서를 바꿀 수 있습니다. 새 순서는 즉시 localStorage에 영속화됩니다.

## 설치 / 업데이트

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

데스크탑 앱: GitHub Release 자산의 `.exe` / `.dmg` / `.AppImage` 사용.

## 전체 커밋 목록

- c12ff3d WIP(docs): add 2026-05-27 changelogs for session cleanup and vault UX
- e985a2b WIP(vault): add Ctrl+wheel font zoom for preview and editor
- 490bf7e WIP(session): propagate worktree path/branch on status-changed event
- 0b96f70 WIP(session): report cleanup failures and harden worktree/branch ops
- 6d9363f WIP(session): skip fit on alternate buffer to preserve TUI history
- 586f5ee WIP(vault): rename editor Cancel button to Done with check icon
- 813da53 WIP(vault): remove rendered/source view toggle from PreviewPanel
- affba53 WIP(vault): replace save toast with inline saved flash indicator
- 9ddff87 WIP(files): add pin-to-top for files and folders in explorer
- 12d4cb2 WIP(docs): add 2026-05-27 changelog for vault sidebar width UX
- b868f51 WIP(vault): relax sidebar width clamps and inner min-width
- 08b3c15 WIP(vault): make Resizer handle thicker and more visible
- 3927a19 WIP(vault): refactor Files tab into Obsidian-style VaultLayout
- c13b184 feat(sidebar): add drag-and-drop reordering for workspaces

## 관련 문서

- [상세 changelog](../changelog/) — 날짜별 기술 결정 기록
