2026-10-02

tars에 데스크톱 앱과 포커스 모드 추가

탱글 젤리 1차 개발을 마치고 게임은 취미로 두기로 했다. 주력은 그동안 쌓은 경험과 지식을 살려 응용 프로그램과 서비스를 만드는 일, 특히 AI 관련 개발이고 지금은 tars에 집중하고 있다. tars는 브라우저 콘솔이 있는 로컬 AI 에이전트 런타임이고 9월 23일부터 매일 쓰는 AI 개발 도구로 만들고 있다. 9월 29일부터 10월 2일까지 PR 63개를 머지했고 v0.38.0부터 v0.42.2까지 태그를 16개 붙였다.

바뀐 파일 되돌리기

지난 글에서는 채팅 턴마다 작업 폴더를 스냅숏으로 남기고 Changes 패널에서 diff를 보는 데까지 했다. 이번에는 턴 전체, 파일, 변경 묶음(hunk) 단위로 되돌리는 기능을 붙였다. 되돌리기 직전 상태도 따로 남겨서 되돌린 것을 한 번은 다시 취소할 수 있다. 그사이 내가 고친 파일은 git merge-file로 합쳐서 겹치는 곳만 충돌로 보여 준다. 턴의 변경에 메모를 달아 에이전트에게 다시 보내는 리뷰 노트도 넣었다.

채팅 안에서 승인하기

내가 주로 쓰는 provider가 Claude Code CLI를 그대로 부르는 claude-code-cli라서 여기가 가장 막혀 있었다. tars가 턴을 -p로 실행하니 Claude Code가 권한을 물을 방법이 없었고 모델이 “진행할까요?”라고 글로 되물어서 답해도 그 답이 CLI의 권한 확인에 닿지 않았다. 그래서 Claude Agent SDK가 쓰는 stdio 제어 프로토콜(--permission-prompt-tool stdio)로 실행 방식을 바꾸고 권한 질문을 콘솔의 승인 카드로 받게 했다. anthropic, openai, gemini처럼 tars가 도구를 직접 실행하는 provider도 같은 카드를 쓴다.

권한 모드는 세션마다 Ask, Accept edits, Plan, Auto 중에서 고르고 ⇧Tab으로 바꾼다. 승인 카드에는 “이 폴더에서 항상 허용”을 넣었다. cron이나 텔레그램처럼 지켜보는 사람이 없는 실행은 지금까지 도구를 묻지 않고 실행했는데, 이제 세션 권한 모드를 따르고 승인 대기열에서 답을 기다린다.

세션 여러 개 함께 돌리기

콘솔 첫 화면을 세션 보드로 바꿔 세션을 저장소별로 묶고 입력 필요, 실행 중, 완료·미확인, 유휴 배지를 붙였다. 다른 세션으로 옮기거나 새로고침해도 진행 중인 턴은 멈추지 않고 돌아오면 다시 붙으며, 턴이 도는 동안 보낸 메시지는 대기열에 쌓인다.

한 저장소에서 두 세션이 동시에 파일을 고치면 변경이 섞여서 턴이 저장소 쓰기 잠금(write lease)을 잡게 했다. 다른 세션이 lease를 쥔 저장소에서 턴을 시작하면 그 세션은 자기 git worktree로 옮겨 가 작업한다. 처음부터 모든 세션을 격리하지 않은 건 .env나 node_modules처럼 git이 무시하는 파일이 빠지고 포트가 겹치기 때문이다. 대신 worktree를 만들 때 node_modules 같은 폴더를 copy-on-write로 복사하게 했다.

데스크톱 앱 만들기

콘솔을 네이티브 창으로 띄우는 얇은 데스크톱 앱을 Wails v3로 만들었다. 화면은 브라우저 콘솔을 그대로 쓰고 트레이, 전역 단축키, 승인 알림, 자동 업데이트처럼 브라우저 탭이 못 하는 것만 더했다. 트레이 메뉴에서 승인을 기다리는 도구 호출을 바로 허용하거나 거부할 수 있다. 서버는 LaunchAgent로 따로 돌아서 창을 닫아도 cron은 계속 돈다. macOS 앱은 공증을 받아 Homebrew cask로 서버와 함께 설치된다.

brew tap devlikebear/tap
brew install --cask devlikebear/tap/tars-desktop

개발 단계를 화면으로 만든 포커스 모드

워크벤치 기능을 늘리다 보니 화면이 Claude Desktop이나 Codex 앱만큼 복잡해졌다. tars로 개발하면서 지금 어느 단계인지, 내가 무엇을 정해야 하는지, 긴 답에서 어디가 중요한지 알기 어려웠다. 그래서 내가 손으로 따르던 개발 순서를 화면 구조로 삼기로 했다.

계획 → (구현 → 테스트)* → (리뷰 → 검증 → 수정)* → PR → (리뷰 → 검증 → 수정)* → 머지

포커스 모드는 이 단계를 화면 위쪽에 보여 주고 카드는 한 번에 한 장만 띄운다. 반복은 단계 안에서 자동으로 돌고 나는 계획 승인, 리뷰 지적 분류, PR 열기, 머지의 네 게이트에서만 손을 댄다. 다음 단계로 넘어갈지는 모델에게 묻지 않고 검증 명령의 종료 코드, 턴 체크포인트의 diff, gh 조회 결과로 정한다. 9월 30일에 넣은 initiative 루프(tars가 먼저 말을 걸지 판단하는 기능)를 만들기 전 실험에서 작은 모델에게 “지금 말을 걸까”를 통째로 물었더니 맞히는 정도가 동전 던지기와 비슷했다. 그래서 단계 판단도 모델에 맡기지 않기로 했다.

기존 화면은 Advanced 모드로 남겨서 같은 세션을 두 모드로 오갈 수 있다. 서버 기반부터 릴리스 트레인까지 다섯 단계를 10월 1~2일에 main에 머지했다.

아직 확인할 것

자동 테스트와 E2E로 각 단계의 흐름은 확인했다. 카드만 보고도 무슨 일이 있었는지 알 수 있는지는 포커스 모드로 실제 기능을 몇 개 만들어 봐야 안다. 단계 중간에 Advanced로 자주 넘어가게 되면 카드에 담는 내용이 모자란 것으로 보고 다시 설계한다. 포커스 모드는 아직 릴리스에 들어가지 않았고, 최신 릴리스는 v0.42.2다. tars.marvin-42.com에서 설치하거나 github.com/devlikebear/tars에서 소스를 받는다.

같은 작업대에서 나온 이웃 도구입니다.