# v0.2.3 — 모던 Windows 폴더 피커, Windows 샌드박스 권한 매칭 fix, 세션 리사이즈 후 스크롤백 정상화

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

## 요약 (TL;DR)

- **새 프로젝트 모달의 폴더 피커가 Windows에서 모던 다이얼로그로 교체**됐습니다 — 주소창 붙여넣기, 빵부스러기 네비게이션, 빠른 액세스 사이드바, 폴더 검색 모두 지원. 이전엔 Win98 시절 트리 전용 다이얼로그였습니다.
- **Windows + 샌드박스 strict 모드에서 Claude가 Edit/Write 권한 매칭에 실패하던 문제 수정** — 워크트리 경로 separator 불일치로 자동 작업이 Bash 워크어라운드로 폴백하다 턴을 소진하던 버그.
- **세션 플로팅 창을 리사이즈한 뒤 스크롤백이 깨져 보이던 문제 수정** — xterm DOM이 옛 Y 좌표를 유지해 스크롤바를 드래그하면 행이 어긋나 그려졌습니다.
- macOS 폴더 피커도 함께 손봤습니다 (AppleScript 인젝션 가드, default location 신뢰성).

## 주요 변경

### 새 프로젝트 폴더 피커: Windows 모던 다이얼로그로 교체

이전 폴더 피커는 Windows에서 WinForms `FolderBrowserDialog` (Win98 시절의 트리 전용 다이얼로그) 였습니다. 주소창도, 빵부스러기 네비게이션도, 빠른 액세스 사이드바도, 폴더 검색도 없어서 깊은 경로를 고를 때 매우 불편했습니다.

이번 버전부터:

- **Vista 이후의 Common Item Dialog (`IFileOpenDialog`) COM 피커**를 사용합니다 — 파일 탐색기가 쓰는 그 모던 피커
- 주소창에 경로를 직접 붙여넣을 수 있고, 빵부스러기 클릭 네비게이션, 빠른 액세스 사이드바, 폴더 검색 전부 동작합니다
- 한글 경로 왕복(round-trip) 보장 — 임시 PowerShell 스크립트에 UTF-8 BOM + `[Console]::OutputEncoding=UTF8` 강제

macOS도 함께 정비했습니다:

- AppleScript 문자열 인젝션 가드 (`initialDir`의 `\`/`"` escape)
- `default location`을 `(POSIX file "...")`로 감싸 macOS 버전별 동작 일관성 확보
- `with prompt "폴더 선택"` 추가로 Windows 다이얼로그와 라벨 통일

### Claude 샌드박스 strict 모드: Windows 권한 매칭 fix

Strict 샌드박스 모드의 Todo/Discussion 오케스트레이터는 워크트리에 `.claude/settings.json`을 생성하면서 `Read/Edit/Write(${workDir}/**)` 같은 절대경로 패턴으로 권한을 부여합니다.

Windows에서는 `path.join`이 디렉터리 부분에 백슬래시를 만들고 뒤의 `/**`는 그대로 슬래시라, 두 separator가 섞인 패턴(`C:\Osgood\...\worktrees\branch/**`)이 들어갔습니다. Claude의 권한 매처가 이 혼합 패턴을 silently 거부하면서 자동 작업이 Edit/Write 대신 Bash 워크어라운드(`sed -i`, `pwsh -c`)로 폴백 → 턴을 소진하다 exit 1로 끝나는 케이스가 있었습니다.

이번 버전부터:

- 워크트리 경로를 슬래시로 정규화한 뒤 `Read/Edit/Write` allow 패턴에 사용
- macOS/Linux는 영향 없음 (이미 슬래시)
- 기존에 깨진 `settings.json`은 다음 실행 시 자동 덮어쓰기되어 self-heal

### 세션 리사이즈 후 스크롤백 정상 렌더

플로팅 세션 창이나 앱 레이아웃이 리사이즈되면 `ResizeObserver`가 `fitAddon.fit()`을 동기 호출했지만, 그 뒤에 `term.refresh()`를 부르지 않아 xterm의 DOM 렌더 행들이 리사이즈 이전 Y 좌표를 유지했습니다. 새 viewport보다 scrollback이 길면 스크롤바를 드래그할 때 행이 어긋나 그려지는 현상이 있었습니다.

이번 버전부터:

- `fit`을 `requestAnimationFrame`으로 deferred 호출 (ResizeObserver loop 회피 + 0×0 hidden tab 보호)
- 실제 cols/rows 변경 시 `term.refresh()` 호출
- 폰트 크기 변경에도 동일 처리

## 설치 / 업데이트

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

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

## 전체 커밋 목록

- a3a68f8 fix(session): refresh xterm DOM rows after resize to prevent stale scrollback render
- f03b2c7 fix(sandbox): normalize worktree path separators in Claude permission patterns
- c82f250 feat(projects): modernize Windows folder picker, harden macOS picker
- 50b1102 WIP(release): fetch release notes from main branch in workflow
- c48864d WIP(docs): add v0.2.2 release notes

## 관련 문서

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