군살 뺐으니 이제 껍데기 차례. 근데 UI 새로 그리기 시작하면 항상 “이 화면 제대로 뽑으려면 백엔드가 이런 걸 줘야 되는데…” 하다가 한 달 날아간다. 그래서 이번엔 아예 못을 박았다. 백엔드 한 줄도 안 건드림. 지금 있는 커맨드로 만들 수 있는 화면만 만든다.
첫 PR은 토큰 격리. ui_v2 플래그랑 data-theme 심어서 새 UI랑 옛날 UI가 한 앱에 같이 살게 해놨다. 이게 있으니까 화면 하나씩 갈아 끼우면서도 언제든 되돌릴 수 있어서 마음이 편하더라. 그 뒤론 그냥 순서대로 밀었다. 248px 사이드바랑 ShellV2 껍데기, ⌘1~⌘7, Today 6블록 대시보드, 작업 일지 타임라인, 변경 diff 전용 화면, 도구 4개(플래너·검색·터미널·AI), 설정 5섹션 재구성. 전부 프런트에서 집계해서 그렸고 약속대로 백엔드는 안 건드렸다.
근데 예쁘게 나온다고 쓸 수 있는 건 또 아니더라. 새 레이아웃에서 터미널이 빈 화면으로 떴다. 한참 헤맸는데 xterm open()을 컨테이너 아직 안 보일 때 부르고 있었음. 보일 때까지 미루니까 됐다. 고치자마자 이번엔 [프로세스 종료됨]… StrictMode가 개발 모드에서 두 번 spawn하는 거였다. 이런 걸로 반나절 씀.
AI 패널은 마크다운도 안 먹고 모델 선택도 대화 단위로 안 붙어서 그냥 통째로 갈아엎었다. 답변이 다 만들어진 다음에 툭 튀어나오는 게 답답해서 타자기 효과도 넣었는데, 이건 필요해서가 아니라 그냥 내가 보고 싶어서 넣은 거다. 후회 없음.
마지막 UI PR에서 코드 워크벤치를 아예 들어냈다. 이건 좀 오래 붙잡고 있었는데, 어차피 코드는 에디터에서 짜고 이 앱은 “무슨 일이 있었는지 보는 곳”이라는 걸 인정하기까지 시간이 걸렸다. 플래그 끄고 화면 지우니까 사이드바가 훨씬 말이 되더라.
며칠 더 쓰면서 나온 것들도 붙였다. 새로 생긴 파일은 baseline이 없어서 diff에 안 뜨던 걸 전체 추가로 바로 보이게, 작업 일지 카드에 변경된 파일 칩 표시, 일지랑 Today가 새 기록 들어오면 실시간으로 갱신되게. 그리고 파일별 변경 diff를 일지에 영구 기록하는 것도. 이거 붙이고 나서야 “3주 전에 이 함수 왜 이렇게 바꿨지”에 답이 나오기 시작했다. 대신 이후 일지부터만 적용된다는 게 아쉬웠다.
죽은 화면들은 src/legacy/로 몰아넣고, shadcn 변수 다시 매핑해서 코드 여기저기 박혀 있던 dark: 접두사를 싹 걷어냈다. 번들도 한번 봤는데 D2Coding 폰트가 8.4MB를 통째로 실려 오고 있더라. woff2 서브셋 뜨니까 440KB. 20분의 1. 이런 거 발견하면 좀 부끄럽다.
오늘 진짜 사건은 개명이다. ai-pm은 처음 폴더 만들 때 아무 생각 없이 친 이름이고, 1.0 붙일 물건에 달고 다닐 이름은 아니지 않나. 표시명만 바꾸는 게 아니라 식별자까지 다 옮겼다. Tauri identifier com.kimhyunbin.ocul-pm, DB 파일명, 키체인 서비스명, crate 이름도 바이너리 ai-pm → ocul-pm, 라이브러리 ai_pm_lib → ocul_pm_lib. 통합 테스트 5개 import까지 다 고쳤다.
대가는 있다. 데이터 경로랑 키체인이 새로 잡히니까 첫 실행 때 재인덱싱 한 번, API 키 재입력 한 번 해야 됨. 프로젝트 .oculpm/ 일지는 그대로 남는다는 것만 확인하고 그냥 질렀다. 진짜 기록만 안 날아가면 나머진 다시 만들면 되니까.
이름 바꾸니까 나머지도 따라오더라. 동심원 마크를 앱 아이콘, 스피너, Today 라이브 표시까지 통일하고 랜딩 페이지도 만들었다. 공증 안 한 빌드라 macOS가 “손상됐다”고 막는 건 결국 못 피하고, xattr -dr com.apple.quarantine 우회 명령을 README·랜딩·릴리스 노트 세 군데에 다 박아놨다.
1.0을 붙이려니 안 되어 있는 게 계속 보였다. Today의 “다음 할 일” 블록이 실제 플래너랑 안 이어져 있어서 연결하고, 일지를 손으로 쓸 수 있는 모달을 ⌘N에 붙이고, AI 패널의 “대화 기록”이 껍데기라 목록·전환·삭제를 실제로 붙였다. 검색도 심볼 검색이랑 정확히 일치 검색을 실연동. 첫 실행 가이드랑 Today 빈 상태 CTA, 업데이트 알림까지 넣고 나서야 버전을 올렸다.
아무튼 이제 남한테 링크 보낼 수 있는 물건은 됐다. 보낼 사람이 있냐는 별개 문제고.