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

계획을 DB에서 꺼내 마크다운 파일로 옮겼다

PlannerArchitectureRelease

플래너를 만들어놓고 정작 내가 안 쓰고 있었다. 이유가 뭘까 생각해봤는데 답이 좀 어이없었다. 계획이 DB 안에 들어 있어서 에이전트가 못 읽는다는 거였다. Claude Code한테 “이번 라운드 계획 좀 봐줘” 하면 얘는 파일밖에 못 읽는데, 정작 계획은 SQLite 안에 있으니 앱을 켜야만 존재하는 물건이 돼버린 거다.

그래서 방향을 뒤집었다. .oculpm/planner/*.md 파일 자체가 진실이고, DB는 그걸 빠르게 보여주기 위한 캐시일 뿐. 앱이든 에이전트든 사람이든 다 같은 파일을 본다.

PR을 6개로 쪼갰다. 스키마랑 경로 규칙, 마크다운 파서 먼저. 그다음 파싱 결과를 앱 화면으로 투영하고 워처가 파일 바뀌면 다시 읽게. 쓰기 경로(plan_create / apply_edit)랑 누가 고쳤는지 남기는 귀속 로그, 여기 redact 붙이고. AGENTS.md에 갱신 규칙이랑 템플릿 5종 박고, 플래너 화면을 문서형 체크리스트로 다시 그리고, 일지↔계획 상호참조에 진척 제안까지. 마지막으로 인앱 AI로 계획 갱신하는 거랑 옛날 goals/subtasks 마이그레이션.

여기까지 하고 실제 프로젝트(adelie) 계획 파일을 물려봤더니 경고가 좍 떴다. “id/title missing”, “no {#id}”. 근데 파일 열어보니까 잘 쓴 계획이었다. 파서가 까탈스러웠던 거다. frontmatter 없이 # H1으로 제목 쓴 거, 항목이 길어서 {#id}가 다음 줄로 넘어간 거. 사람이(그리고 에이전트가) 자연스럽게 쓰는 방식인데 내가 정한 규격이 그걸 못 받아준 거였다. 파서를 관대하게 고쳤다. H1을 제목으로 폴백, 들여쓴 연속 줄은 합쳐서 읽기(fold_wrapped_items), 대괄호 글리프 허용.

이거 하면서 하나 확실해진 게, 규격을 빡세게 잡고 사람더러 맞추라고 하면 아무도 안 쓴다는 거. ## Phase {#id} 처럼 에이전트가 알아서 하고 있던 패턴도 그냥 정식으로 인정해줬다. phase 상태는 자식 항목 롤업으로 계산하고, plan-log가 phase를 가리키면 그것도 귀속으로 잡히게.

규칙 문서 자체를 버전 관리하는 것도 넣었다. 템플릿에 <!-- template_version --> 마커를 박아놓고, 프로젝트 디스크에 있는 게 앱에 내장된 것보다 오래됐으면 “규칙 업데이트하시겠어요?” 토스트를 띄운다. 누르면 기존 걸 .bak으로 백업하고 갈아 끼운다. 다른 프로젝트에서 옛날 §7 그대로 쓰고 있는 걸 발견하고 만든 건데, 이런 게 없으면 프로젝트마다 규칙이 조용히 갈라진다.

계획이 갱신되면 Today에도 “계획 업데이트” 카드로 뜨게 했다. 누가 어느 항목을 어떤 상태로 바꿨는지 한 줄씩. 에이전트가 백그라운드에서 계획을 고치고 있다는 게 눈에 보이니까 그제야 이 구조가 돌아간다는 실감이 났다.

여기까지가 오전이고, 오후엔 배포 쪽을 팠다. GitHub Actions 릴리스 파이프라인 붙이고 인앱 자동 업데이트 넣었다(이건 PySpace에서 하던 거 그대로 베낌). CI가 자꾸 깨져서 봤더니 tauri-specta 바인딩을 커밋 안 해놔서 프런트 tsc가 cargo보다 먼저 도는 데서 터지고 있었다. 바인딩 커밋해서 해결.

임베딩 모델도 손봤다. 다국어 모델이 480MB라 첫 실행 때 이거 받느라 앱이 멍하니 서 있었다. 양자화 버전으로 바꾸니 135MB. 그래도 기다리는 건 기다리는 거라 다운로드 진행 UI를 붙였다. 뭐가 얼마나 남았는지 보이는 거랑 안 보이는 거랑 체감이 완전 다르더라.

랜딩은 bento 레이아웃으로 다시 만들고 oculpm.com 붙였다. SEO랑 Analytics도 넣고, README도 홍보용으로 갈아엎으면서 MIT 라이선스 박았다. GitHub 소셜 프리뷰 카드까지 만들고 나니까 이제 진짜 배포하는 것 같더라. Apple Silicon만 우선. Intel이랑 Windows는… 나중에.

내고 나서 이틀 동안 1.1.1, 1.1.2, 1.1.3을 연달아 냈다. 과거 일지랑 이미 커밋된 일지에서 변경 diff가 안 뜨던 거(git 히스토리 폴백이랑 열 때 backfill로 해결), 업데이트 패널의 릴리스 노트가 마크다운 원문 그대로 나오던 거, diff 화면에서 계획 태그가 항목 수만큼 칩으로 도배되던 거. 자동 업데이트 붙여놓으니까 이런 걸 바로바로 낼 수 있어서 좋긴 한데, 릴리스 번호가 빨리 는다.

김현빈 Developer & Writer

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