Claude Code가 고친 코드는 diff·리뷰·브라우저 확인을 거쳐 커밋한다

모범 사례 스킬을 참고해 리팩터링을 마쳤다고 코드에 버그가 없는 것은 아니다. 충분히 단순한지, 보안 구멍은 없는지, 화면에서 실제로 동작하는지는 각각 다른 질문이다. Claude Code가 수정을 끝내면 커밋 전에 다섯 단계를 거친다. /diff로 바뀐 코드를 직접 읽고, /simplify로 다듬고, /code-review로 버그를 찾고, /security-review로 취약점을 점검하고, 브라우저에서 사용자 흐름을 돌려 본다. 검토 보고서가 길어 읽기 힘들면 출력 스타일로 말투를 바꾸고, 수정이 틀렸으면 되감기로 돌아간다

2편에서 계획을 승인하고 편집 승인 모드로 수정을 맡긴 상태에서 이어진다. 다 읽으면 리뷰 명령마다 무엇을 찾고 무엇을 고치는지 구분하고, 되감기로 복원되지 않는 변경을 미리 피할 수 있다

/diff로 바뀐 코드를 직접 읽는다

/diff는 작업 트리의 변경을 보여 준다. Claude가 지금까지 한 편집과 아직 커밋하지 않은 다른 변경이 함께 나온다. 마이너스로 시작하는 줄은 지워질 내용, 플러스로 시작하는 줄은 추가될 내용이다. 강의에서는 따로 실행되던 두 호출이 Promise.all로 묶인 것을 이 화면에서 확인했다

현재 문서 기준으로 diff 뷰어에는 두 관점이 있다. Current 보기는 git 기준 미커밋 변경을 보여 주고, 미커밋 변경이 없으면 브랜치가 기본 브랜치 위에 더한 내용을 보여 준다. 프롬프트별 보기는 Claude의 파일 편집만으로 만든다. 그래서 Bash 명령으로 바뀐 파일은 Current 보기에만 나타난다(interactive-mode)

리뷰를 자동화하더라도 이 단계는 사람이 한다. 강사의 말대로 코드는 결국 읽어야 한다. 뒤의 리뷰 명령들은 읽을 곳을 좁혀 줄 뿐이다

다듬기, 버그 찾기, 보안 점검은 명령이 다르다

강의는 Claude Code에 기본으로 들어 있는 스킬 세 개를 차례로 실행한다. 셋은 찾는 대상과 수정 여부가 다르다

명령찾는 것기본 동작
/simplify재사용·단순성·효율 개선점찾은 개선점을 바로 적용한다. 버그는 찾지 않는다
/code-review (/review)정확성 버그와 정리 대상보고만 한다. --fix를 주면 적용한다
/security-review현재 diff의 보안 취약점보고서를 준다

/simplify는 코드 품질을 다듬는 도구다. 강의에서는 “아직 커밋하지 않은 변경 사항을 단순화해 줘”라고 범위를 좁혔다. 코드베이스 전체를 맡길 수도 있지만 시간이 오래 걸린다. 실행하면 여러 서브에이전트가 뜨고, 아래쪽 에이전트 목록에서 하나를 골라 Enter를 누르면 각자 무엇을 하는지 볼 수 있다

/code-review는 브랜치에서 업스트림보다 앞선 커밋과 미커밋 변경을 검토한다. 파일 경로, PR 번호, 브랜치 이름, main...my-feature 같은 범위를 대상으로 줄 수도 있다. 리뷰는 별도 컨텍스트를 가진 백그라운드 서브에이전트로 돌기 때문에 메인 대화를 채우지 않는다(code-review). effort를 인수로 줄 수 있다. low와 medium은 확신이 높은 발견만 보고하고, high 이상은 범위를 넓히는 대신 덜 확실한 발견도 포함한다

문서에는 명령 이름의 이력도 남아 있다. v2.1.147 이전에는 이 리뷰 명령의 이름이 /simplify였고 기본으로 수정을 적용했다. 지금의 /simplify는 버그를 찾지 않는 별도의 정리 전용 리뷰다. 예전 방식으로 /simplify를 버그 찾기에 쓰던 스크립트가 있다면 /code-review --fix로 바꾸라고 문서는 안내한다

--fix에는 주의할 점이 있다. 백그라운드 리뷰가 적용한 수정은 세션의 체크포인트 밖에서 일어나므로 /rewind로 되돌릴 수 없다. 문서는 git으로 되돌리라고 적는다. 리뷰 결과를 바로 적용하기 전에 커밋을 하나 만들어 두면 되돌릴 기준점이 생긴다

강의 결과는 두 가지였다. 보안 리뷰는 “보고 기준에 해당하는 발견 사항 없음”, 코드 리뷰는 발견한 문제가 이번 변경이 아니라 기존 코드에 있던 것이라고 보고했다. 이 결과를 받은 뒤의 순서는 보고서를 읽고, 남은 문제를 고치고, 다시 단순화와 리뷰를 반복하는 것이다

클라우드에서 더 깊게 검토하는 ultrareview도 있다. 현재 명령은 /code-review ultra이고, 계정에서 쓸 수 있으면 /ultrareview가 별칭으로 동작한다. Pro와 Max는 무료 실행 3회가 한 번만 주어지고 갱신되지 않으며, 그 뒤로는 사용 크레딧이 청구된다(ultrareview). 강의에서 로컬 리뷰를 “무료”라고 한 것은 별도 요금이 붙지 않는다는 뜻이다. 로컬 리뷰도 일반 사용 한도는 소모한다

출력 스타일로 보고서를 읽기 쉽게 바꾼다

기능마다 리뷰를 돌리면 보고서를 많이 읽게 된다. 강사는 Opus나 Fable의 보고서가 장황해서 오래 읽으면 피곤하다고 했다. 출력 스타일(output style)은 Claude가 답하는 말투와 형식을 바꾸는 기능이다

출력 스타일도 프런트 매터가 붙은 마크다운 파일이다. 프로젝트는 .claude/output-styles/, 사용자 전체는 ~/.claude/output-styles/에 둔다(output-styles). 강의에서 쓴 것은 Attention Span 저장소의 Spartan 스타일이다. 저장소 설명으로 Spartan은 완충 표현과 연결어를 빼고 최대한 압축하는 스타일이고, Rundown은 TL;DR로 시작해 상태를 체크리스트로 보여 주는 브리핑 스타일이다

직접 파일을 넣어도 되고, 저장소 URL을 주고 Claude에게 설치를 맡겨도 된다. 강의에서는 @로 .claude 폴더를 지정하고 URL을 붙여 설치를 요청했다. @는 대화에서 파일이나 폴더를 직접 가리킬 때 쓴다

출력 스타일 파일의 머리는 다음과 같은 형태다

---
name: Spartan
description: 답을 먼저 말하고 군더더기를 뺀다
keep-coding-instructions: true
---

keep-coding-instructions는 반드시 확인한다. 기본값은 false이고, false이면 사용자 정의 스타일이 변경 범위를 정하는 법, 주석 작성, 작업 검증 같은 Claude Code의 소프트웨어 개발 지침을 빼 버린다. 책을 쓰거나 일정을 관리하는 용도라면 그래도 되지만, 코딩에 쓸 때는 true로 둬야 말투만 바뀌고 개발 지침은 유지된다

스타일은 /config의 Output style에서 고르거나, v2.1.269 이상에서는 /output-style Spartan으로 바꾼다. 선택은 .claude/settings.local.json의 outputStyle에 저장되며 값은 대소문자를 구분한다. 틀리면 경고 없이 기본 스타일로 동작한다. 강의에서는 파일을 넣은 뒤 /config에 스타일이 보이지 않아 Claude Code를 재시작했다. 문서도 세션 중에 스타일 파일을 만들거나 고치면 재시작해야 반영된다고 적는다. 이미 있는 스타일로 바꾸는 것은 v2.1.251부터 다음 메시지에 바로 적용된다

강의는 같은 보안 리뷰를 스타일 적용 전후로 비교한다. 적용 전 보고서는 “전체 변경 사항을 검토했고……”로 길게 시작했다. 적용 후에는 “보안 검토: 발견 사항 없음”이 첫 줄에 나오고, SQL 인젝션·XSS·인증·데이터 노출 등 확인한 항목이 짧게 이어졌다

내장 스타일도 있다. 현재 문서 기준으로 Default 외에 Proactive, Concise, Explanatory, Learning이 있다. 새 스타일을 받기 전에 Concise부터 써 보는 것도 방법이다

브라우저에서 실제 동작을 확인한다

리뷰까지 마쳐도 코드가 화면에서 동작하는지는 모른다. 충분한 테스트가 있다면 테스트를 돌리면 되지만 예제 프로젝트에는 테스트가 없다. 강의는 Claude in Chrome으로 사람 대신 브라우저를 조작하게 한다

준비는 세 가지다. Claude in Chrome 확장 프로그램을 설치하고, 별도 터미널에서 npm run dev로 개발 서버를 켜 두고, Claude Code에서 브라우저를 연결한다

claude --chrome   # 시작할 때 연결
/chrome           # 세션 안에서 연결 상태 확인·재연결

현재 문서 기준으로 Google Chrome과 Microsoft Edge를 지원하고, Brave·Arc·Vivaldi·Opera 같은 다른 Chromium 계열 브라우저의 확장도 인식한다. 확장 프로그램 1.0.36 이상과 Anthropic 직접 요금제(Pro, Max, Team, Enterprise)가 필요하고, API 키 로그인으로는 켜지지 않는다(chrome)

강의에서는 “예약을 만들고, 만든 예약을 확인할 수 있는지 검증해 줘”라고 요청했다. Claude가 화면을 캡처하고 마우스를 움직이며 예약을 시도했고, “예약 가능한 미용사가 없다”는 메시지로 실패하는 경로를 찾았다. 코드 리뷰에서는 드러나지 않은 동작이다. 검증을 이어 간 뒤 최종 판정은 통과였고 스크린샷이 함께 남았다. 화면을 찍고 움직이는 방식이라 빠르지는 않다

강사는 이 방식을 사용자 스토리와 묶어 쓴다고 했다

우리 웹사이트에서 사용자가 할 수 있는 일을 모두 정리한 user-stories.md를 만들어 줘.
user-stories.md의 행동을 Claude in Chrome으로 전부 수행해 보고,
오류나 버그가 있으면 스크린샷을 찍어서 알려 줘.

첫 요청은 가능한 흐름의 목록을 만들고, 두 번째 요청은 그 목록을 수동 테스트 시나리오처럼 돌린다. 자동 테스트를 대신하지는 않지만, 테스트가 없는 코드베이스에서 회귀를 찾는 첫 그물로 쓸 수 있다. 5편의 /goal과 묶으면 “구현한 뒤 브라우저에서 확인될 때까지”를 완료 조건으로 줄 수 있다

틀린 수정은 되감기로 되돌린다

/rewind를 실행하거나, 입력창이 비어 있을 때 Esc를 두 번 누르면 되감기 메뉴가 열린다. Claude가 작업 중일 때 Esc를 한 번 누르면 작업이 멈춘다. 되감기 메뉴에서 대화의 이전 시점을 고르면 다음 선택지가 나온다(checkpointing)

선택지결과
Restore code and conversation코드와 대화를 그 시점으로
Restore conversation대화만 되돌리고 코드는 유지
Restore code코드만 되돌리고 대화는 유지
Summarize from here선택 지점 이후를 요약으로 압축
Summarize up to here선택 지점 이전을 요약으로 압축

강의에서는 견종 목록에 핏불을 추가하고, 이어서 치와와를 추가한 뒤, “치와와도 추가해 줘” 직전으로 코드와 대화를 함께 되돌렸다. 화면에서 치와와가 사라졌고, 한 번 더 되돌리자 핏불도 사라졌다. 요약 선택지는 1편의 /compact와 같은 목적이다. 차이는 대화의 앞부분이나 뒷부분만 골라 압축한다는 점이다

되감기에는 복원 범위가 있다. 체크포인트는 Claude의 파일 편집 도구로 바꾼 내용만 추적한다

  • Bash 명령(rm, mv, cp 등)으로 바뀐 파일은 추적하지 않는다
  • 내가 편집기에서 직접 고친 파일, 다른 세션이 동시에 고친 파일은 보통 잡히지 않는다
  • 서브에이전트의 편집은 대부분 복원되지 않는다. 앞서 본 /code-review --fix도 여기에 해당한다
  • 버전 관리를 대체하지 않는다

Claude가 여러 파일의 문자열을 바꾸려고 Python 스크립트를 만들어 실행하는 경우가 있는데, 이 변경도 되감기로 돌아오지 않는다. 강사가 “파일을 Bash로 편집하지 말고 편집 전용 도구를 쓰라”는 선호를 메모리에 저장한 이유가 이것이다. 메모리는 강제가 아니므로 Bash 편집이 완전히 사라지지는 않는다. 되돌려야 할 가능성이 큰 작업 전에는 커밋을 하나 남기는 편이 확실하다

체크포인트는 대화와 함께 저장되므로 세션을 다시 열어도 /rewind를 쓸 수 있다. 최근 100개 체크포인트의 스냅샷을 보관하고, 약 30일(cleanupPeriodDays)이 지나면 정리된다

세션에 이름을 붙이면 다시 찾을 수 있다

Claude Code를 종료해도 대화는 남는다. 세션은 프로젝트 디렉터리별로 저장되고, 다음 명령으로 다시 연다(sessions)

claude --continue          # 현재 디렉터리의 가장 최근 대화
claude --resume            # 선택 목록
claude --resume <이름|ID>  # 특정 세션 바로 열기

세션 안에서는 /resume으로 다른 대화로 옮겨 간다. 목록에서 Ctrl+A를 누르면 모든 프로젝트, Ctrl+W를 누르면 모든 worktree로 범위가 넓어진다. claude -p로 실행한 비대화형 세션은 목록과 --continue에서 빠진다

세션이 많아지면 “인사”, “대화 시작” 같은 자동 제목으로는 찾기 어렵다. /rename 견종-목록-추가처럼 이름을 붙이거나, 시작할 때 claude -n <이름>으로 지정한다. 강의에서 이름을 바꾼 뒤 claude --resume을 다시 실행하자 목록이 훨씬 알아보기 쉬워졌다

Claude가 쓴 코드를 믿을 근거는 검증 단계에서 나오므로, 커밋 전에 읽기·리뷰·실행 확인을 거치고 되돌릴 기준점을 남겨 둔다


출처와 범위

nomadcoders

참고 자료