TECH 으로 돌아가기
TECH HACKER NEWS 어제 7분 읽기 40 READS

터미널에서 끝내는 코드 리뷰: 키보드 중심 diff 뷰어 Diffle

터미널에서 끝내는 코드 리뷰: 키보드 중심 diff 뷰어 Diffle
SOURCE IMAGE · HACKER NEWS

코드 리뷰 도구는 대부분 웹 서비스나 IDE 플러그인 형태로 제공되지만, 터미널에서 작업하는 개발자에게는 맥락 전환이 늘 부담이다. 최근 Show HN에 공개된 Diffle은 이 지점을 겨냥한다. Git diff를 브라우저에서 열어 줄, 블록, 파일 단위로 코멘트를 달 수 있는 키보드 우선(keyboard-first) diff 뷰어로, LSP(Language Server Protocol) 연동과 GitHub 통합을 함께 제공한다. 눈에 띄는 특징은 작성한 코멘트를 두 방향으로 내보낼 수 있다는 점이다. 하나는 AI 에이전트에게 넘길 프롬프트로, 다른 하나는 GitHub의 보류 리뷰(pending review)로 전달하는 방식이다.

설치는 Node.js에 의존하지 않는 독립 실행 바이너리를 중심으로 한다. 리눅스는 x64와 arm64(glibc), macOS는 애플 실리콘을 지원하며, 윈도우(x64, arm64)는 PowerShell로 설치한다. 기본 설치 경로는 ~/.local/bin이고, DIFFLE_INSTALL_DIR로 경로를, DIFFLE_VERSION으로 특정 릴리스를 고정할 수 있다. Nix 패키지는 gh를 함께 묶으며, #minimal은 이를 제외하고 #web·#rust·#python은 각 언어 서버를 포함한다. 마지막 diffle 탭을 닫으면 서버가 종료되면서 미처리 코멘트를 출력하는데, 서버를 계속 띄워 두려면 --keep-alive를 쓴다.

워크트리를 건드리지 않는 코멘트 모델

Diffle의 설계에서 실무적으로 중요한 부분은 코멘트 저장 방식이다. 코멘트는 워크트리가 아니라 /diffle/ 아래에 보관되므로 작업 중인 파일을 오염시키지 않는다. 또한 코멘트는 대상 코드가 바뀌어도 해당 텍스트를 따라 이동하며, 그 코드가 diff에서 사라지면 'stale(오래됨)' 상태가 된다. 비교 범위에 포함된 커밋들은 스레드 위에 나열되고, 특정 커밋을 고르거나 < 와 > 로 단계별 이동해 해당 커밋만 볼 수 있다. 이때 단 코멘트는 그 커밋에 귀속되며, 전체 범위로는 'All changes'로 되돌아간다. GitHub처럼 생성된 파일은 접힌 상태로 시작하는데, 판별 기준은 .gitattributes의 linguist-generated 속성이고 linguist-generated=false로 제외할 수 있다. 다른 파일을 접고 싶으면 설정이나 diffle config로 auto-viewed glob을 추가한다.

GitHub 연동과 토큰 처리

GitHub 기능은 토큰을 필요로 한다. Diffle은 GITHUB_TOKEN, GH_TOKEN, 그리고 로그인된 gh 순서로 토큰을 찾으며, 토큰이 없어도 GitHub 관련 기능만 빠질 뿐 나머지는 그대로 동작한다. GitHub Actions 등에서는 GITHUB_API_URL로 다른 API 엔드포인트를 지정할 수 있고, 다른 저장소의 PR은 임시 클론으로 열린다. PR 아이콘을 누르면 스레드 하나 또는 열린 스레드 전체가 PR의 보류 리뷰에 추가된다. 다만 Diffle은 리뷰를 제출하지 않는다. 편집·삭제·제출은 어디까지나 GitHub에서 사용자가 직접 하며, 같은 스레드를 다시 추가하면 중복 생성 대신 기존 코멘트를 갱신한다. 내보내기는 비교 대상이 PR에 커밋된 diff와 정확히 일치할 때만 작동하므로, 푸시되지 않은 커밋이나 워크트리 변경이 있으면 내보낼 수 없고 stale 스레드는 건너뛴다.

LSP 통합의 효용과 주의점

Diffle은 diff에 등장하는 각 언어에 대해 PATH에서 언어 서버를 찾으면 자동으로 실행한다. 표준 라이브러리처럼 diff 바깥의 결과는 읽기 전용으로 열리며, 큰 저장소는 색인에 시간이 걸릴 수 있다. diffle lsp 명령은 각 언어에 어떤 서버가 할당되는지와 나머지는 무엇을 설치해야 하는지 보여 주고, 업그레이드 후에는 새 명령을 반영하기 위해 다시 실행해야 한다. 여기서 보안상 분명히 짚고 넘어갈 점이 있다. 언어 서버는 저장소 안에서 셸을 통해 실행되므로 사용자가 접근할 수 있는 모든 것을 읽을 수 있다. 신뢰할 수 없는 저장소를 열 때는 이 권한 범위를 염두에 두어야 하며, 필요하면 --no-lsp로 언어 서버를 아예 띄우지 않을 수 있다.

배포 환경에서는 리버스 프록시 뒤에 두는 경우가 흔한데, Diffle은 https://proxy.example/diffle/ 같은 경로 접두사 아래에서 별도 설정 없이 동작한다. 조건은 프록시가 /diffle/ws의 WebSocket 업그레이드를 포함해 접두사를 제거하고 공개 오리진을 신뢰하도록 구성하는 것이다. 프록시가 Host와 Origin을 쿠버네티스 서비스명 같은 업스트림 주소로 바꾼다면 그 주소를 신뢰 대상으로 지정하면 되고, 거부된 요청에는 어떤 헤더가 실패했는지 알려 주는 403이 반환된다.

Diffle은 아직 초기 단계의 도구로, difit에서 영감을 받았고 diff 렌더링에는 @pierre/diffs를 사용한다. 정리하면 이 도구의 가치는 '브라우저 UI의 편의와 터미널 워크플로의 연속성'을 한곳에 묶으면서, 코멘트를 에이전트 프롬프트 혹은 GitHub 보류 리뷰라는 두 출구로 흘려보낸다는 데 있다. 반면 내보내기가 커밋된 diff와의 일치 여부에 강하게 묶여 있다는 점, 언어 서버에 셸 수준 접근 권한이 주어진다는 점은 도입 전에 팀 차원에서 확인해야 할 제약이다. 특히 에이전트 연동이 코드 리뷰 흐름에 자연스럽게 들어오는 요즘, 로컬에서 리뷰를 구성하고 그 결과를 사람이 최종 제출하도록 분리한 설계는 자동화와 통제 사이의 균형을 고민하는 팀에게 참고할 만하다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/moritzwilksch/diffle
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...