메인 칼럼 개발일지 작업물 연락처
← ocul-pm 프로젝트
개발일지 / DEVLOG

v2.0 찍고 메뉴바로 내려갔다

ReleaseTrayTerminal

v2.0에 붙일 만한 큰 기능 하나를 찾다가 그냥 포기했다. 대신 거슬리는 걸 13개 적어놓고 U1부터 U13까지 번호 붙여서 하나씩 밀었다. 결과적으로 이게 나았던 것 같다.

내비게이션이 세 군데(사이드바, 커맨드 팔레트, 단축키)에 각각 하드코딩돼 있어서 화면 하나 추가할 때마다 세 번 고쳐야 했던 걸 navRegistry 하나로 통일(U1). 이제 ⌘숫자가 사이드바 순서랑 자동으로 맞는다. 토스터 테마 토큰화하고 로딩 스켈레톤 붙이고(U2), WorkspaceContext가 리렌더를 과하게 유발하던 걸 수술했다(U3). recentChanges를 별도 스토어로 빼고 persist 디바운스, value 메모.

에이전트 어댑터도 늘렸다. Windsurf, Copilot, aider, Cline, Zed(U4). codex 귀속도 붙이고. 로그가 무한정 쌓이던 건 최근 14개만 보존하게(U5). 화면별 lazy 분할로 ShellV2 청크를 58% 줄였는데(U6), xterm이랑 마크다운 렌더러를 격리한 게 컸다.

나머지도 쭉. 팔레트에서 일지·계획·토의·문서로 바로 점프(U7), diff를 j/k로 넘기고 /로 검색(U8), 플래너 상태 토글 낙관적 업데이트(U9), 스탠드업·PR 본문·주간 보고 생성(U10), FTS5 검색(U11), Today가 IPC를 12번+N번 때리던 걸 3번으로 줄이고(U12), 모달 포커스 트랩을 공통 훅으로(U13).

그러고 2주쯤 뒤. Claude Desktop에 MCP 등록하는 걸 원클릭으로 만들었다. claude_desktop_config.json을 직접 건드리는 거라 겁났는데, 비파괴 머지에 같은 이름 폴더 충돌 대비 해시 접미사까지 붙여서 정리. MCP 서버 쪽도 stdin 10MiB 상한 걸고 redact 붙여서 하드닝.

AI 패널도 크게 손봤다. 스트리밍 중에 마크다운이 라이브로 렌더되게(45ms 스로틀에 줄 단위 memo), 모델 드롭다운은 상단 칩 바 걷어내고 Cursor처럼 입력창 아래로, 보내기 전에 입력 토큰이 몇 개인지 배지로 추정해서 보여주고 누르면 파트별로 얼마씩 먹는지 뜬다. 생성 중지 버튼도 드디어. 이거 없어서 그동안 엉뚱한 답변 나오는 걸 끝까지 보고 있었다.

터미널에서 오래 묵은 버그를 하나 잡았다. 한글이랑 박스 문자가 가끔 로 깨졌는데, PTY 출력을 4096바이트 청크 단위로 from_utf8_lossy 돌리고 있었던 거다. 멀티바이트 문자가 청크 경계에 걸치면 그대로 박살. 스트리밍 디코더 만들어서 미완성 시퀀스는 다음 청크로 이월하게 고쳤다. 재현 테스트 6건 박아놨다. 겸사겸사 화면 나갔다 와도 세션 유지되게, 분할 페인(⌘D), 탭 더블클릭 리네임, 스크롤백 검색까지 넣었다.

그리고 오늘의 메인, 메뉴바 상주. RunCat이랑 Docker 트레이 보면서 만들었다. 아이콘은 에셋 없이 런타임에 RGBA로 그리는 동심원인데 3가지 상태가 있다. 유휴는 정적, 세션 활성이면 펄스, 문제 있으면 점. 펄스는 미리 프레임 렌더해놓고 세션 0이면 타이머를 아예 세운다. 폴링 없이 세션 시작/종료 이벤트만 구독하니까 놀고 있을 때 CPU를 안 먹는다.

팝오버는 ?tray=1로 들어가는 경량 진입점이다. 프로젝트 스위처, 활성 세션, 오늘 한 줄, 최근 일지 4건, 계획 진행률, 스탠드업 복사. 일지 클릭하면 딥링크로 본 창이 그 프로젝트로 전환되면서 열린다. 데이터는 기존 커맨드 재탕이라 백엔드 신규 커맨드 0개.

창 닫으면 트레이로 최소화되고 Dock에서 숨는 것도 넣었는데, 전부 옵인이다. 이거 기본값으로 켜면 앱 종료가 안 되는 줄 알고 짜증내는 사람 나온다.

내고 나서 하루 종일 쓰면서 계속 고쳤다. 팝오버 그림자가 잘리던 거, 프로젝트 스위처가 기본 셀렉트라 어울리지 않던 거, 더블클릭하면 팝오버가 다시 열리던 거, 일지 목록이 4행에서 잘리던 거. 새 일지 들어오면 macOS 알림 띄우는 것도 넣었는데 이것도 옵인이다. 알림은 함부로 켜면 안 된다.

이틀 뒤에 버그 하나 발견. 앱 켜두고 자정을 넘기면 “오늘” 화면이 재시작 전까지 어제에 고정돼 있었다. 60초 tick이랑 포커스 이벤트로 롤오버 감시하는 워처 붙여서 v2.3.1로 냈다.

김현빈 Developer & Writer

기술, 포스팅 관련 질문, 프로젝트 협업 등 연락주시면 언제든지 회신 드립니다.