강동민
가이드 목록
전편 통합 · 단일 문서

클로드코드 완전가이드

처음 켜는 사람부터 조직에 표준으로 깔려는 사람까지, 자기 위치를 찾아 그 자리에서 다음 한 걸음을 밟는 한국어 정본입니다.

8부 · 57장 · 185절 출처 라벨 1184개 근거 각주 1107개 공식 문서 140편 인용
공식 공식 문서에 있는 사양입니다.
관행 현장에서 반복 확인된 사용법입니다.
실전 직접 돌려 본 결과입니다.
0부어디서 시작할지 1부L0 클로드코드 시작하기 2부L1 일상 운전 3부L2 맥락과 통제 4부L3 확장 5부L4 오케스트레이션 6부L5 프로그래밍 자동화 7부L6 조직 도입 부록A~H
0부

어디서 시작할지 고른다

이 가이드를 읽는 법, 역할별 세 트랙, 5분 자기진단, 표면 선택, 갱신 추적

마치면
자기 레벨과 읽을 순서를 정한다
범위
0.1~0.5절
이 편의 성격. 이 편은 고르는 편입니다. 읽고 배우는 것은 다음 편부터입니다. 자기 레벨을 찾고, 역할에 맞는 경로를 정하고, 필요할 때 되돌아와 부록을 찾아보는 자리입니다. 처음이라면 아래 0.3절의 진단 6문항부터 답하고, 나온 레벨로 바로 넘어가면 됩니다.
0

시작하기 전에

0.1이 가이드를 읽는 법

이 시리즈는 공식 문서를 대체하려고 만든 것이 아닙니다. 공식 문서는 기능별로 배열돼 있어서 무엇이 있는지 찾기에는 좋지만, 지금 내 수준에서 다음에 무엇을 배워야 하는지는 알려주지 않습니다. 여기서 한 일은 같은 내용을 능력 단계 순으로 다시 깔아 놓은 것입니다. 어떤 사실이 의심스러우면 각 문단 끝의 각주를 눌러 원문을 확인하시면 됩니다. 정본은 항상 공식 문서입니다.

실전기준으로 삼은 공식 문서는 185편입니다. 본문 136편, Agent SDK 32편, 주간 릴리스 다이제스트 17편입니다. 이 숫자는 공식 문서 색인 두 곳을 각각 받아 대조해 얻었고, 두 목록은 185편에서 정확히 일치했습니다. 아래 명령으로 같은 값을 다시 확인할 수 있습니다.

# 문서 목록 두 곳을 받아 편수를 센다(2026-08-11 기준 양쪽 모두 185)
curl -s https://code.claude.com/docs/llms.txt | grep -c '^- \[.*](https://code.claude.com/docs/'
curl -s https://code.claude.com/docs/sitemap.xml | grep -o '<loc>[^<]*/docs/en/[^<]*' | wc -l
색인에서 시작해 L0부터 L4까지 이어지는 본선과, L2에서 갈라지는 L6, L3에서 갈라지는 L5의 관계도 색인 지금 보고 있는 이 편 L0 시작 깔고 켜서 첫 한 건 L1 일상 운전 매일 쓰는 손놀림 L2 맥락과 통제 알려주기와 막기 L3 확장 없는 기능을 만들기 L4 오케스트레이션 여러 개를 동시에 L6 조직 도입 관리자면 여기서 갈라짐 L5 자동화 사람 없이 돌리기
레벨 7단. 왼쪽 줄기가 순서대로 밟는 본선이고, 오른쪽 둘은 갈래입니다. L6은 역할이 관리자라면 L2 다음에 바로 가도 되고, L5는 L3 다음에 L4를 건너뛰고 가도 됩니다.

각 편은 완료 기준을 하나씩 갖고 있습니다. 그 일을 실제로 해 봤으면 그 편은 끝난 것이고, 못 했으면 다음 편으로 넘어가도 겉핥기가 됩니다.

레벨이름진입 조건마치면 할 수 있는 것
L0시작없음자기 표면에서 세션을 열고 파일 하나를 고쳐 커밋합니다
L1일상 운전L0실무 한 건을 탐색부터 커밋과 리뷰까지 혼자 끝냅니다
L2맥락과 통제L1새 프로젝트의 지침 파일과 권한, 샌드박스를 30분 안에 세팅합니다
L3확장L2반복 작업을 스킬로, 검사를 훅으로, 외부 데이터를 MCP로 붙입니다
L4오케스트레이션L3한 작업을 병렬로 쪼개 돌리고 격리와 추적, 수렴까지 설계합니다
L5프로그래밍 자동화L3 (L4 권장)클로드코드를 파이프라인 부품으로 호출하고 SDK로 자기 에이전트를 만듭니다
L6조직 도입L2 (관리자면 바로)조직 표준 설정과 계측, 컴플라이언스, 도입 계획을 문서로 냅니다

여덟 편 모두 발행돼 있습니다. 화면 맨 위 고정 바에서 어느 편으로든 바로 갈 수 있고, 그 목록은 각 편의 본문 유무로 자동 생성되므로 이 본문보다 항상 최신입니다.

출처 라벨 3종

이 시리즈의 모든 실질 주장은 세 라벨 중 하나로 시작합니다. 근거의 등급을 문장 단위로 드러내려는 것입니다. 무엇을 그대로 믿고 무엇을 자기 환경에서 다시 확인해야 하는지가 읽는 중에 바로 보입니다.

라벨뜻독자가 할 일
공식공식 문서에 그렇게 적혀 있습니다. 각주에 근거 문서를 답니다그대로 믿되, 버전이 다르면 각주로 확인합니다
관행독립 출처 2곳 이상에서 반복 확인된 사용법입니다자기 상황에 맞는지 한 번 판단합니다
실전직접 돌려 본 결과입니다. 환경과 명령을 본문에 밝힙니다같은 명령으로 자기 값을 재 봅니다

실전이 규격이 실제로 어떻게 지켜지고 있는지도 재 봤습니다. 지금 발행된 네 편(L0부터 L3)의 본문에는 라벨이 617건 붙어 있고, 그중 공식 564건, 관행 19건, 실전 34건입니다. 인용한 공식 문서는 고유 61편으로, 전체 185편의 33퍼센트입니다. 분포가 공식 쪽으로 크게 기울어 있다는 뜻이고, 이는 약점입니다. 현장 관행과 직접 실행 근거가 더 필요합니다. 같은 값은 아래 명령으로 셀 수 있습니다.

# 발행된 편의 본문에서 라벨 종류별 개수와 인용 문서 수를 센다
grep -o 'class="src \(official\|field\|own\)"' L*/index.html | sort | uniq -c
grep -o 'https://code.claude.com/docs/en/[a-z-]*' L*/index.html | sort -u | wc -l
라벨이 없는 문장은 무엇인가요. 연결 문장과 설명 문장에는 라벨을 붙이지 않습니다. 라벨은 검증 가능한 사실 주장에만 붙습니다. 문단 전부에 배지가 달려 있으면 오히려 라벨이 정보를 잃은 상태입니다.

안 읽어도 되는 편

7편을 다 읽어야 하는 사람은 없습니다. 아래는 건너뛰어도 되는 경우입니다.

  • 혼자 쓰고 팀에 배포할 일이 없다면 L6은 넘어갑니다.
  • CI나 스크립트에서 부를 계획이 없다면 L5는 필요할 때 옵니다.
  • 한 작업이 한 세션 안에서 끝나는 규모라면 L4도 미뤄도 됩니다.
  • 반대로 L1과 L2는 건너뛰지 않는 편이 좋습니다. 이 두 편을 비우고 L3의 확장 기능을 배우면, 잘못된 지시와 넓은 권한을 그대로 증폭하게 됩니다.

0.2역할별 3트랙

레벨은 순서지만, 어디까지 갈지는 역할이 정합니다. 세 갈래로 나눠 두었습니다. 자기 역할이 둘에 걸쳐 있으면 더 넓은 쪽을 고르면 됩니다.

트랙누구순서이 트랙의 완료 지점
혼자 쓰는 실무자 자기 코드베이스에서 매일 쓰는 개발자 L0 → L1 → L2 → L3 반복 작업 하나가 스킬이나 훅으로 옮겨져 손을 떠난 상태
팀 리드 남의 세션까지 설계하고 규모 있는 작업을 쪼개는 사람 L0 → L1 → L2 → L3 → L4 한 작업이 병렬로 쪼개져 돌고, 결과가 한 곳으로 수렴되는 구조
조직 관리자 도입과 정책, 비용과 컴플라이언스를 정하는 사람 L0(맛보기) → L2 → L6, 이후 L1 조직 표준 설정과 계측, 승인 정책이 문서로 나온 상태

관리자 트랙만 순서가 다릅니다. L1을 뒤로 미루는 이유는 관리자가 결정해야 하는 것이 손놀림이 아니라 경계이기 때문입니다. 다만 L0은 건너뛰지 않는 편이 좋습니다. 한 번도 세션을 열어 보지 않고 정책을 정하면, 실제로 아무도 쓰지 못하는 규칙이 나옵니다.

공식관리자 트랙이 실무자 트랙과 갈리는 실제 이유는 가용 기능이 인증 방식과 플랜에 따라 달라진다는 점입니다. 클로드코드 CLI와 로컬에서 도는 것은 모든 공급자에서 동작하지만, 웹과 모바일, 데스크톱, Slack 연동, 리모트 컨트롤, 컴퓨터 조작, 아티팩트는 claude.ai 계정 로그인을 요구합니다. API 키나 제3자 공급자로는 닿지 않습니다. feature-availability

공식플랜 안에서도 갈립니다. 컴퓨터 조작과 디스패치는 Pro와 Max에만 있고 Team과 Enterprise에는 없습니다. 반대로 코드 리뷰와 사용량 분석 대시보드, 서버 관리형 설정은 Team과 Enterprise에만 있습니다. 리모트 컨트롤과 채널은 Team과 Enterprise에서 관리자가 켜야 열립니다. feature-availability

먼저 확인할 것. 어느 트랙이든 자기 인증 방식을 먼저 알아야 합니다. claude.ai 계정인지, Anthropic 콘솔 API 키인지, Amazon Bedrock이나 Google Cloud, Microsoft Foundry인지에 따라 이 가이드에서 설명하는 기능의 일부가 자기 환경에는 없을 수 있습니다. 대조표는 부록 C에 있습니다.

왜 확장보다 손놀림이 먼저인가

실전이 순서가 취향이 아니라는 근거를 하나 두겠습니다. 필자가 클로드코드로 운영하는 작업 볼트의 로그를 재 봤습니다. 2026-07-07부터 2026-08-11까지 기록된 응답 턴 1,858건에서, 도구 호출은 Bash 12,154회, Edit 7,028회, Read 3,586회, Write 2,132회로 기본 도구가 압도적입니다. 반면 스킬이 발동한 턴은 73건(3.9퍼센트), 서브에이전트를 쓴 턴은 93건(5.0퍼센트)입니다. 스킬과 훅과 서브에이전트를 갖춰 놓은 환경에서도 실제 시간의 대부분은 읽고 고치고 돌리는 기본 동작에 쓰입니다.

읽는 방식이 여기서 나옵니다. 확장을 먼저 배우면 3.9퍼센트를 다듬으면서 96퍼센트를 방치하게 됩니다. L1과 L2가 그 96퍼센트를 다룹니다. L3의 확장은 그 기본 동작 중 반복이 확인된 것을 도구로 옮기는 작업이고, 반복이 확인되기 전에는 옮길 대상 자체가 없습니다.

실습

자기 사용 분포 재 보기

자기 세션 기록에서 같은 값을 셀 수 있습니다. 트랜스크립트는 ~/.claude/projects/ 아래에 프로젝트별로 쌓입니다.

  1. 세션 기록이 몇 개 쌓였는지 봅니다.
    ls ~/.claude/projects/*/*.jsonl | wc -l
  2. 도구별 호출 빈도를 셉니다. 상위 몇 개가 자기 작업의 실체입니다.
    grep -ho '"name":"[A-Za-z_]*"' ~/.claude/projects/*/*.jsonl \
      | sort | uniq -c | sort -rn | head -15
  3. 상위 3개가 Bash, Edit, Read 계열이라면 L1과 L2가 자기 투자 대상입니다.

확인 자기 상위 도구 목록을 보고, 지금 읽으려던 편이 그 도구를 다루는 편인지 확인했습니다.


0.35분 자기진단

6문항입니다. 각 문항은 "안다"가 아니라 "해 봤다"를 묻습니다. 읽어서 아는 것과 손으로 해 본 것은 다음 편에서 갈립니다. 솔직하게 세면 5분 안에 끝납니다.

번호질문아니라면
1 클로드코드로 파일 하나를 고쳐 커밋까지 끝낸 적이 있습니까 L0 시작
2 대화가 길어졌을 때 /context로 무엇이 자리를 먹고 있는지 본 적이 있습니까 L1 일상 운전
3 이 프로젝트에 지침 파일(CLAUDE.md)이 있고, 최근에 거기서 줄을 지운 적이 있습니까 L2 맥락과 통제
4 승인 프롬프트를 매번 누르는 대신 권한을 규칙으로 적어 둔 것이 있습니까 L2 맥락과 통제
5 반복해 입력하던 지시 하나를 스킬이나 훅으로 옮긴 적이 있습니까 L3 확장
6 한 작업을 여러 세션이나 서브에이전트로 쪼개 돌린 적이 있습니까 L4 오케스트레이션
채점
  • 1번이 아니오라면 L0부터입니다. 다른 문항은 볼 필요가 없습니다.
  • 1번만 예라면 L1입니다. 여기가 가장 흔한 자리입니다.
  • 2번까지 예라면 L2입니다.
  • 3, 4번 중 하나라도 아니오라면 L3으로 넘어가기 전에 L2를 먼저 봅니다.
  • 4번까지 예라면 L3입니다.
  • 5번까지 예이고 6번이 아니오라면 L4입니다.
  • 전부 예라면 L5나 L6에서 자기에게 필요한 쪽을 고릅니다. 이 경우 부록 A와 부록 F만 훑어도 얻는 것이 있습니다.

3번과 4번이 함께 묶인 이유가 있습니다. 지침 파일을 만들어 두는 것과 그것을 줄여 본 것은 다른 능력입니다. 권한도 같습니다. 승인 버튼을 누르는 것과 규칙을 적는 것은 다른 일이고, 규칙을 적기 시작하면 자기가 무엇을 허용하고 있었는지 처음 보게 됩니다.

진단을 자기 프로젝트에 적용하기

기억에 의존하지 않고 파일로 확인할 수 있습니다. 아래 명령이 3번부터 6번까지의 답을 대신 냅니다.

# 3번: 지침 파일이 있는가
ls CLAUDE.md .claude/CLAUDE.md ~/.claude/CLAUDE.md 2>/dev/null

# 4번: 권한 규칙을 적어 뒀는가(빈 결과면 규칙이 없다)
grep -o '"\(allow\|deny\|ask\)"' .claude/settings*.json ~/.claude/settings.json 2>/dev/null

# 5번: 스킬·훅·서브에이전트가 있는가
ls .claude/skills/*/SKILL.md .claude/agents/* 2>/dev/null
grep -o '"\(PreToolUse\|PostToolUse\|Stop\|SessionStart\|UserPromptSubmit\)"' \
  .claude/settings.json ~/.claude/settings.json 2>/dev/null | sort -u

# 6번: 워크트리로 병렬 세션을 돌린 적이 있는가
ls .claude/worktrees 2>/dev/null

실전같은 진단을 필자의 작업 볼트에 돌린 결과를 그대로 적어 둡니다. 지침 파일 9개(그중 계층 거버넌스로 실제 동작하는 것 6개), 훅 핸들러 10개(SessionStart 7, Stop 2, UserPromptSubmit 1), 스킬 2개, 서브에이전트 1개, 활성 플러그인 2개, MCP 서버는 사용자 스코프 1개이고 프로젝트 .mcp.json은 없습니다. 워크트리와 워크플로 정의는 0개입니다. 진단 결과는 L3 진행 중, L4 미착수입니다.

실전같은 측정에서 드러난 결함도 함께 적습니다. 권한 규칙이 프로젝트 설정에는 0건이고, 로컬 설정에 allow만 16건 쌓여 있으며 deny와 ask는 각각 0건입니다. 이것은 권한을 설계한 상태가 아니라 승인할 때마다 자동으로 누적된 상태입니다. 4번 문항에 "예"라고 답할 뻔했지만, 파일을 열어 보니 아니었습니다. 진단을 파일로 하라고 쓴 이유가 이것입니다.


0.4표면 선택 요약

공식클로드코드는 어디서 실행하든 같은 엔진을 씁니다. 표면이 다른 것은 작업 방식에 맞춘 껍데기입니다. 실행 위치는 6곳입니다. platforms

표면이럴 때얻는 것
CLI터미널 중심 작업, 스크립팅, 원격 서버기능이 가장 완전합니다. Agent SDK와 스크립팅은 CLI 전용입니다
데스크톱변경을 눈으로 검토하고 세션을 여러 개 병렬로차이 보기, 앱 미리보기, Pro와 Max에서 컴퓨터 조작과 디스패치
VS Code편집기를 떠나지 않고 쓰기인라인 차이, 통합 터미널, 파일 맥락
JetBrainsIntelliJ, PyCharm, WebStorm 등차이 보기, 선택 영역 공유, 터미널 세션
웹오래 걸리고 손이 덜 가는 작업, 오프라인에도 계속돼야 하는 일클라우드 실행, 접속을 끊어도 계속 진행
모바일컴퓨터를 떠나 시작하거나 지켜볼 때클라우드 세션, 로컬 세션은 리모트 컨트롤, Pro와 Max에서 데스크톱으로 디스패치

공식같은 프로젝트에서 표면을 섞어 쓸 수 있습니다. 로컬 표면끼리는 설정과 프로젝트 메모리, MCP 서버가 공유됩니다. 다만 클라우드 세션은 저장소를 새로 클론한 상태에서 시작하고 내 기기의 ~/.claude/를 읽지 않습니다. platforms glossary

공식Slack과 Chrome은 표면이 아니라 표면에 붙는 연동입니다. 연동은 여섯 종이 정리돼 있습니다. Chrome(로그인된 브라우저 조작), GitHub Actions, GitLab CI/CD, 코드 리뷰(모든 PR 자동 검토), Slack(@Claude 멘션 응답), Claude Tag(조직 공용 신원으로 동작)입니다. platforms

고르는 규칙

확신이 없으면 CLI로 시작합니다

공식공식 권고도 같습니다. 어디서 시작할지 모르겠으면 CLI를 설치해 프로젝트 디렉터리에서 실행하고, 터미널을 쓰고 싶지 않다면 데스크톱이 같은 엔진을 그래픽으로 제공합니다. platforms

관행표면을 먼저 고민하다 시작을 미루는 경우가 많습니다. 표면은 나중에 바꿔도 설정과 지침 파일이 그대로 따라오므로, 되돌리기 비용이 낮은 결정입니다. 먼저 한 건을 끝내고 불편한 지점이 생겼을 때 옮기는 편이 낫습니다.

표면별로 어떤 기능이 있고 없는지는 부록 C의 대조표에 정리해 두었습니다. 설치와 표면 고르기를 실제로 해 보는 것은 L0 2장과 3장입니다.


0.5무엇이 최근에 바뀌었나

클로드코드는 주 단위로 바뀝니다. 그래서 이 가이드에서 가장 빨리 낡는 부분이 기능 목록이고, 독자가 직접 최신을 확인하는 방법을 아는 것이 그 목록을 외우는 것보다 오래 쓰입니다. 공식 갱신 창구는 두 개인데 역할이 다릅니다.

창구담는 것읽는 방식
changelog 버전별 릴리스 노트 전량. 버그 수정과 사소한 개선까지 들어갑니다 자기 버전 이후 항목만 봅니다. 특정 동작이 바뀐 이유를 찾을 때
주간 다이제스트 일하는 방식을 바꿀 만한 기능만 주 단위로 골라 정리합니다 주 1회 훑습니다. 무엇을 새로 배울지 고를 때

공식주간 다이제스트는 각 주 항목에 버전 범위가 붙어 있습니다. 예를 들어 29주 항목은 v2.1.207부터 v2.1.212까지에 해당합니다. 자기 버전보다 나중 범위의 기능은 아직 없는 것이므로, 안 되는 기능을 붙잡고 설정을 뒤지기 전에 이 범위를 먼저 봅니다. whats-new

공식changelog는 GitHub의 CHANGELOG.md에서 생성됩니다. 자기 버전은 claude --version으로 확인합니다. changelog

claude --version

공식이 가이드가 기준으로 삼은 시점의 최신 버전은 2026-08-08 배포된 v2.1.226입니다. 최근 세 주의 굵은 변화는 이렇습니다. 29주에는 발행한 아티팩트가 보는 사람 각자의 MCP 커넥터로 실시간 데이터를 끌어오게 됐고, 스크린 리더 모드가 추가됐습니다. 28주에는 데스크톱에 내장 브라우저가 들어오고 /doctor가 진단에서 수정 제안까지 하는 설정 점검으로 확장됐습니다. 27주에는 Claude Sonnet 5가 기본 모델이 되고, Chrome 연동이 정식 출시되고, 서브에이전트가 기본으로 백그라운드에서 돌게 됐습니다. changelog whats-new

버전 차이로 생기는 착각. 문서에 있는데 내 환경에서 안 되는 경우, 원인은 대개 셋 중 하나입니다. 버전이 낮거나, 인증 방식이 그 기능을 지원하지 않거나(부록 C), 플랜에 없는 기능입니다. 설정을 뒤지기 전에 이 셋을 먼저 지웁니다.

이 가이드 자체를 어떻게 최신으로 유지하는지, 그리고 독자가 직접 대조하는 절차는 부록 G에 적어 두었습니다.



1부 · L0

클로드코드 시작하기

깔고 켜서 첫 한 건을 끝낸다

먼저 필요한 것
없습니다
마치면
자기 표면에서 세션을 열고 파일 하나를 고쳐 커밋한다
범위
1~4장
이 편의 성격. 이 편은 읽는 편이 아니라 한 번 끝까지 해 보는 편입니다. 클로드코드가 무엇인지 짧게 보고, 자기 표면을 고르고, 깔고, 세션을 열어 파일 하나를 고쳐 커밋까지 갑니다. 이론은 다음 편부터 붙습니다. 설치가 이미 끝났다면 3장으로 바로 가도 됩니다.
1

클로드코드가 무엇이고 무엇이 아닌가

1.1챗봇이 아니라 에이전트

공식클로드코드는 파일을 읽고, 코드를 고치고, 명령을 실행하고, 개발 도구와 연동하는 에이전틱 코딩 도구입니다. 터미널, IDE, 데스크톱 앱, 브라우저에서 쓸 수 있습니다. overview

공식일반 AI 채팅과 갈리는 지점은 도구입니다. 도구가 없으면 모델은 텍스트로만 답할 수 있고, 도구가 있으면 직접 행동할 수 있습니다. 공식 문서는 이 차이를 "당신이 직접 적용해야 하는 텍스트만 돌려주는 채팅형 보조"와 "스스로 파일을 읽고 명령을 실행하며 변경하는 방식"의 대비로 설명합니다. glossary

공식기본 도구는 크게 다섯 갈래입니다. how-claude-code-works

갈래클로드가 할 수 있는 일
파일 조작파일 읽기, 코드 수정, 새 파일 생성, 이름 변경과 재배치
검색패턴으로 파일 찾기, 정규식으로 내용 검색, 코드베이스 탐색
실행셸 명령 실행, 서버 기동, 테스트 실행, git 사용
웹웹 검색, 문서 가져오기, 오류 메시지 조회
코드 인텔리전스수정 후 타입 오류와 경고 확인, 정의로 이동, 참조 찾기(코드 인텔리전스 플러그인 필요)
개념

에이전틱 하네스

공식언어 모델을 유능한 코딩 에이전트로 바꿔 주는 도구, 맥락 관리, 실행 환경 전체를 말합니다. 클로드코드가 하네스이고 클로드는 그 안의 모델입니다. 하네스가 파일 접근, 셸 실행, 권한 게이트, 메모리 로딩, 행동을 이어 붙이는 루프를 제공합니다. glossary

1.2에이전트 루프

공식클로드는 모든 작업을 세 국면으로 돌립니다. 맥락 수집, 행동, 결과 검증. 그리고 끝날 때까지 반복합니다. 국면은 뚜렷이 나뉘지 않고 섞이며, 도구 사용 결과가 다음 판단의 재료가 됩니다. how-claude-code-works

공식"실패하는 테스트를 고쳐 주세요"라고 하면 실제로는 이런 순서가 돕니다. how-claude-code-works

  1. 테스트를 돌려 무엇이 실패하는지 봅니다.
  2. 오류 출력을 읽습니다.
  3. 관련 소스 파일을 찾습니다.
  4. 그 파일들을 읽어 코드를 이해합니다.
  5. 파일을 고쳐 문제를 해결합니다.
  6. 테스트를 다시 돌려 확인합니다.

공식사용자도 이 루프의 일부입니다. 언제든 끼어들어 방향을 틀 수 있습니다. Esc를 누르면 즉시 멈추고 실행 중이던 도구 호출이 취소됩니다. 멈추지 않고 교정만 주고 싶으면 정정 문장을 입력해 Enter를 누르면, 클로드가 현재 동작을 마친 직후 그것을 읽고 다음 판단을 바꿉니다. how-claude-code-works

이것이 이 가이드 전체의 뼈대입니다. 뒤에 나오는 거의 모든 기능은 이 루프의 어느 국면에 개입하는지로 설명됩니다. 지침 파일은 맥락 수집에, 권한은 행동에, 테스트와 검증 수단은 결과 검증에 붙습니다.

1.3잘하는 일과 못하는 일

공식코딩에 강하지만 코딩 전용은 아닙니다. 공식 문서는 "명령줄에서 할 수 있는 일이라면 무엇이든" 도울 수 있다고 적습니다. 문서 작성, 빌드 실행, 파일 검색, 주제 조사가 모두 여기 들어갑니다. how-claude-code-works

공식여러 파일에 걸친 작업이 특히 다릅니다. 현재 파일만 보는 인라인 코드 보조와 달리, 프로젝트 전체를 보기 때문에 관련 파일을 검색해 여러 개를 읽고 조율된 수정을 한 뒤 테스트로 확인하고, 요청하면 커밋까지 합니다. how-claude-code-works

반대로 처음 쓰는 사람이 자주 부딪히는 한계는 세 가지입니다. 셋 다 공식 문서가 명시한 동작이고, 뒤 레벨에서 다루는 기능들이 대부분 이 셋을 다루기 위한 것입니다.

한계무슨 일이 벌어지나출처
검증 수단이 없으면 스스로 끝났다고 판단합니다 테스트나 빌드처럼 클로드가 돌려 볼 수 있는 검사를 주면 통과할 때까지 반복합니다. 그런 검사가 없으면 한 번 시도한 뒤 스스로 다 됐다고 결론 내립니다. 공식 문서는 이것을 검증 루프라 부르고, 무인 실행의 전제 조건으로 둡니다. glossary
대화가 길어지면 초기 지시가 사라질 수 있습니다 맥락이 한계에 가까워지면 오래된 도구 출력을 먼저 지우고, 그다음 대화를 요약합니다. 요청과 핵심 코드는 보존되지만 대화 앞부분의 세부 지시는 유실될 수 있습니다. 그래서 계속 지켜야 할 규칙은 대화가 아니라 CLAUDE.md에 둡니다. how-claude-code-works
셸 명령으로 바뀐 파일은 되돌리기가 안 됩니다 되돌리기는 클로드의 파일 편집 도구가 만든 변경만 추적합니다. rm, mv, cp 같은 명령이 바꾼 것은 되돌릴 수 없습니다. checkpointing

1.4용어는 다섯 개면 충분합니다

공식 용어집에는 수십 개가 있지만, 첫날 필요한 것은 다섯 개입니다. 나머지는 그 기능을 쓸 때 그 자리에서 배우면 됩니다.

용어뜻
세션공식현재 디렉터리에 묶인 하나의 대화. 각자 독립된 맥락을 가집니다. 기록은 ~/.claude/projects/ 아래 저장됩니다.
표면공식클로드코드에 접근하는 자리. 터미널, VS Code, JetBrains, 데스크톱, claude.ai. 모든 표면이 같은 엔진을 씁니다.
컨텍스트 윈도우공식한 세션의 작업 기억. 대화 이력, 파일 내용, 명령 출력, 지침 파일, 자동 메모리, 불려온 스킬, 시스템 지시가 모두 여기 들어갑니다.
권한 모드공식그 세션의 기본 승인 동작. 터미널에서는 Shift Tab으로 순환합니다.
도구공식클로드가 취할 수 있는 행동 하나. 파일 읽기, 코드 수정, 셸 명령 실행 같은 것입니다. 도구가 있어야 에이전트가 됩니다.

정의 출처: glossary

참고. "슬래시 명령"과 "헤드리스 모드"는 공식 문서가 이름을 바꾼 구 표기입니다. 지금은 각각 명령과 비대화 모드로 부릅니다. 동작은 그대로이고, 예전 글이나 영상에서 옛 이름을 보게 되므로 알아 두면 검색이 편합니다. glossary

2

표면 고르기

2.1어디서 쓸 수 있나

공식어디서 쓰든 같은 엔진이 돕니다. 다른 것은 코드가 실행되는 위치와 조작 방식입니다. 로컬 표면끼리는 설정, 프로젝트 메모리, MCP 서버를 공유하므로 한 프로젝트에서 여러 표면을 섞어 쓸 수 있습니다. platforms

표면어떤 사람에게 맞나특징
터미널(CLI)터미널 작업, 스크립트, 원격 서버기능이 가장 완전합니다. 스크립팅과 Agent SDK는 CLI에만 있습니다.
데스크톱 앱시각적 검토, 병렬 세션, 설치 부담 최소화변경 비교 화면, 앱 미리보기. 터미널이 필요 없습니다.
VS Code터미널로 나가지 않고 편집기 안에서인라인 변경 비교, 통합 터미널, 파일 맥락.
JetBrainsIntelliJ, PyCharm, WebStorm 사용자변경 비교 화면, 선택 영역 공유, 터미널 세션.
웹많이 지켜보지 않아도 되는 긴 작업클라우드에서 돌아 접속을 끊어도 계속됩니다.
모바일컴퓨터에서 떨어져 있을 때 시작과 확인iOS·안드로이드 클로드 앱에서 클라우드 세션을 열거나 로컬 세션을 원격 조작합니다.

공식표면과 별개로 외부 서비스를 붙이는 통합이 있습니다. 브라우저를 조작하는 Chrome, CI에서 도는 GitHub Actions와 GitLab CI/CD, 모든 PR을 자동 리뷰하는 Code Review, 팀 채팅에서 @Claude를 부르는 Slack입니다. 공식 문서는 Slack과 Chrome 확장을 표면이 아니라 표면에 연결되는 통합으로 분류합니다. platforms

참고. 표면별 차이는 이 가이드의 색인 편 부록에 대조표로 따로 정리합니다. 이 편에서는 하나를 골라 설치하는 것까지만 다룹니다.

2.2처음이면 무엇으로 시작할까

공식공식 권고는 간단합니다. 어디서 시작할지 모르겠으면 CLI를 깔아 프로젝트 폴더에서 실행하고, 터미널을 쓰고 싶지 않다면 데스크톱 앱을 쓰라고 안내합니다. 데스크톱 앱은 같은 엔진을 그래픽 화면으로 제공합니다. platforms

관행실제로 갈리는 기준은 직무보다 터미널에 대한 거부감입니다. 터미널 창을 열어 명령을 한 줄 치는 것이 부담이 아니라면 CLI가 낫습니다. 기능이 가장 많고, 이후 자동화로 넘어갈 때 그대로 이어집니다. 반대로 터미널 자체가 진입 장벽이면 데스크톱 앱에서 시작해도 됩니다. 나중에 CLI를 깔아도 설정과 지침 파일을 공유하므로 다시 배우는 것이 아닙니다.

둘 다 깔아도 됩니다. 공식데스크톱 앱에는 클로드코드가 포함되어 있어 Node.js나 CLI를 따로 깔 필요가 없습니다. 터미널에서 claude를 쓰려면 CLI를 별도로 설치하면 되고, 두 개를 같은 프로젝트에서 동시에 돌릴 수 있으며 지침 파일, MCP 서버, 훅, 스킬, 설정을 공유합니다. desktop-quickstart

2.3계정과 요금제

공식클로드코드는 계정이 있어야 씁니다. Pro, Max, Team, Enterprise 구독이나 Claude Console 계정이 필요하고, 무료 Claude.ai 플랜에는 클로드코드 접근이 포함되지 않습니다. Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry 같은 서드파티 제공자를 쓸 수도 있습니다. setup

공식Console 계정으로 처음 로그인하면 비용 추적을 위해 Console에 "Claude Code" 워크스페이스가 자동으로 만들어집니다. quickstart

공식표면에 따라 요금제 조건이 붙는 기능이 있습니다. 데스크톱 앱은 유료 구독이 필요하고, 컴퓨터 조작과 Dispatch는 Pro와 Max에서 제공됩니다. platforms

확인할 것. 지원 국가 밖에서는 설치 중 App unavailable in region이 나옵니다. 이것은 설치 실패가 아니라 지역 제한입니다. troubleshoot-install

3

설치와 인증

3.1터미널: macOS, Linux, WSL

공식먼저 시스템 요구사항입니다. setup

항목요구사항
운영체제macOS 13.0 이상, Windows 10 1809 이상 또는 Windows Server 2019 이상, Ubuntu 20.04 이상, Debian 10 이상, Alpine Linux 3.19 이상
하드웨어메모리 4GB 이상, x64 또는 ARM64 프로세서
네트워크인터넷 연결 필요
셸Bash, Zsh, PowerShell, CMD

공식권장 설치는 네이티브 설치 스크립트입니다. setup

macOS, Linux, WSL

curl -fsSL https://claude.ai/install.sh | bash

공식Homebrew로도 깔 수 있습니다. 캐스크가 두 개이고 받는 버전이 다릅니다. claude-code는 안정 채널로 보통 1주 정도 뒤처지며 큰 회귀가 있는 릴리스를 건너뜁니다. claude-code@latest는 최신 채널로 나오는 즉시 받습니다. setup

brew install --cask claude-code

공식Debian, Fedora, RHEL, Alpine에서는 서명된 apt, dnf, apk 저장소로도 설치할 수 있습니다. setup

자동 업데이트 여부가 설치 방법에 따라 다릅니다. 공식네이티브 설치는 백그라운드에서 자동 업데이트됩니다. Homebrew, WinGet, apt, dnf, apk 설치는 기본적으로 자동 업데이트되지 않으므로 직접 올려야 합니다(Homebrew는 brew upgrade claude-code). 보안 수정도 여기 포함되니 수동 설치 경로를 골랐다면 주기적으로 올리세요. setup

설치 확인

claude --version

공식정상이면 2.1.211 (Claude Code)처럼 버전 번호와 (Claude Code)가 출력됩니다. setup

3.2터미널: Windows

공식Windows는 설치 명령이 셸에 따라 다릅니다. PowerShell과 CMD는 문법이 달라 서로의 명령이 듣지 않습니다. setup

Windows PowerShell

irm https://claude.ai/install.ps1 | iex

Windows CMD

curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
지금 어느 셸인지 구분하는 법. 공식프롬프트가 PS C:\로 시작하면 PowerShell이고, PS 없이 C:\면 CMD입니다. The token '&&' is not a valid statement separator가 나오면 CMD 명령을 PowerShell에서 실행한 것이고, 'irm' is not recognized가 나오면 그 반대입니다. setup

공식WinGet도 지원합니다. 자동 업데이트는 되지 않으므로 winget upgrade Anthropic.ClaudeCode를 주기적으로 실행합니다. setup

winget install Anthropic.ClaudeCode

공식Windows에서는 네이티브로 돌릴지 WSL 안에서 돌릴지 고를 수 있습니다. 프로젝트가 어디 있는지와 어떤 기능이 필요한지로 결정합니다. setup

선택필요한 것샌드박스언제 쓰나
네이티브 Windows없음. Git for Windows는 선택지원되지 않습니다Windows 네이티브 프로젝트와 도구
WSL 2WSL 2 활성화지원됩니다리눅스 도구 체인, 샌드박스 명령 실행
WSL 1WSL 1 활성화지원되지 않습니다WSL 2를 쓸 수 없을 때

공식네이티브 Windows에서는 관리자 권한이 필요하지 않습니다. Git for Windows는 필수가 아니지만 설치하면 Git Bash를 제공해 Bash 도구가 켜집니다. 없으면 클로드코드가 PowerShell 도구로 셸 명령을 실행합니다. WSL 환경은 Git for Windows가 필요하지 않습니다. setup

데스크톱 앱을 쓸 계획이라면. 공식Windows에서 로컬 세션이 동작하려면 Git이 설치돼 있어야 합니다. 대부분의 맥은 Git이 기본 포함입니다. desktop-quickstart

화면을 그대로 따라가며 설치하고 싶다면 실제 캡처로 만든 별도 가이드가 있습니다.

3.3데스크톱 앱

공식데스크톱 앱에는 탭이 세 개 있습니다. Chat은 파일 접근이 없는 일반 대화, Cowork는 샌드박스 가상 머신에서 독립적으로 일하는 자율 백그라운드 에이전트, Code는 로컬 파일에 직접 접근하며 변경을 실시간으로 검토하고 승인하는 코딩 화면입니다. 클로드코드로 코딩하려면 Code 탭입니다. desktop-quickstart

공식첫 세션은 이 순서로 시작합니다. desktop-quickstart

  1. 설치하고 로그인한 뒤 상단 가운데 Code 탭을 누릅니다. 업그레이드 안내가 나오면 유료 플랜이 필요한 상태입니다.
  2. 실행 환경을 고릅니다. Local은 내 컴퓨터에서 내 파일로 돌립니다. 그 밖에 Cloud(앱을 닫아도 계속됨), SSH(원격 머신), Windows의 WSL이 있습니다.
  3. Select folder를 눌러 프로젝트 폴더를 고릅니다. 공식 문서는 잘 아는 작은 프로젝트로 시작하기를 권합니다.
  4. 보내기 버튼 옆 드롭다운에서 모델을 고릅니다. 나중에 같은 드롭다운에서 바꿀 수 있습니다.
  5. 할 일을 적습니다. 예: Find a TODO comment and fix it

공식Code 탭은 기본적으로 Manual 모드로 시작합니다. 클로드가 변경을 제안하고 승인을 기다리며, 어느 파일이 어떻게 바뀌는지 보여주는 변경 비교 화면과 Accept/Reject 버튼이 나옵니다. 승인하기 전까지 파일은 바뀌지 않습니다. 거부하면 클로드가 어떻게 다르게 진행할지 되묻습니다. desktop-quickstart

3.4VS Code와 JetBrains

공식VS Code 확장은 인라인 변경 비교, @멘션, 계획 검토, 대화 이력을 편집기 안에서 제공합니다. 확장 뷰에서 "Claude Code"를 검색해 설치하고(Cmd Shift X 또는 Ctrl Shift X), 명령 팔레트에서 "Claude Code"를 입력해 Open in New Tab을 고릅니다. overview

공식JetBrains 플러그인은 IntelliJ IDEA, PyCharm, WebStorm 등에서 변경 비교와 선택 영역 공유를 제공합니다. 이 플러그인은 클로드코드 CLI를 필요로 하며 CLI는 따로 설치합니다. overview

VS Code 통합 터미널에서 줄바꿈이 안 되면. 공식세션에서 /terminal-setup을 한 번 실행하면 Shift Enter 키 바인딩이 설정 파일에 기록됩니다. terminal-config

3.5웹과 모바일

공식웹은 로컬 설치 없이 브라우저에서 돌립니다. claude.ai/code에서 시작하며, 오래 걸리는 작업을 던져 두고 나중에 확인하거나, 로컬에 없는 저장소를 다루거나, 여러 작업을 병렬로 돌리는 데 맞습니다. iOS와 안드로이드 클로드 앱에서도 쓸 수 있습니다. overview

공식모바일은 그 클라우드 세션이나 원격 조작 중인 로컬 세션으로 들어가는 얇은 클라이언트입니다. platforms

클라우드 세션은 로컬 설정을 그대로 쓰지 않습니다. 공식내 컴퓨터에서 도는 세션은 로컬 지침 파일, 설정, 스킬을 읽지만, 클라우드 세션은 저장소를 새로 복제한 상태에서 시작하며 내 컴퓨터의 ~/.claude/를 읽지 않습니다. glossary

3.6로그인

공식설치 후 claude를 실행하면 첫 실행에서 브라우저 창이 열립니다. 브라우저가 자동으로 열리지 않으면 c를 눌러 로그인 주소를 클립보드에 복사한 뒤 붙여 넣습니다. 로그인이 끝나면 터미널에 Login successful이 표시되고 Enter를 누르라는 안내가 나옵니다. authentication

브라우저가 코드를 보여주고 끝나면. 공식그 코드를 터미널의 Paste code here if prompted 자리에 붙여 넣습니다. 브라우저가 클로드코드의 로컬 콜백 서버에 닿지 못할 때 생기며, WSL2, SSH 세션, 컨테이너에서 흔합니다. authentication

공식계정을 바꾸거나 다시 인증하려면 세션 안에서 /login, 로그아웃은 /logout입니다. 로그아웃은 첫 실행 설정 상태도 초기화하므로 다음 실행에서 로그인과 초기 설정을 다시 안내합니다. authentication

구독이 있는데 인증이 실패하면 환경 변수를 먼저 보세요. 공식ANTHROPIC_API_KEY가 설정돼 있으면 클로드코드는 로그인 절차를 건너뛰고 그 키를 승인할지 묻습니다. 승인된 키는 구독보다 우선하므로, 그 키가 비활성 조직에 속해 있으면 인증이 실패합니다. unset ANTHROPIC_API_KEY로 구독으로 되돌리고 /status로 현재 어떤 방식이 쓰이는지 확인합니다. authentication

공식자격 증명 저장 위치는 운영체제마다 다릅니다. macOS는 암호화된 키체인, Linux는 ~/.claude/.credentials.json(파일 모드 0600), Windows는 %USERPROFILE%\.claude\.credentials.json이며 사용자 프로필 디렉터리의 접근 제어를 따릅니다. authentication

3.7설치가 막힐 때

공식먼저 진단 명령 두 개입니다. claude --version이 버전을 찍는지 보고, 더 자세히 보려면 claude doctor를 실행합니다. 세션을 시작하지 않고 설치 상태, 설정 파일 검증 오류, 경고와 권장 조치를 읽기 전용으로 출력합니다. setup

claude doctor

공식공식 문서에 증상별 대응표가 있습니다. 처음 설치에서 자주 나오는 것만 옮기면 다음과 같습니다. troubleshoot-install

보이는 것원인과 방향
command not found: claude 또는 'claude' is not recognizedPATH 문제입니다. 설치 디렉터리를 PATH에 넣고 터미널을 새로 엽니다.
syntax error near unexpected token '<', curl: (22) ... error: 403설치 스크립트 대신 HTML이 내려온 경우입니다. 네트워크나 프록시가 가로막고 있습니다.
irm is not recognized 또는 && is not valid셸에 맞지 않는 설치 명령입니다. 3.2의 셸 구분법을 보세요.
Killed 또는 exit code 137 (Linux)메모리가 부족합니다. 메모리를 확보하거나 스왑을 추가합니다.
TLS connect error, unable to get local issuer certificateCA 인증서 문제입니다. 사내망이면 회사 CA 설정이 필요합니다.
Claude Code on Windows requires either Git for Windows (for bash) or PowerShell셸이 없습니다. Git for Windows를 설치하거나 PowerShell을 씁니다.
Cask 'claude-code' is unavailableHomebrew가 오래됐습니다. Homebrew를 갱신합니다.
PowerShell 설치가 끝났는데 claude가 없거나 옛 버전설치 디렉터리를 PATH에 추가하고 새 터미널을 엽니다.
App unavailable in region지원 국가가 아닙니다.
OAuth error 또는 403 Forbidden인증 문제입니다. 3.6의 환경 변수 확인부터 하세요.

전체 표와 각 항목의 해결 절차는 공식 문서에 있습니다: troubleshoot-install

3.8터미널 다듬기

공식클로드코드는 설정 없이 어느 터미널에서나 돕니다. 이 절은 특정 동작이 기대와 다를 때만 필요합니다. terminal-config

줄바꿈이 안 될 때

공식Enter는 전송입니다. 줄바꿈은 Ctrl J를 누르거나 \를 입력한 뒤 Enter를 누르면 되고, 이 둘은 모든 터미널에서 설정 없이 동작합니다. Shift Enter는 터미널에 따라 다릅니다. terminal-config

터미널Shift+Enter 줄바꿈
Ghostty, Kitty, iTerm2, WezTerm, Warp, Apple Terminal, Windows Terminal설정 없이 동작합니다
VS Code, Cursor, Devin Desktop, Alacritty, Zed/terminal-setup을 한 번 실행합니다
gnome-terminal, PyCharm 등 JetBrains IDE쓸 수 없습니다. Ctrl J 또는 \ 다음 Enter를 씁니다

작업이 끝난 것을 소리로 알고 싶을 때

공식기본적으로 데스크톱 알림은 Ghostty, Kitty, iTerm2에서만 나갑니다. 다른 터미널에서는 설정으로 터미널 벨을 켤 수 있습니다. terminal-config

~/.claude/settings.json

{
  "preferredNotifChannel": "terminal_bell"
}

tmux 안에서 쓸 때

공식tmux 안에서는 두 가지가 기본적으로 깨집니다. Shift Enter가 줄바꿈 대신 전송되고, 데스크톱 알림과 진행 표시가 바깥 터미널에 닿지 않습니다. ~/.tmux.conf에 아래를 넣고 tmux source-file ~/.tmux.conf로 적용합니다. terminal-config

~/.tmux.conf

set -g allow-passthrough on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'

그 밖에

  • 공식macOS에서 Option 키 단축키가 먹지 않으면 터미널의 "Use Option as Meta Key" 설정을 켭니다(iTerm2는 Left/Right Option을 "Esc+"로).
  • 공식화면이 깜박이거나 스크롤이 튀면 /tui fullscreen으로 전체화면 렌더링으로 바꿉니다. 설정이 저장되고 이후 세션도 그 모드로 시작합니다.
  • 공식색 테마는 /theme로 고릅니다. 자동 옵션은 터미널의 밝은·어두운 배경을 감지합니다.
  • 공식800자 또는 두 줄을 넘겨 붙여 넣으면 입력창이 [Pasted text #1 +120 lines]처럼 접힙니다. 전체 내용은 전송될 때 그대로 들어갑니다. 파일 전체나 긴 로그처럼 아주 큰 입력은 붙여 넣지 말고 파일로 저장한 뒤 읽으라고 하는 편이 낫습니다.

출처: terminal-config


4

첫 세션 관통

4.1첫 질문에서 첫 수정까지

공식작업할 프로젝트 폴더로 이동해 실행합니다. quickstart

cd /path/to/your/project
claude

공식프롬프트 위에 버전, 현재 모델, 작업 디렉터리가 표시됩니다. /help로 쓸 수 있는 명령을 보고, /resume으로 이전 대화를 이어갈 수 있습니다. quickstart

공식첫 질문은 코드베이스 파악으로 시작하는 것이 좋습니다. 공식 문서가 제시하는 예시는 이런 것들입니다. 클로드코드는 필요한 만큼 프로젝트 파일을 알아서 읽으므로 맥락을 직접 넣어 줄 필요가 없습니다. quickstart

what does this project do?
what technologies does this project use?
where is the main entry point?
explain the folder structure

관행한국어로 물어도 됩니다. 지시 언어와 응답 언어는 설정으로 바꿀 수 있고, 위 예시는 공식 문서 원문이라 영어로 옮겼습니다.

공식다음은 실제 수정입니다. 이렇게 지시하면 클로드코드는 적절한 파일을 찾고, 제안할 변경을 보여주고, 권한 모드에 따라 승인을 요청한 뒤, 수정합니다. quickstart

add a hello world function to the main file
실습

첫 한 건을 끝까지 관통하기

  1. 잘 아는 작은 프로젝트 폴더에서 claude를 실행합니다. 없으면 빈 폴더를 만들고 git init만 해도 됩니다.
  2. 이 폴더 구조를 설명해 주세요라고 물어 읽기만 하는 동작을 먼저 봅니다.
  3. 파일 하나를 고치게 합니다. 예: README에 이 프로젝트 한 줄 소개를 추가해 주세요
  4. 승인 화면에서 무엇이 바뀌는지 확인하고 승인합니다.
  5. 방금 바꾼 것을 설명이 담긴 메시지로 커밋해 주세요로 커밋합니다.
  6. Esc를 두 번 눌러 되돌리기 메뉴가 열리는 것까지 확인합니다(되돌리지 않고 Never mind로 나옵니다).

완료 판정. git 로그에 커밋 하나가 남고, 그 변경을 내가 승인 화면에서 보고 통과시켰다는 사실을 설명할 수 있습니다.

4.2승인 화면 읽는 법

공식클로드가 파일을 바꾸기 전에 물어보는지는 권한 모드가 정합니다. 터미널에서는 Shift Tab으로 모드를 순환합니다. how-claude-code-works

모드무엇이 자동인가언제 쓰나
Manual (기본)아무것도 자동이 아닙니다. 파일 수정과 셸 명령 전부를 물어봅니다.처음, 그리고 낯선 저장소
Accept edits파일 수정과 mkdir, mv 같은 흔한 파일시스템 명령을 묻지 않고 실행합니다. 그 밖의 명령은 여전히 물어봅니다.범위가 좁고 되돌릴 수 있을 때
Plan탐색하고 계획만 제시하며 원본 파일을 고치지 않습니다.큰 변경 전에 방향을 먼저 볼 때
Auto백그라운드 안전 검사로 모든 행동을 평가합니다. 별도 분류 모델이 검토하므로 대부분 승인 없이 실행되고, 위험한 행동은 차단됩니다.계정에 따라 제공됩니다

모드 설명 출처: how-claude-code-works, glossary

첫날에는 기본 모드를 그대로 두세요. 관행모드를 올리면 승인 횟수는 줄지만, 무엇이 자동으로 지나갔는지 배우기 전에 통제 감각을 잃습니다. 승인 화면을 몇 번 읽어 클로드가 어떤 종류의 행동을 하려 하는지 감을 잡은 뒤에 올리는 편이 낫습니다. 자주 쓰는 안전한 명령만 따로 허용하는 방법은 이 시리즈의 L2 맥락과 통제에서 다룹니다.

공식승인을 매번 받지 않으려면 .claude/settings.json에 특정 명령을 허용해 둘 수도 있습니다. npm test나 git status처럼 신뢰하는 명령에 유용합니다. how-claude-code-works

4.3첫 커밋

공식git 작업은 대화로 합니다. 공식 문서의 예시는 다음과 같습니다. quickstart

what files have I changed?
commit my changes with a descriptive message
create a new branch called feature/quickstart
show me the last 5 commits
help me resolve merge conflicts

공식클로드코드는 현재 브랜치, 커밋되지 않은 변경, 최근 커밋 이력을 볼 수 있습니다. 그래서 무엇이 바뀌었는지 묻는 것부터 커밋과 PR 생성까지 이어집니다. how-claude-code-works

여기까지 됐는지 확인
  • 세션이 열리고 프롬프트 위에 모델과 작업 디렉터리가 보입니다.
  • 파일 하나가 바뀌었고, 그 변경을 승인 화면에서 직접 보고 통과시켰습니다.
  • 커밋이 하나 남았고 git log에서 확인됩니다.

4.4되돌리기

공식클로드가 파일을 고치기 전에 그 파일의 현재 내용을 저장해 둡니다. 잘못됐으면 Esc를 두 번 누르거나 /rewind를 실행해 이전 상태로 돌아갈 수 있습니다. 체크포인트는 프롬프트를 보낼 때마다 하나씩 만들어집니다. checkpointing

입력창에 글자가 있으면 Esc 두 번은 입력을 지웁니다. 공식되돌리기 메뉴는 입력창이 비어 있을 때 열립니다. 지워진 글자는 입력 이력에 남으므로 Up으로 다시 불러올 수 있습니다. checkpointing

공식메뉴는 그 세션에서 보낸 프롬프트 목록을 보여주고, 지점을 고르면 아래 중에서 선택합니다. checkpointing

선택무엇이 되돌아가나
Restore code and conversation코드와 대화를 그 지점으로 되돌립니다
Restore conversation대화만 되돌리고 코드는 현재 상태를 유지합니다
Restore code파일 변경만 되돌리고 대화는 유지합니다
Summarize from here / up to here대화의 앞이나 뒤를 요약으로 압축해 맥락 공간을 확보합니다
Never mind아무것도 바꾸지 않고 목록으로 돌아갑니다

공식체크포인트는 대화와 함께 저장되므로 세션을 다시 열어도 /rewind가 됩니다. 한 세션에서 가장 최근 100개의 체크포인트를 유지하고, 세션과 함께 30일 후에 삭제됩니다. checkpointing

되돌리기로 복구되지 않는 것 네 가지. 공식셸 명령이 바꾼 파일, 서브에이전트가 만든 변경(대부분), 클로드코드 밖에서 직접 고친 파일, 심볼릭 링크와 하드 링크 경로입니다. 공식 문서는 체크포인트가 버전 관리의 대체가 아니라 세션 수준의 빠른 복구라고 명시합니다. 영구 이력과 협업은 git으로 하세요. checkpointing

공식세션을 끝내는 것은 /exit 또는 Ctrl D 두 번, 대화 이력을 비우는 것은 /clear입니다. /clear는 새 세션을 시작하며 이전 세션은 저장돼 /resume으로 다시 열 수 있습니다. quickstart, glossary

4.5화면 읽기와 음성 입력

공식스크린 리더로 쓰는 모드가 따로 있습니다. 그 모드에서는 클로드코드가 전체화면 렌더링 대신 항상 평범한 스크롤 텍스트로 출력합니다. accessibility, terminal-config

공식타이핑 대신 말로 입력할 수도 있습니다. /voice로 켜고, 키를 누르고 있는 동안 녹음하는 hold 방식과 한 번 눌러 시작하고 다시 눌러 전송하는 tap 방식이 있습니다. 기본은 hold이고 기본 키는 Space입니다. voice-dictation

/voice        켜기와 끄기를 번갈아, 현재 방식 유지
/voice hold   누르고 있는 동안 녹음
/voice tap    한 번 눌러 시작, 다시 눌러 전송
/voice off    끄기

공식한국어를 지원합니다(언어 코드 ko). 받아쓰기 언어는 클로드의 응답 언어를 정하는 language 설정을 함께 씁니다. 비어 있으면 영어로 동작하므로, 한국어로 말하려면 /config에서 언어를 먼저 지정합니다. voice-dictation

음성 입력에는 조건이 있습니다. 공식Claude.ai 계정으로 인증했을 때만 됩니다. API 키나 Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry로 설정한 경우에는 쓸 수 없습니다. 로컬 마이크가 필요하므로 웹이나 SSH 세션에서도 동작하지 않습니다. 녹음된 음성은 전사를 위해 Anthropic 서버로 전송되며 로컬에서 처리되지 않습니다. 전사는 메시지나 토큰을 소모하지 않습니다. voice-dictation

이 편을 마치며

첫 한 건이 끝났습니다

자기 표면을 고르고, 설치하고, 세션을 열고, 파일 하나를 고쳐 커밋까지 했습니다. 여기서부터는 같은 일을 더 빠르고 정확하게 하는 문제입니다.

이 편을 마치며

  • 내 표면을 골라 설치하고 claude --version으로 확인했습니다.
  • 로그인을 끝내고 /status로 어떤 인증이 쓰이는지 봤습니다.
  • 세션에서 코드베이스에 관해 질문해 답을 받았습니다.
  • 파일 하나를 고치고 승인 화면에서 직접 통과시켰습니다.
  • 대화로 커밋을 하나 만들었습니다.
  • 되돌리기 메뉴를 열어 봤고, 셸 명령 변경은 되돌아가지 않는다는 것을 압니다.

다음 편 L1 일상 운전은 지시하는 법, 입력창 접두어와 단축키, 명령 전량, git과 리뷰, 세션 관리, 비용 절약을 다룹니다. 그것까지 익히면 실무 한 건을 처음부터 끝까지 혼자 처리할 수 있습니다.

자주 막히는 곳

설치는 끝났다는데 claude를 못 찾습니다

셸이 새 경로를 아직 모르는 상태입니다. 터미널을 완전히 새로 열고 다시 시도하세요. 그래도 안 되면 설치 디렉터리가 PATH에 있는지 확인합니다. 공식 문서의 해당 항목은 troubleshoot-install에 있습니다.

구독을 쓰고 있는데 인증이 계속 실패합니다

ANTHROPIC_API_KEY가 환경에 설정돼 있는지 확인하세요. 승인된 API 키는 구독보다 우선하므로, 그 키가 비활성 조직에 속하면 실패합니다. unset ANTHROPIC_API_KEY 후 /status로 확인합니다.

승인 창이 너무 자주 뜹니다

정상 동작입니다. 기본 모드는 파일 수정과 셸 명령 전부를 물어봅니다. 첫날에는 그대로 두고 무엇을 물어보는지 익히는 편이 낫습니다. 줄이는 방법은 두 가지인데, 모드를 올리는 것과 특정 명령만 허용 목록에 넣는 것입니다. 후자가 안전하고, L2 맥락과 통제에서 다룹니다.

클로드가 만든 변경을 되돌렸는데 일부가 그대로입니다

되돌리기는 클로드의 파일 편집 도구가 만든 변경만 추적합니다. 셸 명령으로 지우거나 옮긴 파일, 서브에이전트가 만든 변경, 심볼릭 링크 경로는 복구되지 않습니다. 그래서 실제 작업에서는 git 커밋을 자주 남기는 편이 안전합니다.

긴 작업을 맡겼는데 다 됐다고 하면서 실제로는 안 됐습니다

검증 수단을 주지 않으면 스스로 끝났다고 판단합니다. 테스트, 빌드, 확인 명령처럼 클로드가 직접 돌려 볼 수 있는 검사를 함께 주면 통과할 때까지 반복합니다. 공식 문서는 이것을 검증 루프라 부르고 무인 실행의 전제로 둡니다.


2부 · L1

일상 운전

매일 쓰는 손놀림

먼저 필요한 것
L0 시작
마치면
실무 한 건을 탐색부터 커밋·리뷰까지 혼자 끝낸다
범위
5~11장
이 편을 지배하는 하나의 제약. 공식공식 문서는 대부분의 권장 사용법이 한 가지 제약에서 나온다고 명시합니다. 맥락이 빠르게 차고, 차오를수록 성능이 떨어진다는 것입니다. 대화 전체, 클로드가 읽은 모든 파일, 모든 명령 출력이 같은 공간에 쌓입니다. 디버깅 한 세션이나 코드베이스 탐색 한 번이 수만 토큰을 쓸 수 있습니다. 이 편의 거의 모든 절이 결국 이 제약을 어떻게 다루는지에 관한 것입니다. best-practices
5

지시하는 법

5.1좋은 지시의 구성요소

공식가장 중요한 하나는 검증 수단입니다. 공식 문서는 이렇게 적습니다. 클로드는 일이 다 된 것처럼 보이면 멈춥니다. 직접 돌려 볼 수 있는 검사가 없으면 "다 된 것처럼 보인다"가 유일한 신호이고, 사용자가 검증 루프가 됩니다. 통과와 실패를 내는 것을 주면 루프가 스스로 닫힙니다. best-practices

공식검사는 대화에서 클로드가 읽을 수 있는 신호를 내는 것이면 무엇이든 됩니다. 테스트 스위트, 빌드 종료 코드, 린터, 출력을 픽스처와 대조하는 스크립트, 디자인과 비교할 브라우저 스크린샷. best-practices

정리하면 지시에 네 가지가 들어갑니다.

요소무엇을 적나
목표무엇이 달라져야 하는가
범위어느 파일, 어느 시나리오까지인가
제약바뀌면 안 되는 것, 쓰지 말아야 할 것
검증 기준무엇이 통과하면 끝인가. 클로드가 직접 돌릴 수 있는 형태로

공식검사를 만든 뒤에는 그것이 얼마나 강하게 종료를 막을지 고를 수 있습니다. 한 프롬프트 안에서 검사를 돌리고 반복하라고 적는 것이 가장 가볍고, 세션 전체에 걸어 두는 것이 /goal이며(5.5), 결정적으로 막는 것이 Stop 훅입니다. 뒤로 갈수록 설정 비용이 늘고 주의 비용이 줄어듭니다. best-practices

결과가 아니라 증거를 요구하세요. 공식성공을 단언하는 대신 테스트 출력, 실행한 명령과 그 반환값, 결과 스크린샷을 보여 달라고 합니다. 증거를 검토하는 것이 검증을 직접 다시 하는 것보다 빠르고, 지켜보지 않은 세션에도 통합니다. best-practices

5.2같은 작업, 두 가지 지시

공식공식 문서가 제시하는 전후 대조입니다. 왼쪽이 흔한 지시이고 오른쪽이 같은 목적을 정확하게 적은 것입니다. 원문이 영어라 그대로 옮깁니다. best-practices

무엇을 더했나이렇게 쓰지 말고이렇게
검증 기준을 넣는다 implement a function that validates email addresses write a validateEmail function. example test cases: user@example.com is true, invalid is false, user@.com is false. run the tests after implementing
범위를 좁힌다 add tests for foo.py write a test for foo.py covering the edge case where the user is logged out. avoid mocks.
답이 있는 출처를 가리킨다 why does ExecutionFactory have such a weird api? look through ExecutionFactory's git history and summarize how its api came to be
기존 패턴을 가리킨다 add a calendar widget look at how existing widgets are implemented on the home page to understand the patterns. HotDogWidget.php is a good example. follow the pattern...
증상과 위치와 완료 상태를 준다 fix the login bug users report that login fails after session timeout. check the auth flow in src/auth/, especially token refresh. write a failing test that reproduces the issue, then fix it
증상이 아니라 원인을 고치라고 한다 the build is failing the build fails with this error: [paste error]. fix it and verify the build succeeds. address the root cause, don't suppress the error

공식다만 모호한 지시가 늘 나쁜 것은 아닙니다. 탐색 중이고 방향을 틀 여유가 있을 때는 what would you improve in this file? 같은 질문이 물어볼 생각조차 못 했던 것을 끌어냅니다. best-practices

5.3작업을 쪼개는 기준

공식큰 작업은 탐색, 계획, 구현, 커밋 네 국면으로 나누는 것이 권장 흐름입니다. 플랜 모드로 들어가 파일을 읽히고, 계획을 만들게 하고, 승인한 뒤 구현하게 하고, 마지막에 커밋합니다. best-practices

플랜 모드로 시작하기

claude --permission-mode plan

공식세션 중에는 Shift Tab으로 플랜 모드로 순환합니다. 플랜 모드가 켜져 있으면 상태 표시줄에 plan mode on이 보입니다. 계획을 편집기에서 직접 고치려면 Ctrl G를 누릅니다. best-practices

계획이 항상 이득은 아닙니다. 공식범위가 분명하고 수정이 작으면(오타 수정, 로그 한 줄 추가, 변수명 변경) 바로 시키는 편이 낫습니다. 공식 문서의 판정 기준은 한 문장입니다. 변경 내용을 한 문장으로 설명할 수 있으면 계획을 건너뜁니다. 계획이 값을 하는 것은 접근 방식이 불확실할 때, 여러 파일을 건드릴 때, 고칠 코드가 낯설 때입니다. best-practices

공식더 큰 기능이라면 클로드에게 먼저 나를 인터뷰하게 하는 방법도 있습니다. 최소한의 설명으로 시작해 기술 구현, 화면, 예외 상황, 트레이드오프를 캐묻게 하고 그 결과를 명세 파일로 쓰게 합니다. 그다음 새 세션에서 그 명세를 실행합니다. 새 세션은 구현에만 집중된 깨끗한 맥락을 갖습니다. best-practices

5.4중간 개입

공식가장 좋은 결과는 짧은 피드백 루프에서 나옵니다. 어긋나는 것이 보이면 즉시 교정하는 편이 더 나은 답을 더 빨리 만듭니다. best-practices

수단무엇을 하나
Esc진행 중인 응답과 도구 호출을 즉시 멈춥니다. 맥락은 보존되므로 방향만 틀면 됩니다.
정정 문장 + Enter멈추지 않고 보냅니다. 현재 동작이 끝나는 즉시 클로드가 읽고 다음 판단을 바꿉니다.
Esc Esc 또는 /rewind이전 지점으로 코드와 대화를 되돌립니다(10.3).
/clear관련 없는 작업으로 넘어갈 때 맥락을 비웁니다.
같은 문제로 두 번 넘게 교정했다면 멈추세요. 공식그 시점에는 맥락이 실패한 접근들로 오염돼 있습니다. 공식 문서의 처방은 명확합니다. /clear하고, 배운 것을 반영한 더 구체적인 프롬프트로 새로 시작합니다. 깨끗한 세션에 더 나은 프롬프트가, 교정이 쌓인 긴 세션보다 거의 항상 낫습니다. best-practices

공식맥락에 남기고 싶지 않은 짧은 질문은 /btw로 물어볼 수 있습니다. 답은 닫을 수 있는 오버레이로 표시되고 대화 이력에 들어가지 않습니다. best-practices

5.5목표를 붙잡아 두기

공식/goal은 완료 조건을 걸어 두는 명령입니다. 매 턴이 끝날 때마다 작고 빠른 모델이 조건이 충족됐는지 확인하고, 아니면 사용자에게 제어를 돌려주는 대신 클로드가 다음 턴을 시작합니다. 조건이 충족되면 목표는 자동으로 해제됩니다. goal

/goal all tests in test/auth pass and the lint step is clean

공식목표를 설정하면 그 조건 자체를 지시로 삼아 바로 한 턴이 시작됩니다. 별도 프롬프트가 필요 없습니다. 세션당 하나만 활성화되고, 인자 없이 /goal을 실행하면 조건, 경과 시간, 평가된 턴 수, 토큰 소비, 평가자의 최근 판단 이유를 보여줍니다. /goal clear로 해제합니다. goal

평가자는 도구를 쓰지 않습니다. 공식평가자는 명령을 실행하거나 파일을 독립적으로 읽지 않고, 클로드가 대화에 이미 드러낸 것만 보고 판단합니다. 그래서 조건은 클로드 자신의 출력으로 증명될 수 있는 형태로 써야 합니다. "test/auth의 모든 테스트가 통과한다"가 되는 이유는 클로드가 테스트를 돌리고 그 결과가 기록에 남기 때문입니다. goal

공식오래 버티는 조건에는 보통 세 가지가 들어갑니다. 측정 가능한 하나의 종료 상태(테스트 결과, 빌드 종료 코드, 파일 개수, 빈 대기열), 증명 방법의 명시(npm test가 0으로 끝난다), 그리고 도중에 바뀌면 안 되는 제약. 조건은 4,000자까지이고, or stop after 20 turns처럼 턴이나 시간 제한을 조건에 넣어 실행 길이를 묶을 수 있습니다. goal

공식목표는 권한을 바꾸지 않습니다. 기본 모드에서는 허용되지 않은 도구 호출마다 여전히 물어봅니다. goal

5.6판단이 어려울 때

공식어드바이저 도구는 클로드가 작업 중요 지점에서 두 번째, 보통 더 강한 모델에게 자문하게 합니다. 접근 방식을 확정하기 전, 같은 오류가 반복될 때, 작업을 완료로 선언하기 전이 그 지점입니다. 어드바이저는 모든 도구 호출과 결과를 포함한 전체 대화를 받고, 클로드는 받은 지침을 반영해 계속합니다. advisor

/advisor opus     어드바이저 모델 지정(설정에 저장됨)
/advisor          선택 목록 열기
/advisor off      끄기

공식어드바이저는 메인 모델과 같거나 더 강해야 합니다. 대표적인 조합은 Sonnet을 메인으로 두고 Opus를 어드바이저로 붙이는 것입니다. 루틴 작업은 Sonnet이 처리하고, 계획과 애매한 실패와 완료 판정만 Opus로 올립니다. advisor

언제 값을 하나. 공식대부분의 턴이 루틴이지만 계획의 질이 결과를 가르는 긴 다단계 작업에 맞습니다. 계획할 것이 적은 짧은 작업이나, 모든 턴에 최강 모델이 필요한 작업에서는 값이 덜하며 그때는 메인 모델을 바꾸는 편이 낫습니다. 실험 기능이고 Anthropic API에서만 동작합니다. advisor

6

대화 인터페이스 전부

6.1입력창 접두어

공식입력창의 첫 글자가 그 입력의 종류를 정합니다. interactive-mode

접두어무엇이 되나
@파일이나 디렉터리를 참조합니다. 클로드가 답하기 전에 그 파일을 읽습니다. 입력하면 경로 추천 메뉴가 열립니다.
/명령과 스킬을 부릅니다. 목록이 뜨고 Tab으로 완성됩니다.
!셸 명령을 직접 실행합니다. 이때 입력창 테두리 색이 바뀝니다.
#메모리에 적습니다.

공식@는 파일뿐 아니라 디렉터리와 MCP 리소스도 받습니다. 디렉터리는 목록을 주고 내용을 주지 않으며, MCP 리소스는 @server:resource 형식입니다. 한 메시지에 여러 개를 참조할 수 있습니다. common-workflows

@로 참조하면 그 파일 디렉터리와 상위 디렉터리의 CLAUDE.md도 함께 맥락에 들어옵니다. 공식의도한 동작이지만 맥락 비용이 있다는 것을 알아 두면 좋습니다. common-workflows

6.2핵심 단축키

공식전체 표는 공식 문서에 있고, 매일 쓰는 것만 옮깁니다. interactive-mode

키동작
Esc클로드를 중단하거나 열린 대화상자를 닫습니다. 대화상자가 열려 있으면 중단이 아니라 닫기입니다.
Esc Esc입력창에 글자가 있으면 지우고 이력에 저장합니다. 비어 있으면 되돌리기 메뉴를 엽니다.
Ctrl C실행 중이면 중단. 아무것도 없으면 첫 번째로 입력을 지우고 두 번째로 종료합니다.
Ctrl D세션 종료. 첫 번째에 확인 안내가 뜨고 800밀리초 안에 두 번째를 누르면 나갑니다.
Shift Tab권한 모드 순환. Windows에서 VT 입력 모드가 아니면 Alt M.
Ctrl O기록 뷰어 토글. 도구 사용과 실행 내역, 각 응답의 시각과 모델이 보입니다.
Ctrl R명령 이력 역방향 검색.
Ctrl G프롬프트를 기본 텍스트 편집기에서 엽니다.
Ctrl B실행 중인 작업을 백그라운드로 보냅니다(tmux에서는 두 번).
Ctrl V클립보드의 이미지를 붙입니다. iTerm2는 Cmd V, Windows와 WSL은 Alt V도 됩니다.
Ctrl L화면 다시 그리기. 표시가 깨졌을 때 씁니다.
Ctrl S입력을 임시 보관하고 비웁니다. 빈 상태에서 다시 누르면 복원됩니다.
macOS에서 Option 키 단축키가 안 먹으면. 공식Option P(모델 전환), Option T(확장 사고 토글), Option O(빠른 모드 토글) 같은 키는 터미널에서 Option을 Meta로 보내도록 설정해야 동작합니다. 설정 방법은 L0의 터미널 다듬기 절에 있습니다. interactive-mode

공식키를 직접 바꾸려면 /keybindings로 키바인딩 파일을 엽니다. 위 표는 터미널이 클로드코드에 보내는 신호를 전제하므로, 터미널 쪽 설정이 필요한 경우와 클로드코드 쪽 재정의가 필요한 경우가 다릅니다. terminal-config

6.3여러 줄 입력과 편집 모드

공식Enter는 전송입니다. 줄바꿈 방법은 네 가지이고 터미널 지원이 다릅니다. interactive-mode

방법키조건
어디서나\ 다음 Enter모든 터미널
제어 문자Ctrl J설정 없이 모든 터미널
ShiftShift EnteriTerm2, WezTerm, Ghostty, Kitty, Warp, Apple Terminal, Windows Terminal은 기본 동작. VS Code 계열은 /terminal-setup 한 번
OptionOption EntermacOS에서 Option을 Meta로 설정한 뒤

공식프롬프트 입력에 Vim 방식 편집 모드가 있습니다. /config의 Editor mode에서 켜거나 설정 파일에서 editorMode를 "vim"으로 둡니다. NORMAL과 VISUAL 모드의 일부 이동과 연산자를 지원합니다(hjkl, v/V, d/c/y). 표준 Vim과 달리 INSERT 모드에서 Enter는 여전히 전송이므로, 줄바꿈은 NORMAL 모드의 o나 Ctrl J를 씁니다. terminal-config

아주 큰 입력은 붙여 넣지 마세요. 공식800자 또는 두 줄을 넘기면 입력창이 접히지만 전체 내용은 그대로 전송됩니다. 파일 전체나 긴 로그는 파일로 저장한 뒤 읽으라고 하는 편이 낫습니다. 대화 기록이 읽을 수 있는 상태로 남고, 이후 턴에서 클로드가 경로로 참조할 수 있습니다. VS Code 통합 터미널은 아주 큰 붙여넣기에서 문자를 흘릴 수 있습니다. terminal-config

6.4이미지 입력

공식이미지를 넣는 방법은 세 가지입니다. 창에 끌어다 놓기, 복사한 뒤 Ctrl V로 붙이기(macOS iTerm2는 Cmd V도 가능), 경로를 알려 주기. 붙이면 커서 위치에 [Image #N] 칩이 들어가 프롬프트 안에서 위치를 지정해 참조할 수 있습니다. common-workflows

공식쓰임새는 오류 화면, 화면 설계, 도표입니다. 디자인 시안을 붙여 CSS를 만들게 하거나, 구현 결과를 스크린샷으로 찍어 원본과 비교해 차이를 나열하고 고치게 하는 방식이 공식 문서의 검증 예시로 나옵니다. best-practices

[스크린샷 붙여넣기] implement this design. take a screenshot of the result
and compare it to the original. list differences and fix them

6.5상태줄 읽기

공식상태줄은 화면 아래쪽의 사용자 설정 가능한 줄이고, 설정한 셸 스크립트를 실행해 그 출력을 표시합니다. 스크립트는 표준 입력으로 세션 데이터를 JSON으로 받습니다. 기본 푸터 배지를 대체하지 않고 그 위 자기 줄에 그려집니다. statusline

공식스크립트가 받는 데이터에는 현재 모델(model.display_name), 세션 식별자(session_id), 맥락 사용량(context_window.current_usage), 최근 응답의 총 토큰이 20만을 넘는지(exceeds_200k_tokens) 같은 필드가 있습니다. statusline

맥락 사용량을 상시로 보이게 하는 것이 이 편에서 가장 실용적인 설정입니다. 관행공식 문서도 맥락 사용량을 계속 추적하려면 상태줄을 설정하라고 권합니다. 이 편의 첫 박스에서 말한 제약을 눈에 보이게 만드는 유일한 상시 장치입니다. 만드는 방법은 이 시리즈의 L3 확장에서 다룹니다. 지금은 /context로 그때그때 확인하면 됩니다. best-practices

7

명령 레퍼런스

7.1명령 체계 개관

공식/로 부르는 것은 세 종류가 섞여 있습니다. 내장 명령은 고정된 로직을 실행하고, 번들 스킬은 클로드에게 상세한 프롬프트를 주고 알아서 조율하게 합니다(그래서 에이전트를 띄우고 파일을 읽고 코드베이스에 맞춰 적응할 수 있습니다). 사용자 스킬과 플러그인 스킬은 직접 만들거나 설치한 것입니다. glossary

"슬래시 명령"은 구 표기입니다. 공식공식 문서가 제품 카피에서 "Slash"를 뺐고 지금은 명령이라고 부릅니다. 또 커스텀 명령은 스킬로 개칭됐습니다. .claude/commands/deploy.md와 .claude/skills/deploy/SKILL.md는 둘 다 /deploy를 만들고 같게 동작하며, 기존 명령 파일은 계속 동작합니다. 스킬이 권장 후계입니다. glossary

아래 7.2부터 7.6까지는 일상에서 실제로 손이 가는 순서로 묶었습니다. 전량은 7.7에 있습니다.

7.2세션과 맥락

명령무엇을 하나
/clear [name]새 대화를 시작합니다. 이전 대화는 저장됩니다.
/compact [instructions]대화를 요약으로 압축해 맥락을 확보합니다. 지시를 붙여 무엇을 보존할지 지정할 수 있습니다.
/context [all]지금 무엇이 맥락을 쓰고 있는지 보여줍니다.
/autocompact자동 압축 시점을 조절합니다.
/resume [id]이전 대화로 돌아갑니다.
/branch [name]대화 분기를 만듭니다.
/rewind코드와 대화를 되돌립니다.
/btw [question]맥락에 남지 않는 짧은 질문을 합니다.
/export [filename]대화를 평문으로 내보냅니다.
/copy [N]마지막 응답을 클립보드로 복사합니다.
/cd <path>세션의 작업 디렉터리를 옮깁니다.
/add-dir <path>파일 접근을 위한 작업 디렉터리를 추가합니다.

출처: commands

7.3설정과 진단

명령무엇을 하나
/init프로젝트를 분석해 시작용 CLAUDE.md를 만듭니다. 빌드 시스템, 테스트 프레임워크, 코드 패턴을 감지합니다.
/memory메모리 파일을 편집하고 자동 메모리를 관리합니다.
/config설정 화면을 엽니다(/settings가 별칭).
/permissions승인 규칙을 설정합니다.
/status세션 상태를 보여줍니다. 어떤 인증이 쓰이는지도 여기서 확인합니다.
/doctor설치와 설정 점검을 돌립니다.
/debug [description]디버그 로깅을 켭니다.
/hooks설정된 훅을 봅니다.
/mcpMCP 서버 연결을 관리합니다.
/keybindings키보드 단축키 파일을 엽니다.
/theme색 테마를 고릅니다.
/terminal-setup터미널의 Shift Enter 등을 설정합니다.
/fewer-permission-prompts허용 목록을 만들어 승인 창을 줄입니다.
/login, /logout로그인과 로그아웃.

출처: commands, best-practices

7.4모델과 속도

명령무엇을 하나
/model [model]모델을 바꿉니다(11.3).
/effort [level|auto]추론 노력 수준을 조절합니다.
/fast [on|off]빠른 모드를 토글합니다(11.4).
/advisor [model|off]어드바이저를 켜고 끕니다(5.6).
/usage토큰 사용량과 비용을 봅니다(/cost가 별칭).
/usage-credits사용 크레딧을 확인하거나 요청합니다.
모델과 노력 수준은 세션 도중에 바꾸면 대가가 있습니다. 공식둘 다 프롬프트 캐시의 키에 들어가므로, 바꾸면 다음 요청이 대화 전체를 캐시 없이 다시 읽습니다. 공식 권고는 세션 시작 시점에 정하고 이후 바꾸지 않는 것입니다. 자세한 것은 11.2에 있습니다. prompt-caching

7.5품질

명령무엇을 하나
/diff변경 비교 화면을 엽니다.
/code-review [level] [--fix] [대상]변경분을 리뷰해 버그와 정리 지점을 찾습니다(9.2). /review가 별칭입니다.
/code-review ultra클라우드에서 더 깊은 리뷰를 돌립니다(9.3).
/security-review현재 브랜치의 변경분을 보안 관점으로 점검합니다(9.4).
/simplify [--fix]버그 탐색 없이 정리만 하는 리뷰입니다.
/verify [--fix]코드가 맞는지 확인합니다.
/test테스트를 돌립니다.
/plan플랜 모드로 들어갑니다(5.3).
/goal [condition|clear]완료 조건을 걸어 둡니다(5.5).

출처: commands

7.6병렬과 자동화

이 계열은 이 편의 범위를 넘습니다. 무엇이 있는지만 알아 두고, 쓰는 법은 뒤 레벨에서 다룹니다.

명령무엇을 하나어느 편에서
/tasks백그라운드 작업과 서브에이전트를 봅니다L4
/subtask, /fork, /background곁작업을 서브에이전트에 넘기거나 세션을 백그라운드로 뗍니다L4
/batch <instruction>큰 변경을 병렬 단위로 쪼개 조율합니다L4
/agents, /list-agents서브에이전트 설정을 관리합니다L3
/loop [interval] [prompt]프롬프트를 주기적으로 반복 실행합니다L4
/remote-control, /teleport, /desktop, /web다른 기기나 표면으로 세션을 잇습니다L1의 10.4, L4
/install-github-app, /autofix-prGitHub 연동과 PR 자동 수정L5
/plugin, /reload-plugins플러그인을 찾고 설치하고 적용합니다L3
/deep-research <question>웹 검색을 팬아웃해 보고서로 종합합니다L4
/insights세션 분석 보고서를 만듭니다L1에서 바로 써도 됩니다

출처: commands

7.7전체 표

공식내장 명령 전량입니다. 공식 문서의 알파벳 목록을 옮기고, 이 시리즈에서 어디서 다루는지를 덧붙였습니다. 세션에서 /help를 치면 현재 버전에서 실제로 쓸 수 있는 목록이 나오므로, 이 표와 어긋나면 그쪽이 정답입니다. commands

내장 명령 전체 목록 펼치기
/add-dir <path>        파일 접근용 작업 디렉터리 추가
/advisor [model|off]   어드바이저 도구 켜기·끄기
/agents                서브에이전트 설정 관리
/autocompact           자동 압축 시점 설정
/autofix-pr [prompt]   PR을 지켜보며 CI 실패 시 수정 푸시
/background [prompt]   백그라운드 에이전트로 분리
/batch <instruction>   대규모 변경을 병렬 조율
/branch [name]         대화 분기 생성
/btw [question]        맥락에 안 남는 곁질문
/bug [report]          버그 신고 또는 대화 공유
/cd <path>             작업 디렉터리 이동
/chrome                Chrome 연동 설정
/claude-api            Claude API 레퍼런스 로드
/clear [name]          새 대화 시작
/code-review           변경분 버그 리뷰
/color [color]         프롬프트 바 색상
/compact [instr]       대화 요약 압축
/config [key=value]    설정 화면
/context [all]         맥락 사용량 시각화
/copy [N]              마지막 응답 복사
/cost                  /usage 별칭
/dataviz [request]     차트 설계 지침
/debug [description]   디버그 로깅
/deep-research <q>     웹 검색 팬아웃 후 보고서
/design-login          디자인 시스템 접근 인증
/design-sync [hint]    디자인 시스템 변환·업로드
/desktop               데스크톱 앱에서 계속
/diff                  변경 비교 화면
/doctor                설치·설정 점검
/effort [level|auto]   추론 노력 수준
/exit                  종료
/export [filename]     대화 평문 내보내기
/fast [on|off]         빠른 모드 토글
/feedback [report]     제품 피드백
/fewer-permission-prompts  승인 창 줄이기
/focus                 포커스 뷰 토글
/fork [prompt]         대화를 새 백그라운드 세션으로 복사
/goal [condition|clear]  완료 조건 설정
/heapdump              메모리 진단용 힙 스냅샷
/help                  도움말과 명령 목록
/hooks                 훅 설정 보기
/ide                   IDE 연동 관리
/import [codex|gemini] 다른 에이전트 설정 가져오기
/init                  CLAUDE.md 생성
/insights              세션 분석 보고서
/install-github-app    GitHub 앱 설치
/install-slack-app     Slack 앱 설치
/keybindings           단축키 파일 열기
/list-agents           서브에이전트·세션 목록
/login                 로그인
/logout                로그아웃
/loop [interval] [p]   프롬프트 주기 반복
/mcp                   MCP 서버 관리
/memory                메모리 파일 편집
/mobile                모바일 앱 QR 코드
/model [model]         모델 전환
/permissions           승인 규칙 설정
/plan                  플랜 모드
/resume [id]           이전 대화로
/rewind                코드·대화 되돌리기
/security-review       변경분 보안 점검
/settings              /config 별칭
/simplify [--fix]      코드 정리
/status                세션 상태
/subtask [prompt]      곁작업을 서브에이전트에
/tasks                 백그라운드 작업 목록
/teleport              웹 세션을 터미널로
/test                  테스트 실행
/usage                 토큰 사용량과 비용
/verify [--fix]        코드 정합성 확인
/web                   브라우저에서 claude.ai/code 열기

8

파일과 코드를 다루기

8.1코드 탐색 시키기

공식낯선 코드베이스에서는 넓은 질문으로 시작해 좁혀 갑니다. 공식 문서의 예시 순서입니다. common-workflows

give me an overview of this codebase
explain the main architecture patterns used here
what are the key data models?
how is authentication handled?

공식특정 기능을 찾을 때는 파일을 찾게 하고, 그 파일들이 어떻게 맞물리는지 묻고, 실행 흐름을 추적하게 하는 세 단계가 권장됩니다. common-workflows

find the files that handle user authentication
how do these authentication files work together?
trace the login process from front-end to database

공식공식 문서는 이것을 온보딩 방법으로 명시합니다. 다른 엔지니어에게 물을 질문을 그대로 물으면 되고, 특별한 프롬프트 기법이 필요하지 않습니다. 램프업 시간을 줄이고 다른 엔지니어의 부담을 낮춥니다. best-practices

범위 없는 "조사해 봐"는 맥락을 태웁니다. 공식공식 문서가 흔한 실패 패턴으로 꼽는 것 중 하나입니다. 범위를 좁히거나, 서브에이전트에 넘겨 탐색이 메인 맥락을 먹지 않게 합니다. 서브에이전트는 자기 맥락 창에서 파일을 읽고 요약만 돌려줍니다. best-practices
use subagents to investigate how our authentication system handles token
refresh, and whether we have any existing OAuth utilities I should reuse.

8.2파일 참조와 변경 검토

공식어디에 코드가 있는지 설명하는 대신 @로 참조합니다. 클로드가 답하기 전에 그 파일을 읽습니다. 그 밖에 이미지 붙여넣기, 문서 URL 주기(/permissions로 자주 쓰는 도메인을 허용 목록에 넣을 수 있습니다), 파이프로 데이터 넣기(cat error.log | claude), 필요한 것을 클로드가 직접 가져오게 하기가 있습니다. best-practices

공식변경을 검토하는 화면은 /diff로 엽니다. 승인 화면에서 무엇이 바뀌는지 보고 통과시키는 흐름은 L0에서 다뤘습니다. commands

실습

검증 수단을 준 지시와 안 준 지시를 비교하기

  1. 테스트가 있는 작은 프로젝트를 엽니다. 없으면 함수 하나와 테스트 하나를 먼저 만들게 합니다.
  2. 먼저 검증 없이 시킵니다. 이 함수에 입력 검증을 추가해 주세요
  3. 어디까지 하고 멈추는지 봅니다. 테스트를 돌렸는지, 스스로 확인했는지.
  4. /rewind로 되돌린 뒤 검증을 넣어 다시 시킵니다. 이 함수에 입력 검증을 추가하고, 빈 값과 형식 오류 두 경우의 테스트를 써서 통과할 때까지 고쳐 주세요
  5. 두 번째 실행에서 클로드가 테스트를 돌리고 실패를 읽고 다시 고치는지 확인합니다.

완료 판정. 같은 작업에서 무엇이 달라졌는지 한 문장으로 말할 수 있습니다. 검증 수단이 있으면 루프가 스스로 닫힙니다.

8.3셸 명령 실행

공식클로드는 명령줄에서 할 수 있는 것을 할 수 있습니다. 빌드 도구, git, 패키지 관리자, 시스템 유틸리티, 스크립트가 여기 들어갑니다. 사용자가 직접 실행하고 싶으면 입력창에서 ! 접두어를 씁니다. how-claude-code-works

공식외부 서비스를 다룰 때는 CLI 도구를 쓰라고 지시하는 편이 맥락 효율이 가장 좋습니다. gh, aws, gcloud, sentry-cli가 예입니다. GitHub를 쓴다면 gh CLI를 깔아 두는 것이 권장되는데, 없으면 클로드가 인증 없는 API 요청을 쓰다가 속도 제한에 걸립니다. best-practices

모르는 CLI도 배웁니다. 공식Use 'foo-cli-tool --help' to learn about foo tool, then use it to solve A, B, C. 같은 지시가 통합니다. best-practices
셸로 만든 파일 변경은 되돌리기가 안 됩니다. 공식되돌리기는 클로드의 파일 편집 도구가 만든 변경만 추적합니다. rm, mv, cp 같은 명령의 결과는 복구되지 않으므로 git 커밋을 자주 남기는 편이 안전합니다. checkpointing

8.4도구가 무엇인지 알아 두기

공식승인 화면에 뜨는 이름이 도구 이름입니다. 무엇을 승인하는지 알려면 이름을 알아 두는 편이 낫습니다. 자주 보이는 것만 옮깁니다. 승인 필요 여부는 권한 모드와 규칙에 따라 달라집니다. tools-reference

도구무엇을 하나승인
Read파일 내용을 읽습니다필요 없음
Glob패턴으로 파일을 찾습니다필요 없음
Grep파일 내용에서 패턴을 검색합니다필요 없음
Edit파일을 국소 수정합니다필요
Write파일을 만들거나 덮어씁니다필요
Bash셸 명령을 실행합니다필요
PowerShellPowerShell 명령을 실행합니다필요
WebFetchURL에서 내용을 가져옵니다필요
WebSearch웹을 검색합니다필요
Agent자기 맥락 창을 가진 서브에이전트를 띄웁니다필요 없음
Skill재사용 프롬프트 워크플로를 실행합니다필요
AskUserQuestion선택형 질문으로 되묻습니다필요 없음
LSP언어 서버로 코드 인텔리전스를 씁니다필요 없음
EnterPlanMode, ExitPlanMode플랜 모드로 들고 나갑니다나갈 때 필요

전체 목록(40개 이상)은 tools-reference에 있습니다.

8.5큰 코드베이스에서

공식큰 저장소에서는 작은 프로젝트에 맞춘 기본값이 맥락을 지금 작업과 무관한 지침과 파일 읽기로 채웁니다. 가장 먼저 결정할 것은 어디서 claude를 실행할지입니다. large-codebases

시작 위치파일 접근시작 시 로드되는 지침 파일언제
저장소 루트모든 파일루트만. 하위 디렉터리 파일은 클로드가 그곳을 읽을 때 로드작업이 여러 패키지에 걸칠 때
하위 디렉터리그 하위 트리만(추가 허용 전까지)그 디렉터리와 모든 상위 디렉터리의 파일작업이 한 패키지에 국한될 때

공식그 밖에 이 편 수준에서 바로 쓸 수 있는 것은 두 가지입니다. 첫째, 클로드의 내용 검색은 기본적으로 .gitignore를 존중하므로 node_modules/, dist/, build/는 별도 설정 없이 검색 결과에서 빠집니다. 둘째, 타입 있는 언어라면 코드 인텔리전스 플러그인이 파일을 훑는 대신 언어 서버로 정의와 참조를 찾게 해 파일 읽기를 줄입니다. large-codebases

공식여러 패키지에 걸친 변경에는 두 가지가 도움이 됩니다. 공유 코드 수정과 그 호출처들을 한 세션에서 함께 넘기면 각 수정의 판단이 일관되게 유지됩니다. 그리고 계획을 저장소의 마크다운 파일로 쓰게 해 두면, 긴 세션이 맥락을 압축하는 동안에도 계획이 살아남습니다. large-codebases

지침 파일 계층화, 읽기 차단 규칙, 워크트리 희소 체크아웃 같은 설정은 이 편의 범위 밖입니다. 그것들은 이 시리즈의 L2 맥락과 통제에서 다룹니다.

9

git과 리뷰

9.1커밋, 브랜치, PR

공식PR은 create a pr for my changes처럼 바로 요청해도 되고, 단계로 나눠도 됩니다. 변경을 요약하게 하고, PR을 만들게 하고, 설명을 다듬게 하는 순서입니다. common-workflows

summarize the changes I've made to the authentication module
create a pr
enhance the PR description with more context about the security improvements

공식gh pr create로 PR을 만들면 그 세션이 해당 PR에 자동으로 연결됩니다. 나중에 claude --from-pr 1234로 그 PR에 연결된 세션만 걸러 볼 수 있고, /resume 선택 화면 검색창에 PR 주소를 붙여 넣어도 찾힙니다. common-workflows

제출 전에 위험을 짚어 달라고 하세요. 공식공식 문서의 권고입니다. 클로드가 만든 PR을 검토하고, 잠재적 위험과 고려사항을 강조해 달라고 요청합니다. common-workflows

9.2코드 리뷰 받기

공식/code-review는 GitHub 앱 없이 터미널에서 변경분을 리뷰합니다. 정확성 버그와 함께 재사용, 단순화, 효율 관점의 정리 지점을 보고합니다. 기본 대상은 업스트림보다 앞선 브랜치 커밋 + 커밋되지 않은 변경이고, 파일 경로, PR 번호, 브랜치 이름, main...my-feature 같은 범위를 인자로 줄 수 있습니다. code-review

/code-review                   현재 브랜치와 작업 트리
/code-review high              노력 수준을 올려 커버리지 확대
/code-review --fix             리뷰 후 작업 트리에 반영
/code-review main...my-feature 범위 지정

공식리뷰는 기본적으로 자기 맥락 창을 가진 백그라운드 서브에이전트로 돌기 때문에 대화를 채우지 않습니다. 결과는 끝났을 때 대화에 도착합니다. code-review

공식노력 수준이 커버리지와 확신을 교환합니다. low와 medium에서는 가장 확신하는 것만 보고해 오탐이 적고, high부터 max까지는 범위가 넓어지는 대신 덜 확실한 것도 들어옵니다. 수준을 적지 않으면 이전에 입력한 수준을 재사용합니다. code-review

--fix로 적용된 수정은 /rewind로 안 돌아갑니다. 공식백그라운드 리뷰는 세션의 체크포인트 밖에서 수정하므로 git으로 되돌려야 합니다. 리뷰가 포그라운드로 돌 때는 정상적으로 되돌아갑니다. code-review

관행리뷰어를 다른 세션으로 분리하는 방법도 있습니다. 공식 문서는 이것을 Writer/Reviewer 패턴으로 소개하며, 새 맥락이 코드 리뷰의 질을 높이는 이유를 클로드가 방금 쓴 코드에 편향되지 않기 때문이라고 적습니다. best-practices

리뷰어는 시키면 뭐라도 찾아냅니다. 공식공식 문서가 직접 경고하는 지점입니다. 결함을 찾으라고 지시받은 리뷰어는 작업이 온전할 때도 보통 무언가를 보고하는데, 그것이 시킨 일이기 때문입니다. 모든 지적을 쫓아가면 과설계로 갑니다(불필요한 추상화 계층, 방어 코드, 일어날 수 없는 경우의 테스트). 정확성이나 명시된 요구사항에 영향을 주는 것만 표시하라고 지시하고 나머지는 선택으로 두세요. best-practices

9.3더 깊은 버그 찾기

공식/code-review ultra는 클라우드 샌드박스에서 리뷰어 에이전트 함대를 띄웁니다. 로컬 리뷰와 비교해 세 가지가 다릅니다. 보고된 모든 발견을 독립적으로 재현하고 검증하므로 신호가 높고, 더 큰 함대가 병렬로 탐색하므로 커버리지가 넓고, 원격에서 돌아 터미널이 비어 있습니다. ultrareview

/code-review/code-review ultra
실행 위치세션 안, 로컬클라우드 샌드박스
깊이노력 인자에 비례다중 에이전트 + 독립 검증
소요수초에서 수분대략 5분에서 10분
비용일반 사용량에 포함무료 실행분 이후 리뷰당 대략 5달러에서 25달러(사용 크레딧)
맞는 때작업 중 빠른 피드백규모 있는 변경의 병합 전 확신
비용과 조건을 알고 쓰세요. 공식Pro와 Max에 일회성 무료 3회가 있고 갱신되지 않습니다. Team과 Enterprise는 무료분이 없습니다. 이후에는 사용 크레딧으로 청구되며, 실행이 시작되면 중간에 멈춰도 무료분이 소모됩니다. claude.ai 계정 인증이 필요하고 Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry에서는 쓸 수 없습니다. 실행 전에 범위와 남은 무료 실행 수와 예상 비용을 보여주는 확인 창이 뜹니다. ultrareview

공식기본 범위는 현재 브랜치와 기본 브랜치의 차이이고 커밋되지 않은 변경과 스테이지된 변경을 포함합니다. 다른 기준으로 비교하려면 브랜치 이름을, PR을 리뷰하려면 번호를 넘깁니다. 브랜치 리뷰는 파일 500개와 변경 줄 8,000줄까지가 기본 상한입니다. ultrareview

/code-review ultra          현재 브랜치 대 기본 브랜치
/code-review ultra develop  다른 기준 브랜치와 비교
/code-review ultra 1234     PR 번호로
/code-review ultra --fix    발견을 작업 트리에 반영

공식진행 중인 리뷰는 /tasks에서 보고 멈출 수 있습니다. 백그라운드 작업이므로 계속 일하거나 터미널을 닫아도 됩니다. ultrareview

9.4보안 점검

공식단계마다 다른 도구가 있습니다. 공식 문서가 정리한 방어 층입니다. security-guidance

단계수단무엇을 덮나
세션 안, 자동security-guidance 플러그인클로드가 쓰는 코드의 흔한 취약점을 같은 세션에서 고칩니다
요청 시, 단일 패스/security-review현재 브랜치 변경분의 일회성 보안 패스
요청 시, 깊은 스캔Claude Security 플러그인저장소나 변경분의 다중 에이전트 취약점 스캔
PR 시점Code Review(Team·Enterprise)전체 코드베이스 맥락의 정확성·보안 리뷰
CI기존 정적 분석·의존성 스캐너언어별 규칙, 공급망 검사, 정책 강제

공식이 편 수준에서 바로 쓸 수 있는 것은 /security-review입니다. 현재 브랜치의 변경분만 덮는다는 점을 알아 두세요. 이미 가진 코드에서 문제를 찾으려면 특정 파일이나 디렉터리를 리뷰해 달라고 세션에서 직접 요청하거나 더 깊은 스캔을 씁니다. 어느 쪽이든 리뷰는 체크아웃의 소스 코드를 읽고, 돌아가는 사이트나 배포된 서비스를 보지 않습니다. security-guidance

세션 안 자동 점검은 플러그인입니다. 공식설치하면 세 지점에서 자동으로 돕니다. 파일 편집마다 모델 호출 없는 빠른 패턴 검사, 턴이 끝날 때마다 그 턴이 바꾼 것 전체를 백그라운드에서 모델로 리뷰, 클로드가 커밋이나 푸시할 때 주변 코드를 읽는 더 깊은 리뷰입니다. 어느 층도 쓰기나 커밋을 차단하지 않고, 발견은 지시로 클로드에게 전달됩니다. 설치와 규칙 추가는 L3에서 다룹니다. security-guidance

9.5테스트와 디버깅 루프

공식버그를 고칠 때의 권장 순서는 오류를 공유하고, 수정 방향을 몇 가지 받고, 고르게 한 뒤 적용하는 것입니다. 재현 명령과 스택 트레이스를 함께 주고, 재현 절차를 알려 주고, 간헐적인지 일관적인지 밝히는 것이 권장됩니다. common-workflows

I'm seeing an error when I run npm test
suggest a few ways to fix the @ts-ignore in user.ts
update user.ts to add the null check you suggested

공식테스트는 덮이지 않은 코드를 찾고, 뼈대를 만들고, 경계 조건을 더하고, 돌려서 실패를 고치는 네 단계입니다. 클로드는 기존 테스트 파일을 살펴 이미 쓰이는 스타일, 프레임워크, 단정 패턴에 맞춥니다. common-workflows

find functions in NotificationsService.swift that are not covered by tests
add tests for the notification service
add test cases for edge conditions in the notification service
run the new tests and fix any failures
여기까지 됐는지 확인
  • 실무 한 건을 탐색부터 커밋까지 혼자 돌렸습니다.
  • 검증 수단을 준 지시와 안 준 지시의 차이를 실제로 봤습니다.
  • /code-review를 한 번 돌려 결과를 읽었습니다.

10

세션을 살림

10.1세션이란 무엇인가

공식세션은 프로젝트 디렉터리에 묶인 저장된 대화입니다. 작업하는 동안 계속 로컬 기록 파일에 저장되므로, 나가거나 /clear한 뒤에도 돌아올 수 있습니다. 기록은 기본적으로 ~/.claude/projects/<project>/<session-id>.jsonl에 JSONL로 저장됩니다. sessions

공식세션은 서로 독립입니다. 새 세션은 이전 세션의 대화 없이 빈 맥락 창에서 시작합니다. 세션을 넘겨 지식을 남기는 것은 자동 메모리와 CLAUDE.md의 몫입니다. how-claude-code-works

기록 파일을 직접 파싱하지 마세요. 공식항목 형식은 클로드코드 내부용이고 버전마다 바뀌므로, 이 파일을 직접 읽는 스크립트는 어느 릴리스에서든 깨질 수 있습니다. 세션 데이터를 쓰려면 /export나 문서에 정리된 스크립트 인터페이스를 씁니다. sessions

10.2이어가기, 이름, 분기

명령무엇을 하나
claude --continue현재 디렉터리의 가장 최근 세션을 이어갑니다
claude --resume세션 선택 화면을 엽니다
claude --resume <name>이름으로 바로 이어갑니다
claude --from-pr <number>그 PR에 연결된 세션만 걸러 봅니다
/resume세션 안에서 다른 대화로 전환합니다

공식여러 작업을 병행할 때는 이름을 붙여 두는 것이 가장 실용적입니다. 시작할 때 claude -n auth-refactor, 세션 중에는 /rename auth-refactor, 선택 화면에서는 Ctrl R입니다. 이름을 안 붙이면 첫 프롬프트를 요약한 제목이 자동으로 붙지만, 그 자동 제목은 이어가기 손잡이가 아닙니다. --resume <name>은 직접 지정한 이름만 찾습니다. sessions

공식선택 화면 단축키입니다. sessions

키동작
Space세션 내용 미리보기
Ctrl R이름 바꾸기
/ 또는 아무 글자검색 모드. PR 주소를 붙여 넣으면 그것을 만든 세션을 찾습니다
Ctrl W현재 저장소의 모든 워크트리로 범위 확대
Ctrl A이 컴퓨터의 모든 프로젝트로 확대
Ctrl B현재 git 브랜치의 세션만 걸러 보기

공식분기는 지금까지의 대화를 복사해 그쪽으로 옮겨 타는 것이고, 원본은 그대로 남습니다. 다른 접근을 시도하면서 지금 경로를 잃지 않으려는 용도입니다. 세션 안에서는 /branch [name], 명령줄에서는 claude --continue --fork-session입니다. sessions

포크하지 않고 같은 세션을 두 터미널에서 이어가면 두 쪽 메시지가 한 기록에 섞입니다. 공식병행하려면 분기하거나 워크트리를 쓰세요. sessions
이어갈 때 다시 넘겨야 하는 것. 공식대화 이력, 모델, 권한 모드, 활성 목표는 복원되지만 모든 실행 플래그가 복원되지는 않습니다. --mcp-config, --settings, --plugin-dir, --fallback-model, --add-dir에 의존했다면 이어갈 때 다시 넘겨야 합니다. settings.json 같은 표준 설정 파일은 실행 시 다시 읽히므로 다시 넘기지 않아도 됩니다. 플랜 모드는 복원되지 않습니다. sessions

10.3되돌리기를 전략으로 쓰기

되돌리기 메뉴의 사용법은 L0에서 다뤘습니다. 여기서는 그것을 작업 방식으로 쓰는 이야기입니다.

공식공식 문서의 권고는 이렇습니다. 모든 수를 조심스럽게 계획하는 대신, 위험한 것을 시도하라고 시키세요. 안 되면 되돌리고 다른 접근을 시도합니다. 체크포인트는 대화와 함께 저장되므로 터미널을 닫고 나중에 세션을 이어가서도 되돌릴 수 있습니다. best-practices

공식맥락 관리 수단으로도 씁니다. 되돌리기 메뉴에는 코드 복원 말고 요약 선택지가 두 개 있습니다. Summarize from here는 그 지점부터 뒤를 압축해 앞의 맥락을 온전히 남기고, Summarize up to here는 앞을 압축해 최근 것을 온전히 남깁니다. 장황한 디버깅 세션을 중간부터 압축하면서 초기 지시를 살리는 것이 대표 용례입니다. checkpointing

상황무엇을 쓰나왜
가려던 길을 통째로 포기/rewind공식이미 캐시된 이전 지점으로 잘라내므로 압축보다 싸다
맥락은 줄이되 이어서 진행/compact공식작업 사이 자연스러운 구간에서 실행하는 것이 권장
관련 없는 작업으로 전환/clear공식비용이 들지 않는다
원본을 남기고 다른 접근/branch공식기록을 복사하므로 원본이 온전하다

출처: prompt-caching, checkpointing

10.4표면 사이 이동

공식세션은 한 표면에 묶여 있지 않습니다. 상황이 바뀌면 옮길 수 있습니다. overview

하고 싶은 것수단
자리를 떠나 폰이나 브라우저에서 계속Remote Control(claude remote-control)
지금 터미널 세션을 데스크톱 앱에서 이어 변경을 눈으로 검토/desktop. claude.ai 구독이 필요하고 macOS와 x64 Windows에서 됩니다
오래 걸리는 작업을 클라우드로 던지고 나중에 터미널로 회수claude --cloud로 보내고 claude --teleport로 가져옵니다
폰에서 작업을 던져 데스크톱 세션을 띄우기Dispatch(Pro와 Max)

출처: overview, platforms

로컬 표면끼리는 설정을 공유합니다. 공식지침 파일, 설정, MCP 서버가 로컬 표면 사이에 공유되므로 같은 프로젝트에서 표면을 섞어 써도 다시 설정하지 않습니다. 다만 클라우드 세션은 저장소를 새로 복제한 상태에서 시작하며 내 컴퓨터의 ~/.claude/를 읽지 않습니다. glossary

10.5결과 공유

공식대화 자체를 넘기려면 /export로 클립보드에 복사하거나 평문 파일로 저장합니다. 메시지와 도구 출력이 읽을 수 있는 텍스트로 렌더링됩니다. sessions

공식터미널 텍스트가 매체로 맞지 않을 때는 아티팩트를 씁니다. 아티팩트는 세션에서 claude.ai의 비공개 주소로 발행하는 살아 있는 대화형 웹 페이지이고, 세션이 계속되면 같은 자리에서 갱신됩니다. 주석 달린 diff로 리뷰어를 안내하기, 세션이 이미 가져온 데이터로 대시보드 만들기, 선택지 여럿을 나란히 놓기, 긴 작업 중 채워지는 조사 타임라인 같은 용도입니다. artifacts

Make an artifact that walks through this PR with the diff annotated inline.
새 아티팩트는 나만 볼 수 있습니다. 공식공유는 브라우저에서 페이지 머리말의 Share로 직접 합니다. Pro와 Max에서는 공개 링크가 유일한 공유 방법이고, Team과 Enterprise에서는 조직 내 공유가 되며 공개 공유는 Owner가 켜야 열립니다. 아티팩트는 Pro, Max, Team, Enterprise에서 쓸 수 있고 /login으로 claude.ai 계정에 로그인한 세션이어야 합니다. artifacts

공식아티팩트는 애플리케이션이 아닙니다. 백엔드가 없는 자기완결 단일 페이지라서 폼 입력을 저장하거나 여러 경로를 서비스할 수 없습니다. 다른 세션에서 갱신하려면 그 아티팩트의 주소를 주고 고쳐 달라고 해야 하며, 주소가 없으면 새 아티팩트가 만들어집니다. artifacts

10.6링크로 세션 열기

공식딥 링크는 claude-cli:// 주소이고, 클릭하면 새 터미널 창에서 클로드코드가 열립니다. 주소에 작업 디렉터리와 미리 채울 프롬프트를 담을 수 있습니다. 런북 단계, 모니터링 알림, README, CI 실패 통지에 넣어 한 번의 클릭으로 시작점을 공유하는 용도입니다. deep-links

매개변수무엇을 담나
q프롬프트 입력창에 미리 채울 텍스트. URL 인코딩하고 줄바꿈은 %0A. 최대 5,000자
cwd작업 디렉터리 절대 경로. 네트워크·UNC 경로는 거부됩니다
repoGitHub owner/name 슬러그. 전에 본 로컬 클론으로 해석합니다
claude-cli://open?repo=acme/payments&q=review%20open%20PRs
링크는 스스로 아무것도 실행하지 않습니다. 공식디렉터리를 고르고 프롬프트 칸을 채우기만 하며, Enter를 누를 때까지 모델에 아무것도 가지 않습니다. 세션이 열리면 입력창 아래에 Prompt from an external link 경고가 보내거나 지울 때까지 남아 있고, 1,000자를 넘는 프롬프트에는 글자 수와 함께 전체를 스크롤해 확인하라는 안내가 붙습니다. 신뢰하지 않는 페이지에서 온 링크라도 내용을 읽고 보낼지 결정하는 것은 사용자입니다. deep-links

공식핸들러는 대화형 세션에서 첫 프롬프트를 보낼 때 운영체제에 등록됩니다. 세션을 시작하고 아무것도 보내지 않고 나가면 등록되지 않습니다. 그래서 클릭해도 아무 일이 없으면 그 컴퓨터에서 세션을 열어 프롬프트를 한 번 보낸 뒤 다시 시도합니다. GitHub이 렌더링하는 마크다운은 claude-cli:// 같은 스킴을 제거하므로 README나 이슈에서는 코드 블록에 주소를 넣는 편이 낫습니다. deep-links


11

비용과 속도

11.1무엇이 돈을 쓰는가

공식토큰 비용은 맥락 크기에 비례합니다. 클로드코드는 매 요청에 대화 전체를 보내고, 클로드가 도구를 쓸 때마다 그 결과를 담은 요청을 또 보냅니다. 그래서 하루 종일 열어 둔 세션에서 한 줄짜리 질문을 해도 대화 전체에 대한 사용량이 발생합니다. costs

공식현재 세션 사용량은 /usage로 봅니다(/cost가 별칭). 구독 요금제에서는 여기에 무엇이 한도를 쓰는지도 나옵니다. 스킬, 서브에이전트, 플러그인, 개별 MCP 서버별 귀속이 각각 비율로 표시되고, 최근 사용량의 10퍼센트 이상을 차지하는 행동 신호(긴 맥락, 캐시 미스 등)에 표시가 붙습니다. d와 w로 24시간과 7일을 전환합니다. costs

공식긴 세션에서 사용량이 활동량보다 크게 오르는 이유는 정해져 있습니다. 긴 맥락, 캐시 미스, 예약 작업이 유휴 중에도 발동하는 것, 다른 세션에서 온 메시지, 활성 상태로 남은 에이전트 팀원, 그리고 압축 자체가 큰 요청이라는 것. costs

유휴 상태에서도 조금은 씁니다. 공식이전 대화를 요약하는 백그라운드 작업과 /usage 같은 일부 명령의 상태 확인 요청이 있습니다. 공식 문서는 이 배경 소비를 세션당 보통 0.04달러 미만으로 적습니다. costs

11.2프롬프트 캐시

공식캐시가 없으면 API는 매 턴 전체 이력을 다시 처리합니다. 캐시가 있으면 이미 처리한 것을 재사용하고 그 재읽기를 캐시 요금으로 청구하며 바뀐 부분만 온전히 처리합니다. 클로드코드가 알아서 관리합니다. prompt-caching

공식핵심은 앞부분 일치입니다. API는 각 요청의 시작 부분을 최근 처리한 것과 대조하는데, 일치는 정확히 이뤄지므로 앞부분의 어딘가가 바뀌면 그 뒤가 전부 다시 계산됩니다. 파일별이나 구간별 캐시는 없습니다. 그래서 클로드코드는 잘 바뀌지 않는 것을 앞에 둡니다. prompt-caching

층내용언제 바뀌나
시스템 프롬프트핵심 지시, 도구 정의, 출력 스타일로드된 도구 정의가 바뀌거나 클로드코드가 업그레이드될 때
프로젝트 맥락지침 파일, 자동 메모리, 범위 없는 규칙세션 시작, /clear, /compact
대화내 메시지, 클로드 응답, 도구 결과매 턴

공식캐시를 깨는 것과 지키는 것이 명확하게 갈립니다. 이 편에서 알아 둘 만한 것만 옮깁니다. prompt-caching

깨는 것지키는 것
모델 전환(/model)저장소 파일 편집
노력 수준 변경(/effort)세션 중 지침 파일 편집(단 그 편집은 적용되지도 않습니다)
빠른 모드 켜기권한 모드 전환
MCP 서버 연결·해제(도구가 앞부분에 실릴 때)스킬과 명령 호출
/compact/rewind
클로드코드 업그레이드 후 첫 요청서브에이전트 띄우기(부모 캐시는 그대로)
세션 중 지침 파일을 고쳐도 적용되지 않습니다. 공식프로젝트 루트와 사용자 수준 CLAUDE.md는 세션 시작 시 한 번 읽혀 메모리에 보관됩니다. 세션 중 편집은 캐시를 깨지도 않지만 반영되지도 않습니다. 새 내용은 다음 /clear, /compact, 또는 재시작에서 로드됩니다. 출력 스타일도 같습니다. prompt-caching

공식캐시 수명은 인증 방식에 따라 다릅니다. 구독에서는 한 시간 TTL을 자동으로 요청하므로 한 시간까지의 공백을 견딥니다. 사용 크레딧을 쓰는 상태에서는 비용 때문에 자동으로 5분으로 내려가며, 한 시간을 유지하려면 ENABLE_PROMPT_CACHING_1H=1을 설정합니다. API 키나 서드파티 제공자에서는 기본이 5분입니다. prompt-caching

이 절에서 가져갈 한 문장. 공식모델과 노력 수준은 세션 처음에 정하고, /compact는 작업 사이 자연스러운 구간에 아껴 씁니다. 작업 도중 바꾸는 것이 적을수록 캐시 적중률이 높아집니다. prompt-caching

11.3모델 선택 기준

공식정확한 버전 번호를 기억하지 않아도 되게 별칭이 있습니다. model-config

별칭무엇인가
default모델 지정을 지우고 계정 유형에 맞는 권장 모델로 돌아갑니다(별칭 자체는 아닙니다)
sonnet일상 코딩 작업용 최신 Sonnet
opus복잡한 추론용 최신 Opus
haiku단순한 작업용 빠르고 효율적인 Haiku
fable가장 어렵고 오래 도는 작업용 Fable 5
best조직이 Fable 5에 접근 가능하면 그것을, 아니면 최신 Opus를
opusplan플랜 모드에서는 opus, 실행에서는 sonnet
sonnet[1m], opus[1m]긴 세션용 100만 토큰 맥락 창

공식선택 기준은 단순합니다. Sonnet이 대부분의 코딩 작업을 잘 처리하고 Opus보다 저렴합니다. Opus는 복잡한 구조 결정이나 다단계 추론에 남겨 둡니다. 세션 중 전환은 /model이고 기본값은 /config에서 정합니다. costs

공식노력 수준은 적응형 추론을 조절합니다. 지원 모델에서 기본값은 high이고, low, medium, high, xhigh, max가 있습니다(모델에 따라 지원 범위가 다릅니다). 낮으면 간단한 작업에서 빠르고 싸고, 높으면 복잡한 문제에 깊은 추론을 씁니다. /effort로 바꿉니다. model-config

확장 사고의 토큰은 출력 토큰으로 청구됩니다. 공식기본 예산이 모델에 따라 요청당 수만 토큰일 수 있습니다. 깊은 추론이 필요 없는 작업에서는 /effort로 수준을 낮추거나 /config에서 사고를 끄는 것으로 비용을 줄일 수 있습니다. Fable 5는 항상 확장 사고를 쓰므로 끌 수 없습니다. costs

11.4빠른 모드

공식빠른 모드는 Claude Opus를 최대 2.5배 빠르게 만드는 고속 구성이고, 토큰당 비용이 더 높습니다. 다른 모델이 아닙니다. 같은 Opus에 속도를 우선하는 API 구성을 쓰는 것이라 품질과 능력은 동일합니다. Opus 5와 Opus 4.8에서 지원하고 Sonnet이나 Haiku에서는 쓸 수 없습니다. fast-mode

/fast          토글(켜면 다른 모델이었어도 Opus로 전환됩니다)
/fast on
/fast off

공식켜지면 Fast mode ON 확인 메시지가 나오고 프롬프트 옆에 작은 표시가 붙습니다. 끄더라도 모델은 Opus에 남으므로 다른 모델로 가려면 /model을 씁니다. fast-mode

세션 처음에 켜는 것이 훨씬 싸다. 공식대화에서 빠른 모드를 처음 켤 때 그 시점까지의 대화 맥락 전체를 빠른 모드 미캐시 입력 가격으로 지불합니다. 대화가 깊을수록 비쌉니다. 이 비용은 대화당 한 번만 발생하므로 끄고 다시 켜는 것은 반복 청구되지 않습니다. fast-mode

공식구독 요금제에서 빠른 모드는 사용 크레딧으로만 제공되며 구독의 포함 사용량에 들어가지 않습니다. 계정에 사용 크레딧이 켜져 있어야 하고, Team과 Enterprise에서는 기본으로 꺼져 있어 Owner가 켜야 합니다. Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry에서는 쓸 수 없습니다. fast-mode

맞는 때표준 모드가 나은 때
코드 변경을 빠르게 반복할 때속도가 덜 중요한 긴 자율 작업
실시간 디버깅배치 처리와 CI 파이프라인
마감이 촉박할 때비용에 민감한 작업

출처: fast-mode

11.5절약 수칙

관행아래는 공식 문서가 Anthropic 내부 팀과 여러 코드베이스의 실사용에서 효과가 확인된 것으로 기록한 수칙입니다. 출처가 공식이지만 성질은 현장 관행이라 그렇게 표시했습니다. best-practices

  • 작업 사이에 /clear. 관련 없는 일로 넘어갈 때 맥락을 비웁니다. 남은 맥락은 이후 모든 메시지에서 토큰을 낭비합니다. 나중에 찾을 수 있게 /rename을 먼저 하고 비웁니다.
  • 구체적으로 지시합니다. "이 코드베이스를 개선해 줘" 같은 요청은 넓은 스캔을 유발하고, "auth.ts의 로그인 함수에 입력 검증을 추가해 줘"는 최소한의 파일 읽기로 처리됩니다.
  • 복잡한 작업에는 플랜 모드를 먼저. 처음 방향이 틀렸을 때의 비싼 재작업을 막습니다.
  • 일찍 방향을 틉니다. 어긋나면 Esc로 즉시 멈추고, /rewind로 이전 체크포인트로 돌립니다.
  • 검증 목표를 줍니다. 클로드가 스스로 확인할 수 있으면 사용자가 수정을 요청하기 전에 문제를 잡습니다.
  • 점진적으로 테스트합니다. 파일 하나 쓰고 테스트하고 다음으로. 문제를 싸게 고칠 수 있는 시점에 잡습니다.
  • CLI 도구를 MCP보다 먼저. gh, aws 같은 도구는 도구 목록을 맥락에 추가하지 않아 더 효율적입니다.
  • 장황한 작업은 서브에이전트에 넘깁니다. 테스트 실행, 문서 조회, 로그 처리의 장황한 출력이 서브에이전트 맥락에 남고 요약만 돌아옵니다.
  • 지침 파일은 짧게. 세션마다 로드되므로 특정 워크플로의 상세 지침은 스킬로 옮깁니다. 공식 문서의 목표치는 200줄 미만입니다.
공식 문서가 꼽는 흔한 실패 다섯 가지. 공식한 세션에 관련 없는 작업을 섞기(처방: 작업 사이 /clear), 같은 것을 계속 교정하기(처방: 두 번 실패 후 /clear하고 더 나은 프롬프트), 지침 파일 과다 작성(처방: 가차 없이 덜어내기), 검증 없이 신뢰하기(처방: 검증할 수 없으면 배포하지 않기), 범위 없는 탐색(처방: 좁히거나 서브에이전트로). best-practices

이 편을 마치며

실무 한 건을 혼자 끝낼 수 있게 됐습니다

지시하는 법과 단축키가 손에 붙고, 명령을 골라 쓰고, git과 리뷰를 붙이고, 세션과 비용을 관리하는 법까지 지났습니다.

이 편을 마치며

  • 지시에 검증 수단을 넣는 것과 넣지 않는 것의 차이를 직접 봤습니다.
  • 플랜 모드로 계획을 먼저 받고 승인한 뒤 구현시켜 봤습니다.
  • 입력창 접두어 네 개와 매일 쓰는 단축키를 씁니다.
  • /context로 무엇이 맥락을 쓰는지 확인했습니다.
  • /code-review를 돌려 결과를 읽고, 무엇을 고칠지 스스로 골랐습니다.
  • 세션에 이름을 붙이고 다음 날 이어갔습니다.
  • /usage로 무엇이 사용량을 쓰는지 봤습니다.
  • 실무 한 건을 탐색부터 커밋과 리뷰까지 혼자 끝냈습니다.

다음 편 L2 맥락과 통제는 클로드에게 무엇을 알려주고 무엇을 막을지를 다룹니다. 컨텍스트 윈도우, 지침 파일과 자동 메모리, 권한 모드와 규칙, 샌드박스, 설정 전량 레퍼런스입니다. 이 편에서 반복해 나온 "맥락이 차오르면 성능이 떨어진다"는 제약을 구조로 다루는 편입니다.

자주 막히는 곳

다 됐다고 하는데 실제로는 안 돼 있습니다

검증 수단이 없으면 "다 된 것처럼 보인다"가 유일한 신호입니다. 테스트, 빌드, 확인 명령처럼 클로드가 직접 돌려 볼 수 있는 검사를 함께 주고, 결과를 증거로 보여 달라고 하세요. 세션 전체에 걸려면 /goal을 씁니다.

대화가 길어지면 앞에서 준 지시를 잊습니다

맥락이 한계에 가까워지면 오래된 도구 출력이 먼저 지워지고 그다음 대화가 요약됩니다. 계속 지켜야 할 규칙은 대화가 아니라 CLAUDE.md에 둡니다. 압축 시 무엇을 보존할지는 /compact <지시>나 지침 파일의 압축 지시 절로 정할 수 있습니다.

CLAUDE.md를 고쳤는데 반응이 없습니다

프로젝트 루트와 사용자 수준 지침 파일은 세션 시작 시 한 번 읽힙니다. 세션 중 편집은 반영되지 않고, 다음 /clear나 /compact 또는 재시작에서 로드됩니다.

같은 것을 세 번째 교정하고 있습니다

맥락이 실패한 접근들로 오염된 상태입니다. /clear하고 배운 것을 반영한 더 구체적인 프롬프트로 새로 시작하세요. 공식 문서의 기준은 두 번입니다.

사용량이 활동량보다 훨씬 빠르게 오릅니다

/usage의 귀속과 행동 신호를 먼저 보세요. 긴 맥락과 캐시 미스가 가장 흔한 원인입니다. 하루 종일 열어 둔 세션은 한 줄 질문에도 대화 전체분의 사용량이 발생하고, 모델이나 노력 수준을 도중에 바꾸면 다음 요청이 전체를 다시 처리합니다.

/code-review --fix가 고친 것을 되돌릴 수 없습니다

백그라운드 리뷰의 수정은 세션 체크포인트 밖에서 이뤄지므로 /rewind로 돌아가지 않습니다. git으로 되돌리세요.


3부 · L2

맥락과 통제

무엇을 알려주고 무엇을 막을지

먼저 필요한 것
L1 일상 운전
마치면
새 프로젝트의 CLAUDE.md·권한·샌드박스를 30분 안에 세팅한다
범위
12~17장
이 편의 성격. L0과 L1은 손놀림을 다뤘습니다. 이 편은 그 손놀림이 무엇을 보고 무엇을 못 건드리는지를 정합니다. 여기서 다루는 파일 넷을 세팅하면 프로젝트 하나가 클로드코드에 맞게 준비됩니다. CLAUDE.md, .claude/settings.json, .claude/settings.local.json, 그리고 필요하면 .claude/rules/입니다.
12

컨텍스트 윈도우

개념

컨텍스트 윈도우

한 세션에서 모델이 한 번에 볼 수 있는 글의 총량입니다. 여기에는 화면에 보이는 대화뿐 아니라 시스템 프롬프트, 지침 파일, 도구 목록, 읽은 파일 내용, 명령 출력이 모두 들어갑니다. 화면에 안 보이는 것이 대부분이라, 무엇이 얼마나 차지하는지 모르면 통제할 수 없습니다.

12.1무엇이 컨텍스트를 먹는가

공식세션을 열고 아무것도 입력하지 않은 상태에서 이미 여러 가지가 로드돼 있습니다. 공식 문서는 대표값이 붙은 예시 세션으로 그 구성을 보여줍니다. 아래 숫자는 그 예시의 값이고, 실제 값은 설정에 따라 달라집니다. context-window

입력 전에 이미 로드된 것예시 토큰터미널에 보이나
시스템 프롬프트4,200안 보임
프로젝트 CLAUDE.md1,800안 보임
자동 메모리 MEMORY.md680안 보임
스킬 설명 목록450안 보임
사용자 ~/.claude/CLAUDE.md320안 보임
환경 정보(작업 디렉터리·플랫폼·셸·git 상태)280안 보임
MCP 도구 이름 목록(스키마는 지연 로드)120안 보임

공식MCP 도구는 기본적으로 이름만 올라가고 전체 스키마는 필요할 때 도구 검색으로 불러옵니다. ENABLE_TOOL_SEARCH=auto로 두면 컨텍스트 윈도우의 10퍼센트 안에 들어갈 때 스키마를 미리 올리고, ENABLE_TOOL_SEARCH=false로 두면 전부 올립니다. context-window

공식작업이 시작되면 여기에 계속 쌓입니다. 파일을 한 번 읽으면 그 파일 전체가 들어가고(예시에서는 2,400 · 1,800 · 1,600 토큰), 경로 범위 규칙은 해당 파일을 읽는 순간 함께 올라가고(예시 380 · 290), 편집 뒤에 도는 훅의 출력도 들어갑니다(예시 120 · 100). 셸 명령을 ! 접두어로 직접 실행하면 명령과 출력이 모두 내 메시지의 일부로 들어갑니다. context-window

서브에이전트는 컨텍스트 격리 장치입니다. 공식공식 예시에서 조사용 서브에이전트는 파일 6,100 토큰을 읽고 최종 요약 420 토큰만 부모 세션으로 돌려줍니다. 읽은 내용은 서브에이전트의 별도 컨텍스트에만 남습니다. 큰 탐색을 통째로 위임하면 그 차이만큼 내 창이 비어 있게 됩니다. context-window

공식지금 세션의 실제 사용량은 /context로 봅니다. 범주별 분해와 최적화 제안, 그리고 어떤 CLAUDE.md와 자동 메모리 파일이 로드됐는지를 함께 보여줍니다. context-window

12.2자동 압축

공식컨텍스트가 한계에 가까워지면 클로드코드가 대화 기록을 요약으로 바꿉니다. 창이 꽉 차도 세션이 끝나지는 않습니다. 압축은 자동으로 돌기도 하고 /compact로 직접 돌릴 수도 있습니다. context-window

공식중요한 것은 무엇이 살아남는지입니다. 로드 경로에 따라 결과가 다릅니다. context-window

메커니즘압축 후
시스템 프롬프트·출력 스타일그대로. 메시지 기록의 일부가 아님
프로젝트 루트 CLAUDE.md, 범위 없는 규칙디스크에서 다시 주입
자동 메모리디스크에서 다시 주입
paths: 프론트매터가 붙은 규칙해당 파일을 다시 읽을 때까지 사라짐
하위 디렉터리의 CLAUDE.md그 디렉터리 파일을 다시 읽을 때까지 사라짐
발동된 스킬 본문다시 주입. 스킬당 5,000 토큰, 합계 25,000 토큰 상한이며 오래된 것부터 버려짐
훅해당 없음. 훅은 컨텍스트가 아니라 코드로 실행됨
대화로만 준 지시는 압축과 함께 사라집니다. 공식압축 뒤에 클로드가 규칙을 잊은 것처럼 보이면 원인은 셋 중 하나입니다. 그 지시를 대화에서만 줬거나, 아직 다시 로드되지 않은 하위 CLAUDE.md에 있거나, 아직 매칭 파일을 읽지 않은 경로 범위 규칙입니다. 계속 지켜야 하는 규칙이면 CLAUDE.md로 옮깁니다. memory

공식스킬 본문은 잘릴 때 앞부분이 남습니다. 그래서 SKILL.md의 가장 중요한 지시는 파일 위쪽에 둡니다. context-window

공식압축이 도는 시점은 조절할 수 있습니다. 설정 위치는 세 곳이고 우선순위가 정해져 있습니다. context-window

/autocompact 500k        이 세션과 이후 세션에 적용(autoCompactWindow 설정에 저장)
/autocompact auto        모델에 맞춰 조정된 기본값으로 복귀
claude --autocompact 500k 이번 실행에만 적용(저장된 설정을 건드리지 않음)

공식명령과 플래그는 100K에서 1M 사이의 값을 받고, 표기는 200000처럼 그냥 숫자, 500k·1M처럼 접미어, 또는 100에서 1000 사이의 맨숫자(200은 200,000)를 씁니다. 스크립트와 클라우드 환경에서는 환경 변수 CLAUDE_CODE_AUTO_COMPACT_WINDOW를 쓰며, 이 변수가 설정돼 있으면 명령·플래그·설정보다 앞섭니다. 환경 변수는 맨숫자만 받습니다. context-window

1M 컨텍스트. 공식Fable 5, Sonnet 5, Opus 4.6 이후, Sonnet 4.6은 100만 토큰 컨텍스트 윈도우를 지원합니다. Sonnet 5는 별도 [1m] 변형을 고르지 않고 1M로 돕니다. 창이 커져도 압축 동작 자체는 같습니다. context-window

12.3압축을 덜 겪는 작업 설계

공식자동 압축이 돌기 전에 손쓸 수 있는 방법이 네 가지 있습니다. 초점을 지정해 압축하기(/compact focus on the auth bug fix), 압축 시점을 앞당기기(/autocompact), 무관한 작업으로 넘어갈 때 /clear로 비우기, 큰 읽기를 서브에이전트에 위임하기입니다. context-window

관행이 넷 중 실제로 효과가 큰 것은 세션 경계를 긋는 습관입니다. 압축은 정보를 잃는 작업이므로, 압축을 잘 견디는 설계보다 압축까지 가지 않는 설계가 낫습니다. 작업 하나가 끝나면 결과를 파일로 남기고 /clear하는 편이, 하나의 긴 세션에서 여러 주제를 굴리다 요약을 두 번 겪는 것보다 안정적입니다.

실습

산출물을 창 밖으로 내보내기

  1. 다음 작업을 시작하기 전에 /context를 실행해 지금 무엇이 차지하고 있는지 확인합니다.
  2. 지금까지의 결론을 파일 하나로 쓰게 시킵니다. 예를 들어 진행 상황을 NOTES.md에 남기게 합니다.
  3. /clear로 비우고, 새 세션에서 그 파일을 참조하며 다음 단계를 시작합니다.

완료 판정. 새 세션의 /context가 시작 상태로 돌아가 있고, 이전 작업의 결론이 대화가 아니라 파일에 남아 있습니다.

실전지침 파일도 압축과 무관하게 매 세션 비용입니다. 이 문서를 쓰는 볼트에서 실제로 재어 보면, 루트 CLAUDE.md는 115줄인데 23,663자입니다. 같은 볼트의 208줄짜리 개발 규칙 문서가 20,680자였습니다. 줄 수는 분량의 대리 지표일 뿐이므로, 줄만 세면 실제 비용을 과소평가합니다. 측정은 맥에서 wc로 했습니다.

wc -l CLAUDE.md    줄 수
wc -m CLAUDE.md    문자 수(한글은 바이트보다 문자로 재는 편이 실제 분량에 가깝습니다)

13

CLAUDE.md와 기억

13.1두 기억 메커니즘

공식세션은 매번 빈 컨텍스트에서 시작합니다. 세션을 넘어 지식을 옮기는 장치는 두 개이며, 둘 다 매 대화 시작 시 로드됩니다. memory

CLAUDE.md 파일자동 메모리
쓰는 주체사람클로드
담기는 것지시와 규칙배운 것과 패턴
범위프로젝트·사용자·조직저장소별. 워크트리끼리 공유
로드매 세션 전문매 세션. 첫 200줄 또는 25KB
쓸 곳코딩 표준, 워크플로, 프로젝트 구조빌드 명령, 디버깅 통찰, 클로드가 발견한 취향
둘 다 설정이 아니라 맥락입니다. 공식클로드는 이 둘을 강제된 구성이 아니라 참고 맥락으로 다룹니다. 클로드의 판단과 무관하게 어떤 동작을 막아야 한다면 PreToolUse 훅을 씁니다. 지시가 구체적이고 짧을수록 실제로 지켜지는 비율이 올라갑니다. memory

공식CLAUDE.md 내용은 시스템 프롬프트의 일부가 아니라 시스템 프롬프트 뒤의 사용자 메시지로 전달됩니다. 그래서 엄격한 준수가 보장되지 않으며, 애매하거나 서로 충돌하는 지시에서 특히 그렇습니다. memory

13.2계층과 로드 순서

공식CLAUDE.md는 네 자리에 놓을 수 있습니다. 아래 표는 로드 순서대로, 범위가 넓은 것부터입니다. 프로젝트 지시가 사용자 지시보다 뒤에 들어갑니다. memory

범위위치공유 대상
관리형 정책맥 /Library/Application Support/ClaudeCode/CLAUDE.md · 리눅스와 WSL /etc/claude-code/CLAUDE.md · 윈도우 C:\Program Files\ClaudeCode\CLAUDE.md조직 전체
사용자 지시~/.claude/CLAUDE.md나 혼자, 모든 프로젝트
프로젝트 지시./CLAUDE.md 또는 ./.claude/CLAUDE.md팀 전체, 버전 관리로
로컬 지시./CLAUDE.local.md나 혼자, 이 프로젝트. .gitignore에 넣습니다

공식탐색 방식은 디렉터리 트리를 위로 걸어 올라가는 것입니다. foo/bar/에서 실행하면 foo/bar/CLAUDE.md와 foo/CLAUDE.md, 그리고 그 옆의 CLAUDE.local.md를 모두 찾습니다. 찾은 파일들은 서로를 덮어쓰지 않고 이어 붙습니다. 순서는 파일시스템 루트에서 작업 디렉터리 방향이라, 실행한 자리에 가까운 지시가 나중에 읽힙니다. 같은 디렉터리 안에서는 CLAUDE.local.md가 CLAUDE.md 뒤에 붙습니다. memory

하위 디렉터리는 온디맨드입니다. 공식작업 디렉터리 아래에 있는 CLAUDE.md는 시작할 때 로드되지 않고, 클로드가 그 디렉터리의 파일을 Read 도구로 읽을 때 함께 들어갑니다. 파일을 쓰거나 새로 만들 때는 로드되지 않습니다. 하위 규칙이 무시되는 것처럼 보이는 가장 흔한 이유입니다. debug-your-config

공식큰 모노레포에서 다른 팀의 CLAUDE.md까지 딸려 올라온다면 claudeMdExcludes로 건너뜁니다. 절대 경로에 글로브 문법으로 매칭하며, 어느 설정 계층에도 둘 수 있고 배열은 계층 간에 병합됩니다. 관리형 정책 CLAUDE.md는 제외할 수 없습니다. memory

{
  "claudeMdExcludes": [
    "**/monorepo/CLAUDE.md",
    "/home/user/monorepo/other-team/.claude/rules/**"
  ]
}

공식지시를 주제별로 쪼개려면 .claude/rules/를 씁니다. .md 파일을 재귀적으로 찾으므로 frontend/·backend/ 같은 하위 폴더로 정리할 수 있습니다. paths 프론트매터가 없는 규칙은 시작 시 .claude/CLAUDE.md와 같은 우선순위로 로드됩니다. 사용자 수준 규칙은 ~/.claude/rules/에 두며, 프로젝트 규칙보다 먼저 로드돼 프로젝트 규칙이 더 높은 우선순위를 갖습니다. memory

공식경로 범위 규칙은 프론트매터 paths로 지정합니다. 클로드가 매칭 패턴의 파일을 읽을 때만 로드되며, 매 도구 호출마다 도는 것이 아닙니다. memory

---
paths:
  - "src/api/**/*.ts"
---

# API 개발 규칙

- 모든 API 엔드포인트는 입력 검증을 포함합니다
- 표준 오류 응답 형식을 씁니다
패턴매칭 대상
**/*.ts모든 디렉터리의 타입스크립트 파일
src/**/*src/ 아래 모든 파일
*.md프로젝트 루트의 마크다운 파일
src/components/*.tsx특정 디렉터리의 리액트 컴포넌트

공식중괄호 확장으로 여러 확장자를 한 패턴에 담을 수 있습니다(src/**/*.{ts,tsx}). 다만 중괄호 그룹마다 패턴 수가 곱해지므로 한 규칙의 paths 목록 전체가 확장 패턴 1,000개와 4MiB의 예산을 공유합니다. 예산을 넘길 패턴은 확장하지 않고 그대로 쓰이며, 그 경우 중괄호가 리터럴이 되어 아무 파일도 매칭하지 않습니다. memory

13.3임포트와 경로 규칙

공식CLAUDE.md는 @path/to/import 문법으로 다른 파일을 불러올 수 있습니다. 임포트된 파일은 시작 시 함께 펼쳐져 컨텍스트에 들어갑니다. 상대 경로와 절대 경로 모두 되고, 상대 경로는 작업 디렉터리가 아니라 임포트를 쓴 파일을 기준으로 풀립니다. 임포트는 재귀적이며 최대 4단계까지입니다. memory

공식임포트 파싱은 마크다운 코드 스팬과 코드 블록을 건너뜁니다. 경로를 임포트하지 않고 언급만 하려면 백틱으로 감쌉니다. memory

See @README for project overview and @package.json for available npm commands.

# Additional Instructions
- git workflow @docs/git-instructions.md
프로젝트 파일에서 밖을 임포트하면 승인 대화가 뜹니다. 공식프로젝트 수준 메모리 파일의 임포트가 작업 디렉터리 밖으로 풀리면 외부 임포트입니다. 처음 마주칠 때 파일 목록을 보여주는 승인 대화가 뜨고, 거절하면 그 임포트는 비활성 상태로 남고 대화도 다시 뜨지 않습니다. 남이 공유 프로젝트에 커밋한 파일로부터 나를 보호하는 장치입니다. ~/.claude/CLAUDE.md나 ~/.claude/rules/의 임포트는 내가 쓴 파일이므로 대화 없이 로드됩니다. memory

공식여러 워크트리를 쓴다면 .gitignore된 CLAUDE.local.md는 만든 워크트리에만 존재합니다. 개인 지시를 워크트리 전체에 공유하려면 홈 디렉터리의 파일을 임포트합니다. memory

# Individual Preferences
- @~/.claude/my-project-instructions.md

공식클로드코드는 AGENTS.md가 아니라 CLAUDE.md를 읽습니다. 저장소가 이미 AGENTS.md를 쓴다면 그것을 임포트하는 CLAUDE.md를 만들어 중복 없이 같은 지시를 읽게 합니다. 심링크(ln -s AGENTS.md CLAUDE.md)도 되지만, 윈도우에서 심링크 생성은 관리자 권한이나 개발자 모드가 필요하므로 임포트 쪽이 안전합니다. memory

@AGENTS.md

## Claude Code

Use plan mode for changes under `src/billing/`.

공식--add-dir로 추가한 디렉터리의 메모리 파일은 기본적으로 로드되지 않습니다. 로드하려면 환경 변수를 켭니다. 이때 CLAUDE.md, .claude/CLAUDE.md, .claude/rules/*.md, CLAUDE.local.md가 함께 들어옵니다. memory

CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config

13.4잘 쓰인 CLAUDE.md의 조건

공식공식 문서가 제시하는 기준은 네 가지입니다. 분량은 파일당 200줄 미만을 목표로 합니다. 길면 컨텍스트를 더 쓰고 준수율이 떨어집니다. 구조는 마크다운 헤더와 불릿으로 관련 지시를 묶습니다. 구체성은 검증 가능한 수준으로 씁니다. 일관성은 서로 모순되는 규칙을 없애는 것입니다. 두 규칙이 충돌하면 클로드가 임의로 하나를 고를 수 있습니다. memory

이렇게 쓰지 말고이렇게 씁니다
코드를 제대로 포맷하세요2칸 들여쓰기를 씁니다
변경사항을 테스트하세요커밋 전에 npm test를 실행합니다
파일을 정리된 상태로 두세요API 핸들러는 src/api/handlers/에 둡니다

공식무엇을 넣을지의 판정 기준도 문서에 있습니다. 같은 실수를 두 번째로 할 때, 코드 리뷰가 클로드가 알았어야 할 것을 잡았을 때, 지난 세션에 입력한 교정을 또 입력할 때, 새 팀원이 같은 맥락을 필요로 할 때입니다. 반대로 여러 단계짜리 절차이거나 코드베이스의 일부에서만 의미가 있는 항목은 스킬이나 경로 범위 규칙으로 옮깁니다. memory

줄이는 것도 도구가 돕습니다. 공식/doctor 점검은 커밋된 CLAUDE.md에 대해 트림을 제안합니다. 디렉터리 구조, 의존성 목록, 아키텍처 개요처럼 클로드가 코드베이스에서 스스로 알아낼 수 있는 내용을 잘라내고, 함정·근거·도구 기본값과 다른 관례는 남깁니다. memory

공식블록 수준 HTML 주석은 컨텍스트에 주입되기 전에 제거됩니다. 사람 관리자용 메모를 토큰 비용 없이 남길 수 있습니다. 코드 블록 안의 주석은 보존되고, Read 도구로 파일을 직접 열면 주석이 그대로 보입니다. memory

공식임포트로 쪼개는 것은 정리에는 도움이 되지만 컨텍스트를 줄이지는 않습니다. 임포트된 파일도 시작 시 로드됩니다. 실제로 줄이려면 경로 범위 규칙을 쓰거나 매 세션 필요 없는 내용을 지웁니다. memory

실전200줄 기준은 자기 볼트에 대보면 바로 걸립니다. 이 가이드를 쓰는 볼트에서 CLAUDE.md 9개를 재어 보니 두 개가 기준을 넘었습니다. 개발 도메인 규칙이 208줄, 지식베이스 규칙이 224줄입니다. 루트는 115줄로 기준 안이지만 12.3절에서 본 것처럼 문자 수로는 가장 큽니다. 어느 쪽도 자동으로 경고되지 않으므로, 아래 한 줄을 주기적으로 돌려 스스로 재는 편이 확실합니다.

find . -name "CLAUDE.md" -not -path "./.git/*" -exec wc -l {} \;
충돌은 조용히 나쁘게 작동합니다. 실전계층이 늘어나면 상위와 하위가 같은 주제를 다르게 말하기 시작합니다. 위 볼트에서는 도메인별 규칙 문서가 6개까지 늘었고, 루트와 도메인이 같은 항목을 각자 정의하는 지점이 실제로 생겼습니다. 클로드는 이때 오류를 내지 않고 한쪽을 고릅니다. 계층을 추가할 때마다 그 주제의 정본이 어디인지를 한 줄로 명시해 두는 것이 유일한 방어였습니다.

13.5자동 메모리 관리

공식자동 메모리는 클로드가 스스로 메모를 남기는 장치입니다. 빌드 명령, 디버깅 통찰, 아키텍처 메모, 코드 스타일 취향, 작업 습관이 대상입니다. 매 세션 무언가를 저장하는 것은 아니고, 나중 대화에서 쓸모가 있을지를 기준으로 판단합니다. 기본값은 켜짐입니다. memory

공식저장 위치는 프로젝트별로 ~/.claude/projects/<project>/memory/입니다. <project>는 git 저장소에서 파생되므로 같은 저장소의 모든 워크트리와 하위 디렉터리가 하나의 자동 메모리 디렉터리를 공유합니다. git 저장소 밖에서는 프로젝트 루트를 씁니다. 자동 메모리는 기기 로컬이며 기기나 클라우드 환경 사이에 공유되지 않습니다. memory

~/.claude/projects/<project>/memory/
├── MEMORY.md          간결한 색인. 매 세션 로드됨
├── debugging.md       디버깅 패턴 상세 메모
├── api-conventions.md API 설계 결정
└── ...                클로드가 만드는 다른 주제 파일

공식매 대화 시작 시 로드되는 것은 MEMORY.md의 첫 200줄, 또는 첫 25KB 중 먼저 닿는 쪽까지입니다. 그 뒤 내용은 시작 시 로드되지 않습니다. 클로드가 MEMORY.md에 쓴 뒤 클로드코드가 파일을 두 한계에 대조합니다. 한계에 가까우면 짧게 줄이라고 상기시키고, 한계를 넘으면 쓰기는 성공하지만 색인을 다시 쓰라는 오류를 돌려줍니다. 넘긴 부분은 다음 로드에서 버려지기 때문입니다. memory

이 한계는 MEMORY.md에만 적용됩니다. 공식CLAUDE.md는 길이와 무관하게 전문이 로드됩니다. 그리고 검사는 실제로 로드되는 내용만 재기 때문에, YAML 프론트매터와 블록 HTML 주석은 벗겨진 뒤 계산됩니다. debugging.md 같은 주제 파일은 시작 시 로드되지 않고, 필요할 때 클로드가 파일 도구로 읽습니다. memory

공식끄고 켜는 방법은 세 가지입니다. 세션에서 /memory를 열어 토글하면 ~/.claude/settings.json에 autoMemoryEnabled로 저장됩니다. 프로젝트 하나만 끄려면 그 프로젝트 설정에 "autoMemoryEnabled": false를 둡니다. 환경 변수로 끄려면 CLAUDE_CODE_DISABLE_AUTO_MEMORY=1입니다. 저장 위치를 바꾸려면 autoMemoryDirectory에 절대 경로나 ~/로 시작하는 경로를 씁니다. 프로젝트나 로컬 설정에 두면 그 폴더의 워크스페이스 신뢰 대화를 수락한 뒤에만 적용됩니다. memory

공식메모리 파일은 그냥 마크다운이라 언제든 열어 고치거나 지울 수 있습니다. /memory로 목록을 보고 편집기로 엽니다. 프론트매터가 있는 파일에 클로드가 쓸 때는 modified 필드에 ISO 8601 타임스탬프가 기록되어 그 사실이 얼마나 최신인지 알 수 있습니다. 프론트매터가 없는 파일에는 클로드코드가 프론트매터를 새로 붙이지 않습니다. memory

실전200줄과 25KB 중 어느 쪽에 먼저 닿는지는 언어에 달렸습니다. 이 볼트의 MEMORY.md는 148줄에 20,720바이트로, 줄 기준으로는 74퍼센트인데 바이트 기준으로는 83퍼센트입니다. 한글 색인은 바이트 한계에 먼저 닿습니다. 같은 디렉터리에 시작 시 로드되지 않는 주제 파일이 145개 있었고, 색인 한 줄이 그 파일 하나를 가리키는 구조였습니다. 확인은 아래 두 줄로 합니다.

wc -l ~/.claude/projects/<project>/memory/MEMORY.md
wc -c ~/.claude/projects/<project>/memory/MEMORY.md

13.6무엇을 어디에 둘까

지침을 놓을 자리가 다섯 개나 되면 결정 자체가 비용입니다. 판정은 두 질문으로 끝납니다. 매 세션 필요한가, 그리고 보장이 필요한가.

성격두는 곳로드 시점보장
매 세션 알아야 하는 프로젝트 사실CLAUDE.md시작 시 전문없음. 맥락일 뿐
특정 파일 종류에만 해당하는 규칙.claude/rules/ + paths:매칭 파일을 읽을 때없음
여러 단계짜리 반복 절차스킬부를 때 또는 클로드가 관련 있다고 판단할 때없음
정해진 시점에 반드시 도는 것훅수명주기 이벤트마다있음. 코드로 실행
절대 일어나면 안 되는 것permissions.deny도구 호출 전있음. 클라이언트가 강제
클로드가 스스로 알아낸 것자동 메모리시작 시 색인 200줄 또는 25KB없음
CLAUDE.md와 권한은 서로를 대체하지 않습니다. 공식CLAUDE.md는 프로젝트가 어떻게 돌아가는지를 알려 좋은 판단을 하게 만드는 것이고, 권한과 훅은 클로드가 무엇을 판단하든 한계를 강제하는 것입니다. "우리는 이렇게 합니다"는 CLAUDE.md에, "이건 절대 안 됩니다"는 권한이나 훅에 씁니다. debug-your-config

공식조직 배포에서는 이 갈림이 더 분명합니다. 도구·명령·경로 차단은 관리형 설정의 permissions.deny, 샌드박스 강제는 sandbox.enabled, 환경 변수와 API 라우팅은 env, 인증 방식과 조직 고정은 forceLoginMethod·forceLoginOrgUUID입니다. 코드 스타일, 데이터 취급 안내, 행동 지시는 관리형 CLAUDE.md입니다. memory

실전이 볼트는 그 갈림을 한쪽으로 몰아 쓰고 있었습니다. .claude/settings.json에는 권한 규칙이 하나도 없고 hooks만 있습니다. 이벤트 3종에 핸들러 10개(UserPromptSubmit 1, Stop 2, SessionStart 7)입니다. 즉 "반드시 도는 것"은 전부 훅으로 보장하고, 권한은 규칙으로 설계하지 않은 상태였습니다. 나쁜 선택은 아니지만, 훅은 동작을 추가하는 장치이고 권한은 동작을 막는 장치라 서로를 대신하지 못합니다. 자기 프로젝트가 어느 쪽으로 기울었는지는 아래로 바로 확인됩니다.

python3 -c "import json;d=json.load(open('.claude/settings.json'));print(list(d.keys()))"

13.7.claude 디렉터리 해부

공식설정은 두 자리에 삽니다. 프로젝트 것은 저장소의 .claude/ 아래(CLAUDE.md·.mcp.json·.worktreeinclude는 루트), 전역 것은 ~/.claude/ 아래이며 모든 프로젝트에 적용됩니다. claude-directory

파일범위커밋하는 일
CLAUDE.md프로젝트·전역예매 세션 로드되는 지시
rules/*.md프로젝트·전역예주제별 지시. 경로로 게이팅 가능
settings.json프로젝트·전역예권한, 훅, 환경 변수, 모델 기본값
settings.local.json프로젝트만아니오개인 오버라이드. 클로드코드가 저장할 때 gitignore 처리
.mcp.json프로젝트만예팀 공유 MCP 서버
.worktreeinclude프로젝트만예새 워크트리로 복사할 gitignore된 파일
skills/<name>/SKILL.md프로젝트·전역예/name으로 부르거나 자동 발동하는 프롬프트
commands/*.md프로젝트·전역예단일 파일 프롬프트. 스킬과 같은 메커니즘
output-styles/*.md프로젝트·전역예시스템 프롬프트에 붙는 커스텀 섹션
agents/*.md프로젝트·전역예자체 프롬프트와 도구를 가진 서브에이전트 정의
workflows/*.js프로젝트·전역예동적 워크플로 스크립트. 각 파일이 /<name> 명령이 됨
agent-memory/<name>/프로젝트·전역예서브에이전트의 영속 메모리
~/.claude.json전역만아니오앱 상태, OAuth, UI 토글, 개인 MCP 서버
projects/<project>/memory/전역만아니오자동 메모리
keybindings.json전역만아니오커스텀 단축키
themes/*.json전역만아니오커스텀 색상 테마
~/.claude.json과 ~/.claude/settings.json은 다른 파일입니다. 공식~/.claude.json은 앱 상태와 UI 토글을 담습니다. permissions, hooks, env는 ~/.claude/settings.json에 씁니다. 전역 설정이 무시되는 것처럼 보이는 흔한 원인입니다. debug-your-config

공식내가 쓰는 설정 외에 클로드코드가 작업하며 남기는 데이터도 ~/.claude에 쌓입니다. 이 파일들은 평문입니다. 도구를 통과한 것은 무엇이든 디스크의 전사에 남습니다. 파일 내용, 명령 출력, 붙여넣은 텍스트가 그렇습니다. claude-directory

~/.claude/ 아래 경로내용
projects/<project>/<session>.jsonl전체 대화 전사. 모든 메시지·도구 호출·도구 결과
projects/<project>/<session>/tool-results/큰 도구 출력이 따로 떨어진 파일
file-history/<session>/클로드가 바꾼 파일의 편집 전 스냅숏. 체크포인트 복원용
plans/플랜 모드에서 쓴 계획 파일
debug/세션별 디버그 로그. --debug나 /debug로 시작할 때만
shell-snapshots/시작 시 캡처한 별칭·함수·셸 옵션
history.jsonl입력한 모든 프롬프트. 타임스탬프와 프로젝트 경로 포함. 위쪽 화살표 회상에 쓰임

공식위 표의 앞쪽 항목들은 cleanupPeriodDays보다 오래되면 시작할 때 삭제됩니다. 기본값은 30일, 최솟값은 1이고 0은 검증 오류로 실패합니다. 반면 history.jsonl은 자동 정리 대상이 아니어서 지울 때까지 남습니다. 클로드코드가 설정 파일을 읽거나 파싱하지 못하면 정리 스윕을 멈추고 /status에 경고를 띄웁니다. claude-directory

공식노출을 줄이는 방법은 세 가지입니다. cleanupPeriodDays를 낮춰 보관 기간을 줄이기, CLAUDE_CODE_SKIP_PROMPT_HISTORY를 설정해 전사와 프롬프트 기록 자체를 남기지 않기, 그리고 권한 규칙으로 자격증명 파일 읽기를 거부하기입니다. claude-directory

공식프로젝트 하나의 로컬 상태를 통째로 지우려면 claude project purge입니다. 전사와 자동 메모리, 세션별 tasks/·debug/·file-history/ 항목, history.jsonl의 해당 프롬프트 줄, ~/.claude.json의 프로젝트 항목을 지웁니다. 삭제 전에 전체 계획을 출력하고 확인을 받습니다. claude-directory

claude project purge ~/work/my-repo --dry-run   지우지 않고 계획만 확인
claude project purge ~/work/my-repo             계획 출력 후 확인 한 번
claude project purge ~/work/my-repo --yes       확인 생략(스크립트용)
지우면 안 되는 것. 공식~/.claude.json, ~/.claude/settings.json, ~/.claude/plugins/는 인증·설정·설치된 플러그인을 담고 있으니 지우지 않습니다. claude-directory

실전전사가 얼마나 쌓이는지는 직접 세어 보면 감이 옵니다. 이 볼트 프로젝트의 전사 디렉터리에는 세션 .jsonl 파일이 126개 있었습니다. 기본 보관 기간 30일 안에서 그만큼이 평문으로 남아 있다는 뜻입니다.

ls ~/.claude/projects/<project>/*.jsonl | wc -l
du -sh ~/.claude/projects/<project>

14

권한 설계

층이 세 개입니다. 공식권한 규칙은 무엇을 허용·확인·거부할지 정하고, 권한 모드는 매번 물어볼지의 기준선을 정하고, 샌드박스는 실행된 명령이 무엇에 닿을 수 있는지를 OS 수준에서 제한합니다. 규칙과 모드는 클로드코드가 명령 문자열을 보고 실행 전에 판정하고, 샌드박스는 운영체제가 돌고 있는 프로세스에 강제합니다. 그래서 샌드박스는 클로드가 무엇을 실행했는지와 무관하게, 허용된 명령이 이름보다 많은 일을 하더라도 유지됩니다. sandboxing

14.1권한 모드 여섯 가지

공식모드는 물어보는 빈도의 기준선입니다. 아래 표는 각 모드에서 승인 없이 도는 것입니다. permission-modes

모드안 물어보고 도는 것맞는 상황
default읽기만시작할 때, 민감한 작업
acceptEdits읽기, 파일 편집, 흔한 파일시스템 명령(mkdir touch mv cp 등)내가 검토하면서 코드를 굴릴 때
plan읽기. 자동 모드가 가용하면 분류기가 승인한 명령도바꾸기 전에 코드베이스를 훑을 때
auto전부. 백그라운드 안전 검사를 거쳐긴 작업, 승인 피로 줄이기
dontAsk미리 승인된 도구만잠긴 CI와 스크립트
bypassPermissions전부격리된 컨테이너와 VM에서만

공식매 동작을 검토하는 모드는 CLI·claude --help·VS Code와 젯브레인즈 확장·데스크톱 앱에서 Manual이라는 이름으로 표시됩니다. 설정값은 default이고, 훅과 SDK 통합이 쓰는 값도 그것입니다. CLI는 어디서든 manual을 별칭으로 받습니다(claude --permission-mode manual). permission-modes

공식전환은 세 갈래입니다. 세션 중에는 Shift Tab으로 default → acceptEdits → plan을 순환합니다. 시작할 때는 플래그로 지정하고, 기본값으로 굳히려면 설정 파일에 defaultMode를 씁니다. permission-modes

claude --permission-mode plan
{
  "permissions": {
    "defaultMode": "acceptEdits"
  }
}

공식모든 모드가 기본 순환에 들어 있지는 않습니다. auto는 계정이 자동 모드 요건을 만족할 때 나타나고, 순환으로 들어갈 때 확인 프롬프트가 없습니다. bypassPermissions는 --permission-mode bypassPermissions·--dangerously-skip-permissions·--allow-dangerously-skip-permissions로 시작했거나 설정에 defaultMode로 지정했을 때만 나타납니다(--allow- 변형은 활성화 없이 순환에만 추가합니다). dontAsk는 순환에 절대 나타나지 않고 --permission-mode dontAsk로만 켭니다. permission-modes

공식상태 표시줄에 지금 모드가 보입니다. ⏸ plan mode on, ⏵⏵ accept edits on, ⏵⏵ auto mode on, ⏵⏵ don't ask on, ⏵⏵ bypass permissions on이고 Manual은 회색 ⏸ manual mode on입니다. permission-modes

공식acceptEdits가 자동 승인하는 파일시스템 명령은 mkdir touch rm rmdir mv cp sed입니다. LANG=C처럼 안전한 환경 변수 접두어나 timeout·nice·nohup 같은 프로세스 래퍼가 붙은 형태도 포함합니다. 다만 자동 승인은 작업 디렉터리나 additionalDirectories 안의 경로에만 적용되고, 범위 밖 경로와 보호 경로 쓰기, 그리고 내장 읽기 전용 집합을 뺀 다른 Bash 명령은 여전히 물어봅니다. permission-modes

공식플랜 모드는 클로드가 조사하고 변경안을 제안하되 실제로 고치지는 않게 합니다. Shift Tab으로 들어가거나 프롬프트 하나에만 적용하려면 /plan을 접두어로 씁니다. 계획이 준비되면 세 갈래로 답합니다. 자동 모드로 승인, 편집을 하나씩 승인, 또는 계속 계획하기입니다. 승인하면 플랜 모드를 벗어나 그 선택에 해당하는 모드로 세션이 바뀝니다. Ctrl G로 계획을 편집기에서 직접 고칠 수 있습니다. permission-modes

공식dontAsk는 물어봐야 할 모든 도구 호출을 자동 거부합니다. permissions.allow에 매칭되는 동작, 읽기 전용 Bash 명령, PreToolUse 훅이 승인한 호출만 돕니다. 세션이 입력을 기다리는 일이 없으므로 CI 파이프라인에 맞습니다. 명시적 ask 규칙에 걸리는 호출은 물어보는 대신 거부하고, 내장 AskUserQuestion 도구도 거부합니다. permission-modes

bypassPermissions는 격리된 환경에서만 씁니다. 공식이 모드는 권한 프롬프트와 안전 검사를 끄고, .git과 .claude 같은 보호 경로 쓰기도 그대로 실행합니다. 컨테이너·VM·인터넷 없는 개발 컨테이너처럼 클로드코드가 호스트를 망가뜨릴 수 없는 환경에서만 씁니다. 이 모드로 시작하지 않은 세션에서 이 모드로 들어갈 수는 없습니다. 첫 대화형 실행에서 책임을 수락하는 경고 대화가 한 번 뜨고, 거절하면 클로드코드가 종료합니다. 리눅스와 맥에서 root나 sudo로 실행하면 시작을 거부합니다. permission-modes

공식이 모드에서도 남아 있는 프롬프트가 있습니다. 명시적 ask 규칙, 조직이 ask로 설정한 커넥터 도구, requiresUserInteraction 표시가 붙은 MCP 도구입니다. 그리고 파일시스템 루트나 홈 디렉터리를 지우는 명령(rm -rf /, rm -rf ~)은 모델 오류에 대한 차단기로 여전히 물어봅니다. 명령이 $(...)·백틱 명령 치환이나 <(...) 프로세스 치환을 포함할 때도 마찬가지입니다. permission-modes

공식관리자는 permissions.disableBypassPermissionsMode나 permissions.disableAutoMode를 "disable"로 두어 해당 모드를 막을 수 있습니다. 관리형 설정에 두면 덮어쓸 수 없지만, 어느 스코프에서도 동작하므로 사용자가 자기 설정에 넣어 스스로를 잠글 수도 있습니다. permissions

공식세션이 어느 모드로 시작하는지는 2026-08-14에 바뀌었습니다. Pro·Max·Team 플랜에서 새 세션의 내장 시작 모드가 auto가 됐습니다. 그 전에는 default(Manual)였습니다. 직접 기본 모드를 정해 둔 사용자는 일회성 전환 안내를 수락하기 전까지 그 설정이 유지되고, 조직이 관리하는 기본값은 바뀌지 않습니다. 모드는 언제든 다시 바꿀 수 있습니다. 같은 플랜에서 자동 모드 분류기 호출은 사용 한도에 계산되지 않습니다. permission-modes

14.2허용·거부·확인 규칙

공식규칙은 세 종류입니다. allow는 수동 승인 없이 쓰게 하고, ask는 매번 확인을 띄우고, deny는 아예 막습니다. 평가 순서는 deny → ask → allow이며, 그 순서에서 처음 매칭된 것이 결과를 정합니다. 규칙이 얼마나 구체적인지는 순서를 바꾸지 않습니다. permissions

넓은 deny에 예외를 달 수 없습니다. 공식Bash(aws *) 같은 deny는 더 좁은 Bash(aws s3 ls) allow에도 매칭되는 호출까지 전부 막습니다. ask와 allow 사이도 같습니다. 매칭되는 ask 규칙이 있으면 더 구체적인 allow가 있어도 물어봅니다. permissions

공식deny 규칙은 도구 이름만 쓸 때와 패턴을 씌울 때 동작이 다릅니다. Bash처럼 이름만 쓰면 그 도구를 클로드의 컨텍스트에서 아예 제거해 클로드가 도구의 존재를 보지 못합니다. Bash(rm *)처럼 범위를 씌우면 도구는 남고 매칭되는 호출만 막힙니다. Bash(*)는 Bash와 같으며 deny로 쓰면 두 형태 모두 도구를 제거합니다. permissions

공식Bash 규칙은 * 와일드카드를 어느 위치에서든 씁니다. 하나의 *가 공백을 포함한 임의 문자열에 매칭되므로 와일드카드 하나가 여러 인자를 덮습니다. permissions

규칙매칭
Bash(npm run build)정확히 그 명령
Bash(npm *)npm 으로 시작하는 모든 명령
Bash(* install) install로 끝나는 모든 명령
Bash(git * main)git checkout main, git push origin main, git merge main 등
공백 하나가 의미를 바꿉니다. 공식끝에 공백을 두고 *를 쓰면(Bash(ls *)) 단어 경계가 강제되어 접두어 뒤에 공백이나 문장 끝이 와야 합니다. 그래서 ls -la는 매칭되고 lsof는 안 됩니다. 공백 없는 Bash(ls*)는 경계 제약이 없어 둘 다 매칭합니다. :* 접미어는 끝의 와일드카드와 같은 뜻이라 Bash(ls:*)는 Bash(ls *)와 같습니다. 단 :*는 패턴 끝에서만 인식되고, Bash(git:* push)에서는 콜론이 리터럴로 취급돼 매칭하지 않습니다. permissions

공식클로드코드는 셸 연산자를 인식합니다. Bash(safe-cmd *) 규칙이 safe-cmd && other-cmd를 허용하지 않습니다. 인식되는 구분자는 && || ; | |& & 그리고 개행이며, 규칙은 각 하위 명령에 독립적으로 매칭돼야 합니다. 복합 명령을 "다시 묻지 않기"로 승인하면 승인이 필요한 하위 명령마다 별도 규칙이 저장됩니다. 한 복합 명령에서 최대 5개까지입니다. permissions

공식Bash 규칙 매칭 전에 정해진 래퍼 집합이 벗겨집니다. 그래서 Bash(npm test *)가 timeout 30 npm test에도 매칭됩니다. 벗겨지는 래퍼는 timeout time nice nohup stdbuf, 셸 빌트인 command와 builtin, zsh의 noglob입니다. 플래그 없는 xargs도 벗겨집니다. 조회 형태인 command -v와 zsh의 nocorrect는 벗겨지지 않습니다. permissions

환경 실행기는 래퍼 목록에 없습니다. 공식direnv exec, devbox run, mise exec, npx, docker exec는 벗겨지지 않습니다. 이들은 인자를 명령으로 실행하므로 Bash(devbox run *) 규칙은 run 뒤의 무엇이든 허용합니다. devbox run rm -rf .도 포함입니다. 환경 실행기 안의 작업을 승인하려면 실행기와 내부 명령을 함께 적은 구체적 규칙(Bash(devbox run npm test))을 내부 명령마다 하나씩 씁니다. watch setsid ionice flock 같은 exec 래퍼와 -exec·-delete가 붙은 find는 접두어 규칙으로 자동 승인되지 않고 항상 물어봅니다. permissions

공식내장 읽기 전용 명령 집합은 모든 모드에서 프롬프트 없이 돕니다. ls cat echo pwd head tail grep find wc which diff stat du cd와 git의 읽기 전용 형태입니다. 이 집합은 구성할 수 없고, 그중 하나에 확인을 받고 싶다면 ask나 deny 규칙을 추가합니다. permissions

공식다만 이 집합도 몇 경우에는 물어봅니다. 쓰기·실행 가능 플래그를 가진 명령(find sort sed git)에 인용되지 않은 글로브가 있을 때(글로브가 -delete 같은 플래그로 확장될 수 있으므로), docker가 다른 데몬을 가리키는 플래그를 달았을 때, file이 경로를 여는 플래그를 쓸 때, 윈도우에서 인자에 UNC 네트워크 경로가 있을 때, 그리고 클로드코드가 명령을 완전히 파싱하지 못할 때입니다. 1만 자를 넘는 명령은 항상 물어봅니다. permissions

공식Read와 Edit 규칙은 gitignore 패턴 문법을 쓰며 앵커가 네 종류입니다. 여기서 실수가 가장 많이 납니다. permissions

패턴뜻예
//path파일시스템 루트부터의 절대 경로Read(//Users/alice/secrets/**)
~/path홈 디렉터리부터의 경로Read(~/Documents/*.pdf)
/path그 규칙을 정의한 설정 소스 기준Edit(/src/**/*.ts)
path 또는 ./path현재 디렉터리 기준Read(*.env)
슬래시 하나는 절대 경로가 아닙니다. 공식/Users/alice/file은 절대 경로가 아니라 설정 소스 기준으로 앵커됩니다. 절대 경로는 //Users/alice/file입니다. 같은 /path 규칙이 어디에 쓰였는지에 따라 다른 자리를 가리킵니다. 프로젝트 설정이면 <프로젝트 루트>/path, 로컬 설정이면 <원래 cwd>/path, 사용자 설정이면 ~/.claude/path입니다. 사용자 설정에 Read(/secrets/**)를 쓰면 프로젝트의 secrets가 아니라 ~/.claude/secrets/**를 막습니다. 모든 프로젝트에 적용하려면 //나 ~/를 씁니다. permissions

공식매칭 깊이는 패턴 모양에 따라 다르고, 단일 세그먼트 디렉터리 패턴에서는 규칙 종류에 따라서도 다릅니다. allow에서 Edit(src/**)는 <cwd>/src만 매칭하지만, deny와 ask에서 Read(secrets/**)는 현재 디렉터리 아래 어느 깊이의 secrets 디렉터리에도 매칭합니다. 맨 파일명은 gitignore 의미를 따라 어느 깊이에서든 매칭하므로 Read(.env)와 Read(**/.env)는 같습니다. permissions

규칙src/app.tsvendor/pkg/src/lib.js
Edit(src/**) allow로매칭매칭 안 함
Edit(src/**) deny·ask로매칭매칭
Edit(/src/**) 모든 종류매칭매칭 안 함
Edit(**/src/**) 모든 종류매칭매칭

공식파일 권한은 Edit(path)와 Read(path) 규칙으로만 검사됩니다. Write, NotebookEdit, Glob, 구형 MultiEdit에 경로 규칙을 쓰면 규칙은 받아들여지지만 조회되지 않고 시작 시 경고가 뜹니다. Write(docs/**) 대신 Edit(docs/**)를, Glob(docs/**) 대신 Read(docs/**)를 씁니다. Read deny 규칙은 같은 경로의 Edit 도구까지 막고, 거기에 새 파일을 만드는 것도 막습니다. permissions

규칙은 임의 서브프로세스를 막지 못합니다. 공식Read와 Edit deny 규칙은 클로드의 내장 파일 도구와 클로드코드가 Bash에서 인식하는 파일 명령(cat head tail sed)에 적용됩니다. 파이썬이나 노드 스크립트가 스스로 파일을 여는 것처럼, 간접적으로 파일을 읽고 쓰는 임의 서브프로세스에는 적용되지 않습니다. 모든 프로세스를 막는 OS 수준 강제가 필요하면 샌드박스를 켭니다. sandboxing

공식심링크는 두 경로로 검사됩니다. 링크 자신과 링크가 가리키는 파일입니다. allow 규칙은 둘 다 매칭될 때만 적용되고, 하나라도 어긋나면 물어봅니다. deny 규칙은 둘 중 하나만 매칭돼도 막습니다. permissions

공식WebFetch 규칙은 domain: 접두어로 호스트명에 매칭합니다. WebFetch(domain:*.example.com)은 어느 깊이의 서브도메인에도 매칭하지만 example.com 자체에는 매칭하지 않습니다. 앞의 *.이나 단독 * 외의 위치에서 와일드카드는 점 사이의 텍스트에만 매칭하므로, example.*는 example.org에 매칭하고 example.evil.com에는 매칭하지 않습니다. permissions

공식MCP 규칙은 서버 이름을 씁니다. mcp__puppeteer는 그 서버의 모든 도구에, mcp__puppeteer__puppeteer_navigate는 특정 도구에 매칭합니다. 서브에이전트는 Agent(Explore)처럼 이름으로 통제합니다. /cd가 옮길 수 있는 디렉터리는 Cd 규칙으로 정하며, Cd allow 규칙을 하나라도 추가하면 /cd가 허용목록 모드로 바뀝니다. permissions

프로젝트 allow 규칙은 워크스페이스 신뢰 뒤에 적용됩니다. 공식프로젝트 .claude/settings.json의 permissions.allow와 permissions.additionalDirectories는 능력을 부여하므로, 그 워크스페이스의 신뢰 대화를 수락한 뒤에만 적용됩니다. 그 전에는 규칙을 읽기는 하지만 적용하지 않습니다. 신뢰 대화가 그 폴더가 부여하려는 allow 규칙과 추가 디렉터리를 나열해 주므로 수락 전에 검토할 수 있습니다. deny와 ask는 제한만 하므로 영향받지 않습니다. permissions

공식"예, 다시 묻지 않기"로 저장되는 위치도 알아 두면 좋습니다. Bash 명령처럼 영구 저장되는 승인은 git 저장소 루트의 .claude/settings.local.json에 저장되며, 워크트리를 거쳐 메인 체크아웃으로 해석됩니다. 그래서 그 저장소 어디에서 시작한 세션에도, 하위 디렉터리와 워크트리에도 적용됩니다. 파일 수정 승인은 파일에 저장되지 않고 세션이 끝날 때까지만 유지됩니다. permissions

공식Bash나 PowerShell 권한 프롬프트에서 Ctrl E를 누르면 그 명령이 무엇을 하는지, 왜 실행하는지, 무엇이 잘못될 수 있는지를 Low risk·Med risk·High risk 라벨과 함께 설명합니다. 설명 생성 요청은 Ctrl E를 누를 때만 나가고, 설명을 봐도 명령이 실행되지는 않습니다. permissions

14.3자동 모드 구성

공식자동 모드는 별도 분류기 모델이 실행 전에 동작을 검토해, 요청 범위를 넘어서거나 알려지지 않은 인프라를 향하거나 클로드가 읽은 적대적 콘텐츠에 이끌린 것처럼 보이는 동작을 막습니다. 명시적 ask 규칙은 여전히 프롬프트를 띄웁니다. permission-modes

프롬프트를 줄이는 장치이고 안전을 보장하는 장치가 아닙니다. 공식공식 문서의 표현대로, 방향을 신뢰하는 작업에 쓰고 민감한 작업의 검토를 대체하는 데 쓰지 않습니다. permission-modes

공식판정 순서는 정해져 있고 처음 매칭된 단계가 이깁니다. 1) allow·ask·deny 규칙에 매칭되는 동작은 즉시 결정됩니다. 다만 보호 경로 쓰기는 allow 규칙에 매칭돼도 분류기로 넘어갑니다. 2) 작업 디렉터리 안의 읽기 전용 동작과 파일 편집은 자동 승인됩니다(보호 경로 쓰기 제외). 3) 나머지는 분류기로 갑니다. 4) 분류기가 막으면 클로드가 이유를 받고 대안을 시도합니다. permission-modes

공식자동 모드로 들어갈 때 임의 코드 실행을 부여하는 넓은 allow 규칙은 버려집니다. Bash(*)·PowerShell(*), Bash(python*)처럼 와일드카드가 붙은 인터프리터, 패키지 매니저 실행 명령, Agent allow 규칙입니다. Bash(npm test) 같은 좁은 규칙은 그대로 넘어가며, 버려진 규칙은 자동 모드를 벗어나면 복구됩니다. permission-modes

좁은 규칙이 구멍이 될 수 있습니다. 공식좁은 Bash allow 규칙은 분류기보다 먼저 결정되므로, 규칙 접두어가 예상하지 못한 스크립트 경로나 플래그가 파괴적 인자로 들어갈 수 있습니다. autoMode.classifyAllShell을 true로 두면 자동 모드가 켜져 있는 동안 모든 Bash·PowerShell allow 규칙이 정지되어 분류기가 모든 셸 명령을 평가합니다. 지연을 커버리지와 교환하는 선택입니다. auto-mode-config

공식기본 신뢰 범위는 좁습니다. 분류기는 작업 디렉터리와 세션 시작 시 설정돼 있던 원격만 신뢰합니다. 세션 중에 git remote add나 git remote set-url로 추가·변경한 원격은 신뢰하지 않고, 그 밖의 모든 것은 외부로 취급합니다. permission-modes

공식기본 차단 목록에서 자주 걸리는 것들입니다. permission-modes

기본 차단기본 허용
코드를 다운로드해 실행(curl | bash)작업 디렉터리 안의 로컬 파일 작업
민감 데이터를 외부 엔드포인트로 전송lock 파일·매니페스트에 선언된 의존성 설치
프로덕션 배포와 마이그레이션.env 읽기와 그에 맞는 API로 자격증명 전송
force push, git reset --hard, git clean -fd, git stash drop읽기 전용 HTTP 요청
세션 전에 존재했던 파일을 되돌릴 수 없게 파괴작업 중인 저장소의 어느 브랜치로든 push
IAM·저장소 권한 부여, 공유 인프라 수정세션 중 클로드가 만든 잡을 정확히 지정해 삭제
이 세션에서 만들지 않은 커밋에 대한 git commit --amendenvironment에 등록한 신뢰 도메인·버킷·서비스로의 데이터 전송
클로드코드 자신의 세션 전사(.jsonl) 쓰기같은 다중 에이전트 세션 안 에이전트 간 메시지

공식push 관련 기본값은 한 번 정리해 둘 만합니다. 작업 중인 저장소의 어느 브랜치로든, 기본 브랜치를 포함해 push가 허용되고 풀 리퀘스트 생성도 기본 허용입니다. 다만 production·release·gh-pages처럼 이름이 배포·공개 대상임을 나타내는 비기본 브랜치는 그 기본값에 포함되지 않고 분류기가 따로 판정합니다. push의 내용도 여전히 검사되므로 force push, 커밋에 비밀이 들어가는 경우, CI나 배포 파이프라인이 그것을 실행할 때 비밀이 저장소 밖으로 나가게 되는 변경은 막힙니다. auto-mode-config

공식매번 사람 체크포인트를 원한다면 permissions.ask가 가장 직접적입니다. 내용 범위 ask 규칙은 분류기보다 먼저 평가되며 자동 모드에서도 항상 프롬프트를 강제합니다. auto-mode-config

{
  "permissions": {
    "ask": [
      "Bash(git push *)",
      "Bash(gh pr create *)"
    ]
  }
}
원하는 경계수단자동 모드에서의 동작
실행 전에 물어보게permissions.ask항상 프롬프트. 분류기가 자동 승인할 수 없음
절대 실행 안 되게permissions.deny분류기 상담 전에 차단. 분류기도 사용자 의도도 못 뒤집음
이 세션만의 일회성 경계대화로 말하기분류기가 막지만 압축으로 그 메시지가 사라지면 경계도 사라짐

공식분류기가 조직 인프라를 몰라서 막는 경우에는 autoMode.environment에 신뢰 대상을 알려 줍니다. 항목은 정규식이나 도구 패턴이 아니라 산문이며, 분류기가 자연어 규칙으로 읽습니다. 배열에 "$defaults" 문자열을 넣으면 그 자리에 기본 항목이 끼워지고, 넣지 않으면 그 섹션의 기본 목록을 통째로 버립니다. auto-mode-config

{
  "autoMode": {
    "environment": [
      "$defaults",
      "Source control: github.example.com/acme-corp and all repos under it",
      "Trusted cloud buckets: s3://acme-build-artifacts",
      "Trusted internal domains: *.corp.example.com",
      "Key internal services: Jenkins at ci.example.com"
    ]
  }
}
$defaults를 빼면 기본 규칙이 사라집니다. 공식environment·allow·soft_deny·hard_deny 중 하나를 "$defaults" 없이 설정하면 그 섹션의 기본 목록 전체를 버립니다. soft_deny에서는 force push, curl | bash, 프로덕션 배포, 자동 모드 우회 같은 내장 소프트 차단 규칙 전부가, hard_deny에서는 내장 데이터 유출 규칙이 사라집니다. 목록을 통째로 소유할 의도일 때만 생략하고, 그때는 claude auto-mode defaults로 내장 규칙을 출력해 복사한 뒤 검토합니다. auto-mode-config

공식분류기 내부의 우선순위는 네 단계입니다. hard_deny는 무조건 차단하고 사용자 의도와 allow 예외가 적용되지 않습니다. soft_deny는 그다음이며 사용자 의도와 allow가 뒤집을 수 있습니다. allow는 매칭되는 soft_deny를 예외로 덮습니다. 마지막으로 명시적 사용자 의도가 남은 소프트 차단을 덮는데, 사용자 메시지가 클로드가 하려는 정확한 동작을 직접적이고 구체적으로 서술한 경우에만입니다. "저장소를 정리해 줘"는 force push를 승인하지 않고, "이 브랜치를 force push 해 줘"는 승인합니다. auto-mode-config

공식분류기는 .claude/settings.json과 .claude/settings.local.json에서 autoMode를 읽지 않습니다. 두 파일 모두 저장소 디렉터리에 있어서, 커밋된 저장소나 빌드 단계가 자기 허용 규칙을 주입할 수 있기 때문입니다. 읽는 곳은 ~/.claude/settings.json, 관리형 설정, --settings 플래그입니다. auto-mode-config

공식같은 이유로 defaultMode: "auto"도 프로젝트·로컬 설정에서는 무시됩니다. 설정했는데 세션이 default로 시작하고 오류가 없으면 대개 그 설정이 프로젝트 파일에 있는 것이니 ~/.claude/settings.json으로 옮깁니다. permission-modes

공식구성을 확인하는 명령이 넷 있습니다. auto-mode-config

claude auto-mode defaults    내장 environment·allow·soft_deny·hard_deny를 JSON으로 출력
claude auto-mode config      내 설정이 반영된 실제 유효 규칙을 출력
claude auto-mode critique    내가 쓴 커스텀 규칙에 대한 피드백
claude auto-mode reset       사용자 설정의 autoMode 섹션을 제거하고 기본값으로
막히면 세는 장치가 있습니다. 공식분류기가 연속 3회 또는 누적 20회 동작을 막으면 자동 모드가 일시 정지되고 클로드코드가 다시 프롬프트를 띄웁니다. 프롬프트된 동작을 승인하면 자동 모드가 재개됩니다. 이 임계값은 구성할 수 없습니다. 허용된 동작이 하나 있으면 연속 카운터가 초기화되고, 누적 카운터는 세션 동안 유지됩니다. -p 비대화 모드에서는 물어볼 사람이 없으므로 반복 차단이 세션을 중단시킵니다. permission-modes

공식거부된 동작은 /permissions의 Recently denied 탭에 남습니다. 거부된 항목에서 r을 누르면 재시도로 표시되고, 대화를 닫을 때 클로드코드가 그 도구 호출을 재시도해도 된다는 메시지를 보내며 대화를 재개합니다. 같은 목적지에서 반복 거부가 나오면 대개 분류기가 맥락을 모르는 것이니 autoMode.environment에 그 목적지를 추가하고 claude auto-mode config로 반영을 확인합니다. auto-mode-config

공식비용도 알아 둡니다. 분류기는 기본적으로 Claude Sonnet 5에서 돌며 /model 선택과 무관합니다. 엔터프라이즈 플랜과 API·Bedrock·Agent Platform·Foundry 계정에서는 분류기 호출이 토큰 사용량에 포함됩니다. 매 검사가 전사의 일부와 대기 중인 동작을 보내므로 실행 전에 왕복이 한 번 늘어납니다. 읽기와 보호 경로 밖 작업 디렉터리 편집은 분류기를 건너뛰므로, 오버헤드는 주로 셸 명령과 네트워크 작업에서 발생합니다. permission-modes

14.4위험 경계

공식일부 경로는 쓰기가 절대 자동 승인되지 않습니다. bypassPermissions 모드와 bypass 권한이 가용한 계획 세션만 예외입니다. 저장소 상태와 클로드 자신의 설정이 사고로 망가지는 것을 막는 장치입니다. permission-modes

모드보호 경로 쓰기
default, acceptEdits프롬프트
plan프롬프트. bypass 권한이 가용하면 허용, 자동 모드가 가용하면 분류기로
auto분류기로
dontAsk거부
bypassPermissions허용

공식보호 디렉터리는 .git, .config/git, .vscode, .idea, .husky, .cargo, .devcontainer, .yarn, .mvn, 그리고 .claude입니다(.claude/worktrees는 예외). 보호 파일에는 .gitconfig·.gitmodules, 셸 시작 파일(.bashrc .zshrc .profile .envrc 등), 패키지 매니저 설정(.npmrc .yarnrc .pnpmfile.cjs bunfig.toml 등), .pre-commit-config.yaml과 lefthook 설정, 래퍼 프로퍼티 파일, .mcp.json과 .claude.json이 있습니다. permission-modes

allow 규칙으로 보호 경로를 미리 열 수 없습니다. 공식안전 검사는 클로드코드가 설정 파일의 allow 규칙을 평가하기 전에 돕니다. 그래서 ~/.claude/settings.json이나 .claude/settings.json에 Edit(.claude/**)를 넣어도 위 표의 결과는 바뀌지 않습니다. 프롬프트가 뜨는 모드에서는 .claude/ 쓰기 프롬프트에 "이 세션 동안 클로드가 자기 설정을 편집하도록 허용" 선택지가 함께 나옵니다. permission-modes

공식훅으로 권한을 확장할 수도 있습니다. PreToolUse 훅은 권한 프롬프트보다 먼저 돌고, 출력으로 호출을 거부하거나 프롬프트를 강제하거나 프롬프트를 건너뛰게 할 수 있습니다. 다만 훅 결정이 권한 규칙을 우회하지는 않습니다. 매칭되는 deny 규칙은 훅이 "allow"를 돌려줘도 차단하고, 매칭되는 ask 규칙은 여전히 프롬프트를 띄웁니다. 반대로 종료 코드 2로 끝나는 차단 훅은 권한 규칙 평가 전에 호출을 멈추므로 allow 규칙이 있어도 막힙니다. permissions

거부 목록보다 안전한 조합. 공식프롬프트 없이 모든 Bash를 돌리면서 몇 개만 막고 싶다면, 허용 목록에 "Bash"를 넣고 그 특정 명령을 거부하는 PreToolUse 훅을 등록하는 방식이 공식 문서가 제시하는 패턴입니다. permissions

공식인자를 제약하려는 Bash 패턴은 깨지기 쉽습니다. Bash(curl http://github.com/ *)는 URL 앞의 옵션(curl -X GET ...), 다른 프로토콜(https), 리다이렉트, 변수(URL=... && curl $URL), 공백 두 칸에 모두 매칭하지 못합니다. 더 확실한 URL 필터링은 curl·wget을 deny로 막고 WebFetch 도구에 도메인 허용 규칙을 주는 것, PreToolUse 훅으로 URL을 검증하는 것입니다. WebFetch만 쓰는 것으로 네트워크 접근이 막히지는 않습니다. Bash가 허용돼 있으면 클로드는 여전히 curl로 어느 URL이든 갈 수 있습니다. permissions

실전이 볼트의 .claude/settings.local.json에는 allow 규칙 16개가 있고 deny와 ask는 0개입니다. 전부 "예, 항상 허용"을 누른 결과가 쌓인 것입니다. 문제는 그 내용이었습니다. 특정 파일명이 박힌 rm 명령, 리터럴 절대 경로가 박힌 find처럼 다시 쓰일 리 없는 일회성 문자열이 대부분입니다. 승인 버튼으로 만든 규칙은 그 순간의 명령을 기록할 뿐이므로, 권한 설계가 아니라 로그에 가까워집니다.

여기까지 됐는지 확인
  • /permissions를 열어 지금 유효한 규칙과 그 출처 파일을 확인했습니다.
  • 쌓인 allow 규칙 중 재사용되지 않는 일회성 항목을 지웠습니다.
  • 이 프로젝트에서 절대 일어나면 안 되는 동작을 한 줄 이상 deny에 적었습니다.

관행처음 쓰는 deny 규칙으로 값을 하는 것은 대개 자격증명 읽기와 되돌릴 수 없는 원격 작업입니다. 공식 예시 설정도 같은 모양을 씁니다.

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Bash(curl *)"
    ],
    "ask": [
      "Bash(git push *)"
    ]
  }
}

15

샌드박스와 격리

15.1격리 방식 고르기

공식격리 선택지는 여섯 가지이고, 무엇이 경계 안에 들어가는지가 다릅니다. 앞의 두 개는 컨테이너 없이 호스트 OS에서 돌고, 나머지는 클로드코드를 컨테이너나 가상 머신 안에 넣습니다. sandbox-environments

방식격리되는 것도커 필요설치 부담
샌드박스 Bash 도구Bash 명령과 그 자식 프로세스아니오맥은 최소, 리눅스·WSL2는 낮음
샌드박스 런타임클로드코드 프로세스 전체(파일 도구·MCP 서버·훅 포함)아니오낮음
개발 컨테이너개발 환경 전체예중간
커스텀 컨테이너개발 환경 전체예중간에서 높음
가상 머신운영체제 전체아니오높음
클로드코드 웹운영체제 전체. Anthropic이 호스팅아니오없음. 구독 필요
샌드박스 Bash 도구는 Bash만 막습니다. 공식내장 파일 도구, MCP 서버, 훅은 여전히 호스트에서 그대로 돕니다. 이 셋을 하나의 OS 경계 안에 넣으려면 샌드박스 런타임, 개발 컨테이너, 커스텀 컨테이너 중 하나로 클로드코드 프로세스 자체를 감싸야 합니다. sandbox-environments

공식목적별 선택은 이렇습니다. 내 기계에서 일상 작업의 프롬프트를 줄이려면 샌드박스 Bash 도구를 /sandbox로 구성합니다. --dangerously-skip-permissions나 자동 모드로 무인 실행을 하려면 개발 컨테이너, 임의 컨테이너·VM, 또는 샌드박스 런타임입니다. 도커 없이 MCP 서버와 훅까지 격리하려면 샌드박스 런타임입니다. 신뢰할 수 없는 저장소를 다루려면 전용 가상 머신이나 클로드코드 웹입니다. 네이티브 윈도우 호스트에서는 컨테이너·VM이거나 WSL2 안의 Bash 샌드박스입니다. sandbox-environments

공식권한 모드와 격리의 관계도 분명합니다. 권한 모드는 도구 호출이 실행될지와 먼저 물어볼지를 정하고, 격리는 실행된 뒤 그 명령이 무엇에 닿을 수 있는지를 제한합니다. --dangerously-skip-permissions는 실수를 잡아 줄 프롬프트가 없으니 내가 고른 격리 경계가 시스템을 지키는 전부입니다. 그래서 이 플래그를 쓰는 세션은 항상 컨테이너·VM·샌드박스 런타임 안에서 돌립니다. 자동 모드의 분류기는 동작별 통제이지 격리 경계가 아니므로, 무인 실행에서는 격리를 겹쳐 놓는 편이 낫습니다. sandbox-environments

격리는 무엇이 모델로 가는지를 바꾸지 않습니다. 공식내 프롬프트와 클로드가 읽는 파일은 샌드박스가 있든 없든 Anthropic API나 내가 설정한 프로바이더로 전송됩니다. 격리는 침해의 영향 범위를 줄이는 장치입니다. sandbox-environments

15.2샌드박스 Bash 구성

공식샌드박스는 클로드코드에 내장돼 있고 맥·리눅스·WSL2에서 돕니다. 네이티브 윈도우는 지원하지 않으므로 윈도우에서는 WSL2 안에서 실행합니다. 맥은 내장 Seatbelt를 쓰므로 설치할 것이 없습니다. 리눅스와 WSL2는 bubblewrap(파일시스템 격리 강제)과 socat(샌드박스 프록시로 트래픽 중계)이 필요합니다. WSL1은 bubblewrap이 요구하는 커널 기능이 없어 지원되지 않습니다. sandboxing

sudo apt-get install bubblewrap socat   Ubuntu·Debian
sudo dnf install bubblewrap socat       Fedora

공식구성은 /sandbox 명령으로 엽니다. 탭이 세 개(Mode·Overrides·나머지)이고, 리눅스에서 선택적 seccomp 필터가 없으면 Dependencies 탭이 추가로 나타납니다. 의존성 검사는 시작 시 돌기 때문에 패키지를 설치한 뒤에는 클로드코드를 다시 시작해야 감지됩니다. sandboxing

공식모드는 두 가지입니다. 자동 허용 모드는 샌드박스로 감쌀 수 있는 명령을 샌드박스 안에서 돌리고 승인을 자동으로 처리합니다. 샌드박스로 감쌀 수 없는 명령(허용되지 않은 호스트로 네트워크가 필요한 경우 등)은 일반 권한 흐름으로 내려갑니다. 일반 권한 모드는 샌드박스 안에서 돌더라도 모든 Bash 명령을 권한 흐름에 태웁니다. 두 모드에서 샌드박스가 강제하는 파일시스템·네트워크 제약은 같고, 차이는 자동 승인 여부뿐입니다. sandboxing

공식자동 허용 모드에서도 남는 것이 넷 있습니다. 명시적 deny 규칙, /·홈 디렉터리·기타 핵심 시스템 경로를 향한 rm·rmdir, Bash(git push *) 같은 내용 범위 ask 규칙, 그리고 샌드박스로 돌지 못해 일반 흐름으로 내려간 명령에 대한 맨 Bash ask 규칙입니다. 맨 Bash ask 규칙은 샌드박스로 도는 명령에는 건너뛰어집니다. 샌드박스 경계가 그 도구 전체 프롬프트를 대신하기 때문입니다. 단 플랜 모드에서는 건너뛰지 않습니다. sandboxing

공식기본 경계는 이렇습니다. 쓰기는 현재 작업 디렉터리와 그 하위, 그리고 $TMPDIR이 가리키는 세션 임시 디렉터리입니다. 읽기는 몇몇 거부 디렉터리를 뺀 컴퓨터 전체입니다. 이 기본값은 ~/.aws/credentials나 ~/.ssh/ 같은 자격증명 파일 읽기를 여전히 허용합니다. 차단되는 것은 작업 디렉터리와 세션 임시 디렉터리 밖 파일 수정이며, ~/.bashrc 같은 셸 설정과 /bin/의 시스템 바이너리가 여기 들어갑니다. sandboxing

기본 읽기 정책은 비밀을 막지 않습니다. 공식자격증명 디렉터리 읽기를 막으려면 sandbox.credentials 항목을 쓰거나 그 경로를 denyRead에 넣습니다. 샌드박스 Bash 명령은 기본적으로 부모 프로세스의 환경 변수를 그대로 물려받으므로, 거기 설정된 자격증명도 함께 갑니다. sandbox.credentials로 특정 변수를 지우거나 마스킹하고, CLAUDE_CODE_SUBPROCESS_ENV_SCRUB으로 서브프로세스에서 변수를 제거합니다. sandboxing

공식경로를 넓히려면 sandbox.filesystem.allowWrite입니다. OS 수준에서 강제되므로 자식 프로세스까지 따릅니다. 도구를 샌드박스에서 아예 빼는 excludedCommands보다 이쪽이 권장되는 방식입니다. 같은 배열이 여러 설정 스코프에 있으면 대체되지 않고 병합됩니다. sandboxing

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "allowWrite": ["~/.kube", "/tmp/build"]
    }
  }
}
경로 접두어 문법이 권한 규칙과 다릅니다. 공식샌드박스 파일시스템 경로는 표준 관례를 씁니다. /tmp/build가 절대 경로이고, ~/는 홈, 접두어가 없거나 ./이면 프로젝트 설정에서는 프로젝트 루트, 사용자 설정에서는 ~/.claude 기준입니다. Read·Edit 권한 규칙이 절대 경로에 //를 쓰는 것과 헷갈리기 쉬운 지점입니다. sandboxing

공식읽기 규칙이 겹칠 때는 더 구체적인 경로가 이깁니다. denyRead: ["~/"]에 allowRead: ["~/projects"]를 두면 그 하위만 읽히고 나머지 홈은 막힙니다. 반대로 allowRead: ["~/"]에 denyRead: ["~/.env"]를 두면 그 파일만 막히고 나머지는 읽힙니다. 넓은 allow가 비밀을 조용히 다시 노출하지 못하게 하는 설계입니다. sandboxing

공식네트워크는 샌드박스 밖에서 도는 프록시 서버로 통제됩니다. 기본적으로 미리 허용된 도메인이 없어서, 명령이 새 도메인을 필요로 할 때마다 승인을 물어봅니다. 승인하면 그 호스트가 현재 세션 동안 허용됩니다. 프롬프트 자체를 없애려면 allowedDomains로 미리 허용합니다. WebFetch allow 규칙도 도메인을 미리 허용합니다. sandboxing

프록시는 기본적으로 TLS를 검사하지 않습니다. 공식내장 프록시는 클라이언트가 보낸 호스트명으로 허용 판정을 하며, 기본 설정에서는 TLS를 종료하거나 내용을 검사하지 않습니다. 그래서 github.com처럼 넓은 도메인을 허용하면 데이터 유출 경로가 생길 수 있고, 샌드박스 안 코드가 도메인 프론팅 같은 기법으로 허용목록 밖 호스트에 닿을 여지가 있습니다. 더 강한 보장이 필요하면 TLS를 종료하고 트래픽을 검사하는 커스텀 프록시를 붙이고 그 CA 인증서를 샌드박스 안에 설치합니다. sandboxing

공식샌드박스에서 아예 못 도는 명령도 있습니다. 그때 클로드코드는 작업을 실패시키거나 샌드박스를 끄게 하는 대신, 실패를 분석해 dangerouslyDisableSandbox 파라미터로 재시도할 수 있습니다. 재시도된 명령은 샌드박스 밖에서 돌기 때문에 일반 권한 흐름을 타며, 기본 모드에서는 확인 프롬프트가, 자동 모드에서는 분류기 판정이 붙습니다. 자동 모드에서도 매번 물어보게 하려면 Bash(dangerouslyDisableSandbox:true) ask 규칙을 추가합니다. 이 탈출구를 끄려면 "allowUnsandboxedCommands": false입니다. sandboxing

공식실제로 자주 걸리는 비호환 사례가 정리돼 있습니다. jest는 watchman이 비호환이라 jest --no-watchman으로 돌립니다. 맥에서 gh·gcloud·terraform 같은 Go 기반 CLI는 Seatbelt에서 TLS 검증에 실패할 수 있어 excludedCommands에 넣습니다. docker는 비호환이라 docker *를 excludedCommands에 넣습니다. 맥에서 open·osascript나 브라우저 인증 흐름이 -600 오류로 실패하면 Apple Events가 기본 차단된 것이며, allowAppleEvents로 허용할 수 있지만 코드 실행 격리가 사라집니다. sandboxing

공식조직 강제는 관리형 설정으로 합니다. 아래 세 키는 샌드박스를 켜고, 초기화에 실패하면 시작을 막고, 모델이 샌드박스 밖에서 재시도하는 것을 금지합니다. 불리언 키는 관리형 값이 이기지만 excludedCommands·allowRead 같은 배열 키는 스코프 간 병합이라 개발자가 항목을 덧붙여 정책을 넓힐 수 있습니다. 읽기 경로를 잠그려면 allowManagedReadPathsOnly, 네트워크 도메인을 잠그려면 allowManagedDomainsOnly를 관리형 설정에 둡니다. excludedCommands에는 대응하는 잠금이 없으니 관리형 목록을 좁게 유지합니다. sandboxing

{
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false
  }
}
샌드박스가 자기 정책 파일을 보호합니다. 공식샌드박스는 샌드박스 안 명령이 자기 정책을 고칠 수 있는 파일들에 쓰기를 자동으로 거부합니다. 모든 스코프의 settings.json과 관리형 설정 디렉터리, 프로젝트 루트와 --add-dir로 추가한 각 디렉터리 루트의 .mcp.json, 그리고 시작 후 보호 경로 자리에 나타난 심링크의 대상입니다. 단 파일시스템 격리를 끄면 이 거부 규칙도 함께 꺼집니다. sandboxing

15.3개발 컨테이너

공식개발 컨테이너는 팀 전원이 같은 격리 환경을 돌리게 하는 방식입니다. 클로드가 실행하는 명령은 호스트가 아니라 컨테이너 안에서 돌고, 프로젝트 파일 편집은 로컬 저장소에 그대로 나타납니다. 설치는 Dev Container Feature 한 줄로 됩니다. devcontainer

{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {}
  }
}

공식끝의 :1.0 태그는 feature의 설치 스크립트를 고정하는 것이고 클로드코드 릴리스를 고정하지 않습니다. feature는 최신 클로드코드를 설치하며, 컨테이너 안에서 클로드코드가 기본적으로 자동 업데이트합니다. 버전을 고정하려면 feature 대신 Dockerfile에서 npm install -g @anthropic-ai/claude-code@X.Y.Z로 설치하고 DISABLE_AUTOUPDATER를 설정합니다. devcontainer

재빌드하면 로그인이 날아갑니다. 공식기본적으로 컨테이너의 홈 디렉터리는 재빌드 때 버려집니다. 클로드코드는 인증 토큰·사용자 설정·세션 기록을 ~/.claude에 두지만, OAuth 계정·개인 MCP 서버·프로젝트별 신뢰는 그 디렉터리 밖의 ~/.claude.json에 둡니다. 그래서 ~/.claude에만 볼륨을 마운트해도 로그인이 유지되지 않습니다. 볼륨을 마운트하고 CLAUDE_CONFIG_DIR을 같은 경로로 지정해 .claude.json도 볼륨 안에 쓰이게 합니다. devcontainer
"mounts": [
  "source=claude-code-config,target=/home/node/.claude,type=volume"
],
"containerEnv": {
  "CLAUDE_CONFIG_DIR": "/home/node/.claude"
}

공식조직 정책을 컨테이너에 넣기도 좋습니다. 클로드코드는 리눅스에서 /etc/claude-code/managed-settings.json을 읽고 설정 계층의 최상단으로 적용하므로, Dockerfile에서 그 자리에 복사하면 됩니다. 다만 Dockerfile이 저장소에 있으니 쓰기 권한이 있는 사람이 그 단계를 바꾸거나 지울 수 있습니다. 개발자가 저장소 파일 편집으로 우회할 수 없는 정책은 서버 관리형 설정이나 MDM으로 배포합니다. devcontainer

공식참조 구성은 anthropics/claude-code 저장소의 .devcontainer/에 있고 파일 세 개입니다. devcontainer.json(볼륨 마운트·runArgs 권한·확장·containerEnv), Dockerfile(베이스 이미지·개발 도구·클로드코드 설치), init-firewall.sh(허용 도메인 외 모든 아웃바운드 차단)입니다. 컨테이너 안에서 방화벽을 돌리려면 추가 권한이 필요해 참조 구성은 runArgs로 NET_ADMIN과 NET_RAW를 붙입니다. 이 방화벽과 권한은 클로드코드 자체에는 필요하지 않으므로 자체 네트워크 통제가 있으면 빼도 됩니다. 유지 관리되는 베이스 이미지가 아니라 조합 예시로 제공되는 것입니다. devcontainer

컨테이너도 완전한 방어는 아닙니다. 공식--dangerously-skip-permissions로 실행하면 개발 컨테이너는 악의적 프로젝트가 컨테이너 안에서 접근 가능한 것을 유출하는 것을 막지 못합니다. ~/.claude에 저장된 클로드코드 자격증명이 여기 포함됩니다. 신뢰하는 저장소에서만 쓰고, ~/.ssh나 클라우드 자격증명 파일 같은 호스트 비밀을 컨테이너에 마운트하지 않습니다. 저장소 범위나 단기 토큰을 씁니다. devcontainer

15.4워크트리 격리 맛보기

공식git 워크트리는 자체 파일과 브랜치를 가진 별도 작업 디렉터리이며, 저장소 히스토리와 원격은 메인 체크아웃과 공유합니다. 세션마다 워크트리를 하나씩 쓰면 한 세션의 편집이 다른 세션의 파일에 닿지 않습니다. worktrees

claude --worktree feature-auth

공식기본적으로 워크트리는 저장소 루트의 .claude/worktrees/<name>/에 만들어지고 worktree-<name>이라는 새 브랜치에 놓입니다. 이름을 생략하면 클로드가 하나 생성합니다. .claude/worktrees/를 .gitignore에 넣어 메인 체크아웃에서 untracked 파일로 보이지 않게 합니다. worktrees

공식L2에서 알아 둘 것은 워크트리가 메인 체크아웃과 무엇을 공유하는지입니다. 세 가지입니다. 저장소의 .git 디렉터리(그래서 샌드박스를 켜도 워크트리 안에서 git commit이 됩니다), 프로젝트 스코프로 설치한 플러그인, 그리고 저장된 권한 승인입니다. 워크트리 세션에서 "예, 다시 묻지 않기"를 누르면 규칙이 메인 체크아웃의 .claude/settings.local.json에 저장되어 메인과 다른 모든 워크트리에 적용되고, 그 워크트리가 삭제돼도 남습니다. worktrees

공식워크트리는 새 체크아웃이라 .env 같은 gitignore된 파일이 없습니다. 새 워크트리마다 자동으로 복사하려면 프로젝트 루트에 .worktreeinclude를 둡니다. .gitignore 문법을 쓰며, 패턴에 매칭되고 또한 gitignore된 파일만 복사되므로 추적되는 파일은 중복되지 않습니다. worktrees

.env
.env.local
config/secrets.json

공식정리는 대화형 세션을 나갈 때 처리됩니다. 워크트리가 깨끗하면 이름 없는 세션은 워크트리와 브랜치를 자동으로 지우고, 이름 붙인 세션은 먼저 물어봅니다. 작업이 남아 있으면 유지할지 지울지 묻습니다. -p 비대화 실행은 종료 프롬프트가 없어 정리되지 않으므로 git worktree remove로 지웁니다. 서브에이전트와 백그라운드 세션의 워크트리는 cleanupPeriodDays보다 오래되면 주기적 스윕이 지우지만, 변경·untracked 파일이나 push되지 않은 커밋이 있으면 건너뜁니다. --worktree로 내가 만든 워크트리는 스윕이 절대 지우지 않습니다. worktrees

여기까지가 L2 범위입니다. 워크트리를 여러 세션·서브에이전트에 걸쳐 병렬로 쓰는 방법, 격리 강제의 세부 검사, 베이스 브랜치 선택과 WorktreeCreate 훅은 L4 오케스트레이션의 30장에서 다룹니다.

16

설정 파일 레퍼런스

16.1스코프와 우선순위

공식설정 스코프는 네 개입니다. 어디에 두는지가 누구에게 적용되는지를 정합니다. settings

스코프위치영향 범위팀 공유
관리형서버 관리형 설정, plist·레지스트리, 또는 시스템 managed-settings.json조직 전체 또는 기기의 모든 사용자예. IT가 배포
사용자~/.claude/settings.json나, 모든 프로젝트아니오
프로젝트.claude/settings.json이 저장소의 모든 협업자예. git에 커밋
로컬.claude/settings.local.json나, 이 프로젝트만아니오

공식같은 설정이 여러 스코프에 있으면 아래 순서로 적용됩니다. settings

1. 관리형        가장 높음. 다른 어떤 스코프도 덮어쓸 수 없음(정해진 예외 제외)
2. 명령줄 인자   임시 세션 오버라이드
3. 로컬          프로젝트와 사용자를 덮어씀
4. 프로젝트      사용자를 덮어씀
5. 사용자        가장 낮음. 아무것도 지정하지 않았을 때 적용
권한 규칙은 이 순서를 그대로 따르지 않습니다. 공식권한 규칙은 덮어쓰기가 아니라 스코프 간 병합입니다. 어느 계층에서든 거부된 도구는 다른 계층이 허용할 수 없습니다. 관리형 deny는 --allowedTools로도 뒤집히지 않고, 사용자 계층 deny가 프로젝트 계층 allow를 막습니다. deny 규칙이 모든 스코프에서 allow보다 먼저 평가되기 때문입니다. permissions

공식관리형 설정 배포 경로는 여러 가지입니다. 사인인 시 원격으로 전달되는 서버 관리형 설정, MDM과 OS 정책(맥 com.anthropic.claudecode 관리 환경설정 도메인, 윈도우 HKLM\SOFTWARE\Policies\ClaudeCode 또는 사용자 수준 HKCU), 그리고 파일 배포입니다. 파일 위치는 맥 /Library/Application Support/ClaudeCode/, 리눅스와 WSL /etc/claude-code/, 윈도우 C:\Program Files\ClaudeCode\입니다. settings

공식일부 설정은 관리형 설정에서만 읽힙니다. 사용자·프로젝트 파일에 넣어도 효과가 없습니다. 자주 쓰이는 것으로 allowManagedPermissionRulesOnly(사용자·프로젝트가 권한 규칙을 정의하지 못하게), allowManagedHooksOnly(관리형 훅만 로드), allowManagedMcpServersOnly, strictPluginOnlyCustomization(스킬·에이전트·훅·MCP를 플러그인과 관리형 설정으로만 제한), disableSideloadFlags, claudeMd가 있습니다. permissions

공식편집이 언제 반영되는지도 중요합니다. 클로드코드는 설정 파일을 감시해 바뀌면 다시 읽으므로 대부분의 키는 재시작 없이 도는 세션에 적용됩니다. permissions, hooks, apiKeyHelper 같은 자격증명 헬퍼가 여기 포함되고, 사용자·프로젝트·로컬·관리형 설정 모두 대상이며 감지된 변경마다 ConfigChange 훅이 돕니다. 반면 세션 시작 시 한 번만 읽는 키가 둘 있습니다. model(세션 중 전환은 /model)과 outputStyle(시스템 프롬프트의 일부라 /clear나 재시작에서 재구성)입니다. settings

관리형 설정은 관대하게 파싱됩니다. 공식관리형 구성에 스키마 검증에 실패하는 항목이 있으면 그 항목만 제거하고 경고를 기록한 뒤 나머지 유효한 정책을 모두 강제합니다. 다만 보안 강제 필드는 필드별로 다르게 다뤄집니다. allowManagedMcpServersOnly와 enforceAvailableModels는 true로 취급되고, allowedMcpServers와 availableModels는 빈 허용목록으로 강제됩니다. 사용자·프로젝트·로컬 파일에서는 훅 스키마 오류가 그 파일 전체를 거부시키지만, 관리형 설정에서는 잘못된 항목만 제거되고 나머지 훅은 적용됩니다. settings

16.2settings.json 주요 항목

설정 키는 100개를 넘습니다. 아래 표는 이 편의 주제(맥락과 통제)에 직접 쓰이는 키만 목적별로 묶은 것입니다. 전체 목록은 공식 settings 문서가 정본입니다. 나머지 영역의 키는 그 기능을 다루는 편에서 함께 봅니다. 훅과 스킬 관련 키는 L3, 서브에이전트와 워크플로 키는 L4, 텔레메트리와 조직 정책 키는 L6입니다.

목적키의미와 기본값
권한permissions.allow / ask / deny규칙 배열. 평가 순서는 deny → ask → allow
permissions.defaultMode세션 시작 모드. default(별칭 manual) · acceptEdits · plan · auto · dontAsk · bypassPermissions. auto는 프로젝트·로컬 파일에서 무시됨
permissions.additionalDirectories파일 접근을 넓히는 디렉터리. 설정에 적은 항목은 파일 접근만 주고 설정은 로드하지 않음
permissions.disableBypassPermissionsMode / disableAutoMode"disable"로 해당 모드를 봉쇄. 어느 스코프에서도 동작
맥락autoCompactEnabled기본값 true. 한계에 가까워지면 자동 압축
autoCompactWindow압축 전에 채우는 양. 100,000에서 1,000,000 토큰. 미설정이면 모델에 맞춘 값
claudeMdExcludes로드에서 건너뛸 CLAUDE.md의 글로브·절대 경로. 계층 간 병합
claudeMd관리형 설정 전용. 조직 관리 메모리로 주입되는 지시 문자열
자동 메모리autoMemoryEnabled기본값 true. false면 자동 메모리 디렉터리를 읽지도 쓰지도 않음
autoMemoryDirectory저장 위치. 절대 경로나 ~/ 시작. 프로젝트·로컬 설정에서는 워크스페이스 신뢰 수락 후에만
샌드박스sandbox.enabled샌드박스 Bash 도구 사용
sandbox.failIfUnavailable의존성이 없으면 경고 후 비샌드박스로 떨어지는 대신 시작을 막음
sandbox.allowUnsandboxedCommands기본값 true. false면 dangerouslyDisableSandbox 탈출구를 무시
sandbox.filesystem.allowWrite / denyWrite / denyRead / allowRead / disabled경로 경계. 배열은 스코프 간 병합. 겹칠 때는 더 구체적인 경로가 이김
sandbox.credentials파일과 환경 변수의 자격증명을 deny 또는 mask
자동 모드autoMode.environment / allow / soft_deny / hard_deny분류기 규칙. 산문 배열. "$defaults"로 내장 규칙 상속. 사용자 설정·관리형 설정·--settings에서만 읽힘
autoMode.classifyAllShell기본값 false. true면 자동 모드 동안 모든 셸 allow 규칙 정지
보관cleanupPeriodDays기본값 30일, 최솟값 1. 이보다 오래된 세션 파일을 시작 시 삭제. 0은 검증 오류
worktree.baseRef"fresh"(기본, 원격 기본 브랜치에서 분기) 또는 "head"(현재 로컬 HEAD에서 분기). 브랜치 이름은 못 씀
환경env모든 세션과 클로드코드가 띄우는 서브프로세스에 적용되는 환경 변수. ""로 셸 export를 덮어쓸 수 있음
model / outputStyle이 둘만 재시작(또는 /clear)이 필요. 나머지는 즉시 반영

공식설정 파일 맨 위에 $schema를 넣으면 편집기가 키 이름과 값을 검증해 줍니다. 오타로 인한 무시를 줄이는 가장 값싼 방법입니다. settings

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": ["Bash(npm run lint)", "Bash(npm run test *)"],
    "deny": ["Bash(curl *)", "Read(./.env)", "Read(./secrets/**)"]
  }
}

16.3환경 변수

공식설정 파일의 env 블록과 셸에 같은 변수가 있으면 설정 파일 값이 적용됩니다. 클로드코드가 시작 시, 그리고 파일이 바뀔 때마다 각 env 항목을 프로세스 환경에 써서 셸에서 물려받은 값을 대체합니다. 여러 설정 파일에 걸쳐 있으면 설정 우선순위를 따르므로 관리형 설정 항목이 사용자·프로젝트를 덮습니다. env-vars

이 편의 주제와 관련된 변수만 모았습니다. 전체 목록은 공식 env-vars 문서에 있습니다.

변수용도
CLAUDE_CONFIG_DIR설정 디렉터리를 ~/.claude 대신 다른 곳으로. 홈을 여러 기기에서 공유할 때나 컨테이너화할 때. 없으면 생성됨
CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD1이면 --add-dir 디렉터리의 메모리 파일도 로드
CLAUDE_CODE_DISABLE_AUTO_MEMORY1이면 자동 메모리 끄기. 설정보다 변수가 앞섬
CLAUDE_CODE_AUTO_COMPACT_WINDOW자동 압축 창을 토큰으로. 맨숫자만 받음(500k는 500으로 읽혀 최솟값으로 잘림). 명령·플래그·설정보다 앞섬
CLAUDE_CODE_SKIP_PROMPT_HISTORY1이면 프롬프트를 디스크에 남기지 않고 /history에도 안 보임
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBBash·PowerShell 서브프로세스와 훅 명령의 환경에서 제거할 변수 목록(쉼표 구분). stdio MCP 서버와 --shell 서브셸에는 적용되지 않음
BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS기본 120000(2분) / 최대 600000(10분). 실효 상한은 둘 중 큰 쪽
MAX_THINKING_TOKENS확장 사고에 배정할 최대 토큰. 모델의 절대 상한과 비교해 낮은 쪽이 적용됨
CLAUDE_CODE_MAX_OUTPUT_TOKENS응답으로 요청할 최대 토큰
DISABLE_AUTOUPDATER1이면 자동 업데이트 끄기
일부 변수는 값이 아니라 존재 여부로 판정됩니다. 공식CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, DISABLE_TELEMETRY, DISABLE_ERROR_REPORTING은 설정했는지만 봅니다. 0을 포함해 비어 있지 않은 어떤 값이든 그 동작을 켭니다. 끄려면 변수를 해제하거나 빈 값으로 둡니다. env-vars

16.4설정이 안 먹을 때

공식진단은 무엇이 실제로 로드됐는지 보는 것부터 시작합니다. /context가 지금 컨텍스트를 범주별로 보여주므로 CLAUDE.md·규칙·스킬 설명이 아예 들어왔는지를 먼저 확인합니다. 그다음 범주별 전용 명령으로 내려갑니다. debug-your-config

명령보여주는 것
/context컨텍스트 전체 분해. 시스템 프롬프트·도구·MCP·서브에이전트·메모리 파일·스킬·대화
/memory사용자·프로젝트 스코프의 메모리 파일 위치, 자동 메모리 폴더와 토글
/skills프로젝트·사용자·플러그인 출처의 가용 스킬
/hooks활성 훅 구성
/mcp연결된 MCP 서버와 상태
/permissions지금 유효한 allow·deny 규칙
/doctor설치 상태, 잘못된 설정 파일, 안 쓰는 확장, 중복 서브에이전트 이름, 트림 가능한 CLAUDE.md 내용과 제안된 수정
/debug [issue]세션 디버그 로깅을 켜고 로그와 설정 경로로 진단하게 함
/status활성 설정 소스. 관리형 설정이 적용 중인지 포함

공식터미널에서 세션을 열지 않고 보려면 claude doctor가 설치와 설정 진단을 읽기 전용으로 출력합니다. debug-your-config

공식아래는 공식 문서의 증상별 대조표에서 이 편의 주제에 해당하는 항목입니다. debug-your-config

증상원인고치는 법
전역으로 넣은 권한·훅·env가 무시된다~/.claude.json에 넣었다그 파일은 앱 상태와 UI 토글용이다. ~/.claude/settings.json에 쓴다
settings.json 값이 무시되는 것 같다같은 키가 settings.local.json에도 있다로컬이 프로젝트를, 프로젝트가 사용자를 덮는다
하위 디렉터리 CLAUDE.md 지시가 무시된다그 파일은 온디맨드 로드다클로드가 그 디렉터리 파일을 Read로 읽을 때 들어온다. 시작 시도, 거기에 파일을 쓸 때도 아니다
서브에이전트가 CLAUDE.md를 무시한다내장 Explore·Plan 에이전트는 CLAUDE.md를 건너뛴다위임 프롬프트에 그 지시를 다시 쓴다. 커스텀 서브에이전트라면 에이전트 파일 본문(시스템 프롬프트)에 넣는다
훅이 아예 안 돈다matcher가 문자열이 아니라 JSON 배열이다여러 도구는 "Edit|Write"처럼 |로 잇는 단일 문자열로 쓴다
훅이 아예 안 돈다matcher가 소문자다매칭은 대소문자를 구분한다. Bash Edit Write Read
Bash(rm *) deny가 /bin/rm이나 find -delete를 막지 못한다접두어 규칙은 실행 파일이 아니라 명령 문자열 리터럴에 매칭한다변형마다 패턴을 추가하거나, 확실한 보장이 필요하면 PreToolUse 훅이나 샌드박스를 쓴다

공식훅 스키마 오류는 파급이 큽니다. matcher에 배열을 쓰면 클로드코드가 설정 오류 알림을 띄우고 사용자·프로젝트·로컬 설정 파일 전체를 거부하므로, 그 파일의 다른 훅도 /hooks에 나타나지 않습니다. claude doctor가 검증 실패를 보고합니다. debug-your-config

공식어느 표면이 원인인지 좁히는 방법은 두 단계입니다. 먼저 claude --safe-mode로 모든 커스터마이징을 끈 세션을 엽니다. CLAUDE.md·스킬·플러그인·훅·MCP 서버·커스텀 명령과 에이전트가 전부 비활성이고, 인증·모델 선택·내장 도구·권한은 정상 동작합니다. 안전 모드에서도 조직의 관리형 훅과 설정 정책은 적용됩니다. 문제가 사라지면 그 표면들 중 하나가 원인입니다. debug-your-config

공식그래도 남거나 설정 자체가 의심되면 아무것도 로드하지 않는 세션과 비교합니다. CLAUDE_CONFIG_DIR을 빈 디렉터리로 가리키고, .claude·.mcp.json·CLAUDE.md가 없는 디렉터리에서 실행합니다. debug-your-config

cd /tmp && CLAUDE_CONFIG_DIR=/tmp/claude-clean claude

공식첫 실행에서는 테마 선택부터 시작하는 초기 설정 화면이 뜹니다. 그 화면이 보이면 깨끗한 설정 디렉터리가 실제로 적용된 것입니다. 리눅스와 윈도우에서는 자격증명이 설정 디렉터리 아래에 있어 다시 로그인을 요청받고, 맥에서는 키체인에 있어 그대로 넘어갑니다. 조직이 관리형 설정을 배포한다면 그것은 ~/.claude 밖 시스템 경로에 있으므로 여전히 적용됩니다. debug-your-config

16.5내 설정을 여러 기기에서 같게 유지하기

실전맥과 윈도우를 번갈아 쓰면 설정 동기화가 실제 문제가 됩니다. 이 볼트를 쓰는 환경에서 실패했던 방식과 남은 방식을 그대로 적습니다.

실전먼저 하지 말아야 할 것입니다. ~/.claude 디렉터리 전체를 클라우드 드라이브에 심링크하거나 동기화하지 않습니다. 이 디렉터리에는 설정만 있는 것이 아니라 세션 전사, 프롬프트 기록, 파일 스냅숏, 자격증명이 함께 들어 있습니다(13.7절). 전사는 평문이고 계속 쓰이므로 동기화 충돌이 잦고, 자격증명까지 클라우드에 올라갑니다.

실전대신 동기화 대상을 세 종류로 나눠 취급하는 편이 안정적이었습니다. 첫째, 팀·프로젝트에 속하는 것은 저장소에 커밋합니다. CLAUDE.md, .claude/settings.json, .claude/rules/, .claude/skills/가 여기 해당합니다. 이러면 기기 간 동기화 문제가 애초에 git 문제로 환원됩니다. 둘째, 개인 것 중 기기와 무관한 것만 따로 관리합니다. ~/.claude/CLAUDE.md, ~/.claude/rules/, ~/.claude/settings.json이 대상입니다. 셋째, 기기에 묶인 것은 동기화하지 않습니다. 자격증명, 전사, 자동 메모리(기기 로컬이라고 공식 문서가 명시), ~/.claude.json입니다.

절대 경로를 설정에 박지 않습니다. 실전맥의 /Users/이름/과 윈도우의 C:\Users\이름\은 서로 존재하지 않는 경로입니다. 권한 규칙에서는 ~/ 앵커를 쓰고, 스크립트 경로가 필요한 훅에서는 설정 파일에 리터럴 경로를 넣는 대신 런타임에 홈을 계산하는 얇은 런처를 거쳐 부릅니다. 이 볼트에서 실제로 반복해 깨진 지점이 이것이었습니다.

공식설정 디렉터리 자체를 옮길 수 있다는 것도 알아 둘 만합니다. CLAUDE_CONFIG_DIR은 홈을 여러 기기에서 공유할 때나 컨테이너화할 때 쓰라고 문서에 명시된 용도입니다. 개발 컨테이너에서 로그인을 유지하는 방법이 바로 이 변수를 볼륨 경로로 지정하는 것입니다(15.3절). env-vars

실습

두 기기에서 같은 개인 설정을 쓰기

  1. 개인 설정만 담을 저장소를 하나 만듭니다. CLAUDE.md, rules/, settings.json만 넣고 자격증명과 전사는 넣지 않습니다.
  2. 각 기기에서 그 저장소를 클론하고, ~/.claude/CLAUDE.md에 @~/dotfiles/claude/CLAUDE.md 한 줄을 두어 임포트합니다. 사용자 스코프 임포트는 승인 대화 없이 로드됩니다(13.3절).
  3. 양쪽에서 /context를 열어 Memory files 목록이 같은지 확인합니다.

완료 판정. 두 기기의 /context가 같은 메모리 파일 목록을 보여주고, 어느 쪽에도 절대 경로가 박히지 않았습니다.


17

보안 기본

17.1위협 모델

개념

프롬프트 인젝션

공격자가 악의적 텍스트를 끼워 넣어 AI 어시스턴트의 지시를 덮어쓰거나 조종하려는 기법입니다. 클로드코드는 파일, 웹 페이지, 명령 출력, 이슈 본문을 읽습니다. 그 내용은 데이터인데 지시처럼 읽힐 수 있다는 것이 이 위협의 본질입니다.

공식기본 구조는 읽기 전용 권한에서 출발하는 것입니다. 파일 편집, 테스트 실행, 명령 실행처럼 추가 동작이 필요하면 명시적 승인을 요청합니다. 그리고 작업 디렉터리 경계가 있습니다. 클로드코드는 시작한 폴더와 그 하위에만 쓸 수 있고, 상위 디렉터리 파일은 명시적 권한 없이 수정하지 못합니다. Read·Grep·Glob으로 경계 밖을 읽는 것은 승인 프롬프트 뒤에 가능합니다. security

공식인젝션에 대한 방어층은 여러 개입니다. 핵심 방어로 권한 시스템, 요청 전체를 분석하는 맥락 인식, 입력 살균, 그리고 네트워크 명령 승인이 있습니다. curl과 wget처럼 웹에서 내용을 가져오는 명령은 기본적으로 자동 승인되지 않고 다른 비읽기 명령처럼 물어봅니다. security

공식추가 안전장치도 목록으로 명시돼 있습니다. 네트워크 요청 도구는 기본적으로 사용자 승인이 필요하고, 웹 페치는 격리된 별도 컨텍스트 윈도우를 써서 악의적 프롬프트가 주 대화에 주입되는 것을 피합니다. 처음 실행하는 코드베이스와 새 MCP 서버는 신뢰 확인을 요구합니다. 의심스러운 bash 명령은 이전에 허용목록에 있었더라도 수동 승인을 요구하고, 매칭되지 않는 명령은 수동 승인으로 떨어집니다(fail-closed). 복잡한 bash 명령에는 자연어 설명이 붙습니다. API 키와 토큰은 가능하면 맥 키체인에, 윈도우와 리눅스에서는 파일 권한으로 보호됩니다. security

신뢰 확인에는 예외가 있습니다. 공식-p 비대화 실행에서는 신뢰 확인이 비활성화됩니다. 그리고 홈 디렉터리에서 클로드코드를 바로 시작하면 신뢰 수락이 현재 세션에만 유지되고 디스크에 기록되지 않아 매 실행마다 프롬프트가 다시 뜹니다. 이를 영속화하는 설정은 없으므로, 프로젝트 하위 디렉터리에서 시작하는 편이 낫습니다. security

공식자동 모드가 켜진 세션에서는 분류기가 무엇을 보는지도 위협 모델의 일부입니다. 분류기는 사용자 메시지, 도구 호출, CLAUDE.md 내용을 봅니다. 도구 결과는 제거됩니다. 그래서 파일이나 웹 페이지의 적대적 콘텐츠가 분류기를 직접 조종할 수 없습니다. 별도의 서버 측 프로브가 들어오는 도구 결과를 훑어 의심스러운 콘텐츠를 클로드가 읽기 전에 표시합니다. permission-modes

완전한 면역은 없습니다. 공식공식 문서의 표현대로, 이 보호들은 위험을 상당히 줄이지만 어떤 시스템도 모든 공격에 완전히 면역이 아닙니다. 신뢰할 수 없는 콘텐츠를 다룰 때의 권고는 다섯 가지입니다. 제안된 명령을 승인 전에 검토하기, 신뢰할 수 없는 내용을 클로드에 직접 파이프로 넣지 않기, 중요한 파일의 변경안을 확인하기, 특히 외부 웹 서비스와 상호작용할 때 스크립트와 도구 호출을 가상 머신에서 돌리기, 의심스러운 동작을 /feedback으로 보고하기입니다. security

공식MCP는 별도로 봐야 합니다. Anthropic은 커넥터를 디렉터리에 추가하기 전에 등재 기준에 대해 검토하지만, 어떤 MCP 서버도 보안 감사하거나 관리하지 않습니다. 직접 만든 서버나 신뢰하는 제공자의 서버를 쓰고, MCP 서버에 대한 권한을 설정합니다. security

17.2안전 운영 수칙

공식민감한 코드를 다룰 때의 권고는 네 가지입니다. 제안된 모든 변경을 승인 전에 검토하기, 민감한 저장소에는 프로젝트별 권한 설정을 쓰기, 추가 격리가 필요하면 개발 컨테이너를 고려하기, 그리고 /permissions로 권한 설정을 주기적으로 감사하기입니다. security

공식팀 단위에서는 관리형 설정으로 조직 표준을 강제하고, 승인된 권한 구성을 버전 관리로 공유하고, OpenTelemetry 메트릭으로 사용을 모니터링하고, ConfigChange 훅으로 세션 중 설정 변경을 감사하거나 차단합니다. security

비밀은 볼트나 저장소에 두지 않습니다. 실전이 원칙은 클로드코드 때문에 새로 생긴 것이 아니지만, 클로드코드가 있으면 위반의 대가가 커집니다. 13.7절에서 봤듯 도구를 통과한 것은 무엇이든 평문 전사에 남습니다. 한 번 cat한 .env는 그 세션 전사 안에 그대로 있고 기본 30일 보관됩니다. 이 볼트는 모든 키를 볼트 밖 ~/.secrets.json에 두고 로더 함수로만 읽습니다. 값이 코드나 문서에 리터럴로 등장하지 않으니 전사에도 남지 않습니다.

관행자격증명 파일 읽기를 규칙으로 막는 것과 값이 애초에 저장소 안에 없게 하는 것은 다른 층입니다. deny 규칙은 클로드의 내장 도구와 인식되는 파일 명령만 막고, 파이썬 스크립트가 스스로 파일을 여는 것은 막지 못합니다(14.2절). 그래서 두 가지를 함께 씁니다. 규칙으로 흔한 경로를 막고, 실제 값은 저장소 밖에 둡니다.

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(~/.aws/**)",
      "Read(~/.ssh/**)",
      "Edit(~/.ssh/**)"
    ]
  }
}

공식샌드박스를 쓴다면 sandbox.credentials로 한 층을 더 얹을 수 있습니다. 기본 읽기 정책이 ~/.aws/credentials와 ~/.ssh/를 여전히 허용하기 때문에, 조직 배포에서는 그 디렉터리와 비밀 환경 변수를 이 키로 명시하라고 문서가 권합니다(15.2절). sandboxing

공식보안 취약점을 발견했을 때의 절차도 정해져 있습니다. 공개하지 않고 HackerOne 프로그램으로 보고하며, 재현 단계를 포함하고, 공개 전에 수정할 시간을 줍니다. security

여기까지 됐는지 확인
  • 이 프로젝트에서 자격증명 파일 읽기를 막는 deny 규칙을 넣었습니다.
  • 비밀 값이 저장소 안에 리터럴로 있지 않은지 확인했습니다.
  • cleanupPeriodDays를 확인했고, 기본 30일이 이 프로젝트에 적절한지 판단했습니다.

17.3데이터 취급

공식클로드코드는 로컬에서 돌지만 모델과 상호작용하려면 네트워크로 데이터를 보냅니다. 여기에는 모든 사용자 프롬프트와 모델 출력이 포함되며 TLS 1.2 이상으로 전송 중 암호화됩니다. 저장 시 암호화는 모델 프로바이더에 달렸고, Anthropic API는 인프라 수준 디스크 암호화(AES-256)입니다. data-usage

공식학습 정책은 계정 종류로 갈립니다. 무료·Pro·Max 소비자 계정은 데이터를 모델 개선에 쓸지 선택할 수 있고, 그 설정이 켜져 있으면 클로드코드 사용분을 포함해 학습에 씁니다. Team·Enterprise·API·서드파티 플랫폼·Claude Gov 같은 상업 계정은 고객이 명시적으로 제공을 선택한 경우(예: Development Partner Program)를 제외하고 클로드코드로 보낸 코드나 프롬프트로 생성 모델을 학습하지 않습니다. data-usage

공식보관 기간도 계정 종류로 갈립니다. data-usage

계정보관 기간
소비자, 모델 개선에 데이터 사용 허용5년
소비자, 허용하지 않음30일
상업(Team·Enterprise·API) 표준30일
Zero data retention서버 측 영속 없음. 자격 확인 후 조직별로 활성화
로컬 전사 캐시기본 30일. cleanupPeriodDays로 조정
/feedback·/bug·/share로 공유한 전사5년
세션 품질 설문 뒤 공유한 전사최대 6개월

공식운영 텔레메트리는 두 종류이고 각각 따로 끕니다. 메트릭은 지연·신뢰성·사용 패턴이며 코드·프롬프트·파일 경로를 절대 포함하지 않고, DISABLE_TELEMETRY=1로 끕니다. 오류 보고는 클로드코드 내부의 오류 메시지와 스택 트레이스이며, 알려진 비밀·파일 경로·이메일·개인정보 패턴을 기기에서 나가기 전에 제거하고, DISABLE_ERROR_REPORTING=1로 끕니다. 둘을 한꺼번에 끄려면 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC입니다. data-usage

공식기본값은 프로바이더에 따라 다릅니다. Claude API에서는 메트릭이 기본 켜짐, /feedback 보고도 기본 켜짐이며, 오류 보고는 Pro·Max 사인인에 v2.1.198 이상일 때 켜집니다. Amazon Bedrock, Google Cloud Agent Platform, Microsoft Foundry, Claude Platform on AWS에서는 오류 보고·텔레메트리·버그 보고가 기본으로 꺼져 있습니다. data-usage

WebFetch는 프로바이더와 무관하게 호스트명을 보냅니다. 공식URL을 가져오기 전에 WebFetch 도구가 요청 호스트명을 api.anthropic.com에 보내 Anthropic이 관리하는 안전 차단목록과 대조합니다. 보내는 것은 호스트명뿐이며 전체 URL·경로·페이지 내용은 아닙니다. 통과한 호스트명은 5분간 캐시됩니다. 이 검사는 어느 모델 프로바이더를 쓰든 돌고 CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC의 영향을 받지 않습니다. 네트워크가 api.anthropic.com을 막으면 WebFetch가 실패하므로, 그 도메인을 허용하거나 skipWebFetchPreflight: true를 설정합니다. data-usage

공식/feedback을 실행하면 코드를 포함한 대화 기록 사본이 Anthropic으로 갑니다. /bug와 /share도 같은 경로입니다. 제출 전에 얼마나 포함할지 고를 수 있으며, 기본값은 현재 세션만이고 같은 프로젝트의 지난 24시간이나 7일 세션도 선택할 수 있습니다. 끄려면 DISABLE_FEEDBACK_COMMAND=1입니다. 서드파티 프로바이더를 쓰거나 Anthropic 자격증명이 없으면 전송 대신 ~/.claude/feedback-bundles/에 로컬 아카이브로 씁니다. data-usage

공식세션 품질 설문("How is Claude doing this session?")은 별개입니다. 평점만 기록하며 대화 전사·입력·출력을 수집하거나 저장하지 않습니다. 그 뒤에 전사 공유를 묻는 후속 질문이 따로 나오는데, Yes를 명시적으로 고르기 전에는 아무것도 업로드되지 않습니다. 끄려면 CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1입니다. data-usage

격리는 전송을 바꾸지 않습니다. 공식15장의 격리 방식 중 어느 것을 써도, 내 프롬프트와 클로드가 읽는 파일은 Anthropic API나 내가 설정한 프로바이더로 전송됩니다. 무엇이 전송되는지를 줄이려면 격리가 아니라 읽는 범위를 줄이는 쪽을 봐야 합니다. sandbox-environments

이 편을 마치며

무엇을 알려주고 무엇을 막을지 정했습니다

지침 파일로 맥락을 주고, 권한으로 경계를 긋고, 샌드박스로 격리하고, 컨텍스트 예산을 재는 법까지 지났습니다. 이제 프로젝트가 클로드코드에 맞게 세팅된 상태입니다.

완료 체크리스트

  • /context로 이 프로젝트의 시작 시 컨텍스트 구성을 확인했습니다.
  • 이 프로젝트의 CLAUDE.md를 200줄 아래로 두거나, 넘는 부분을 경로 범위 규칙이나 스킬로 옮겼습니다.
  • 지시·규칙·스킬·훅·권한 중 무엇을 어디에 둘지 13.6절 판정표로 한 번 정리했습니다.
  • 이 프로젝트에서 절대 일어나면 안 되는 동작을 permissions.deny에 적었습니다.
  • 사람 체크포인트가 필요한 동작을 permissions.ask에 적었습니다.
  • 권한 모드 기본값을 정하고 defaultMode에 명시했습니다.
  • 이 프로젝트에 맞는 격리 수준을 15.1절 표에서 골랐습니다.
  • 자격증명 파일 읽기를 막았고, 비밀 값이 저장소 밖에 있는지 확인했습니다.
  • /permissions와 /doctor를 한 번 돌려 유효 설정과 진단을 확인했습니다.

여기까지 하면 새 프로젝트를 받았을 때 30분 안에 세팅할 수 있는 상태가 됩니다. 다음 편에서는 없는 기능을 직접 만드는 쪽으로 넘어갑니다. 스킬, 서브에이전트, 훅, MCP입니다. 이 편에서 "그건 훅으로 하는 게 맞다"고 판정만 하고 넘긴 것들을 실제로 만듭니다.

자주 막히는 곳

CLAUDE.md에 적었는데 클로드가 안 지킵니다

순서대로 확인합니다. 먼저 /context의 Memory files 목록에 그 파일이 있는지 봅니다. 없으면 로드되지 않은 것이니 위치를 13.2절과 대조합니다. 있으면 로드는 됐고 문장의 문제일 가능성이 큽니다. 검증 가능한 형태로 구체화하고, 다른 CLAUDE.md에 상충하는 지시가 없는지 봅니다. 정해진 시점에 반드시 돌아야 하는 일이라면 지침이 아니라 훅으로 씁니다.

하위 폴더의 CLAUDE.md가 무시됩니다

무시가 아니라 아직 로드되지 않은 것입니다. 작업 디렉터리 아래의 CLAUDE.md는 클로드가 그 디렉터리의 파일을 Read로 읽을 때 들어옵니다. 시작 시도, 거기에 파일을 쓸 때도 아닙니다. 항상 필요한 규칙이면 루트로 올립니다.

사용자 설정에 Read(/secrets/**)를 넣었는데 프로젝트의 secrets 폴더가 안 막힙니다

슬래시 하나는 절대 경로가 아니라 설정 소스 기준 앵커입니다. 사용자 설정에 쓴 그 규칙은 ~/.claude/secrets/**를 가리킵니다. 모든 프로젝트에 적용하려면 // 절대 경로나 ~/ 홈 상대 경로를 씁니다. 현재 디렉터리 기준으로 어느 깊이든 막으려면 deny 규칙에서 Read(secrets/**)를 씁니다.

defaultMode를 auto로 넣었는데 세션이 default로 시작합니다

그 설정이 .claude/settings.json이나 .claude/settings.local.json에 있을 가능성이 큽니다. 저장소가 스스로에게 자동 모드를 부여하지 못하게 그 파일들의 auto는 무시됩니다. ~/.claude/settings.json으로 옮깁니다. 같은 이유로 autoMode 블록도 프로젝트 파일에서 읽히지 않습니다.

자동 모드인데 갑자기 다시 승인을 물어봅니다

분류기가 연속 3회 또는 누적 20회 막으면 자동 모드가 일시 정지되고 프롬프트로 돌아갑니다. 프롬프트된 동작을 승인하면 재개됩니다. 반복 차단은 대개 분류기가 내 인프라를 모른다는 신호이니, /permissions의 Recently denied에서 무엇이 막혔는지 보고 그 목적지를 autoMode.environment에 추가합니다.

Bash allow 규칙을 넣었는데 여전히 물어봅니다

세 가지를 봅니다. 복합 명령이면 규칙이 하위 명령마다 매칭돼야 합니다. 단어 경계일 수 있습니다(Bash(ls *)는 lsof에 매칭하지 않습니다). 그리고 매칭되는 ask나 deny 규칙이 있으면 더 구체적인 allow가 있어도 그쪽이 이깁니다. /permissions에서 규칙과 그 출처 파일을 함께 확인합니다.

샌드박스를 켜니 명령이 실패합니다

15.2절의 비호환 목록을 먼저 봅니다. jest는 --no-watchman, docker는 excludedCommands, 맥의 Go 기반 CLI는 excludedCommands, 맥의 open·osascript는 Apple Events 문제입니다. 호스트 미허용 오류라면 프롬프트에서 승인하면 그 호스트가 허용 목록에 들어갑니다. 쓰기 경로 문제라면 도구를 샌드박스에서 빼는 대신 sandbox.filesystem.allowWrite로 그 경로만 여는 편이 낫습니다.

설정을 고쳤는데 반영이 안 됩니다

대부분의 키는 재시작 없이 반영되므로 다른 원인일 가능성이 큽니다. 같은 키가 settings.local.json이나 관리형 설정에 있는지 /status로 확인하고, 파일이 검증에 실패하지 않았는지 claude doctor로 확인합니다. model과 outputStyle만 시작 시 한 번 읽습니다. 전역 permissions·hooks·env를 ~/.claude.json에 넣었다면 그 파일은 읽지 않습니다.


4부 · L3

확장

없는 기능을 내가 만든다

먼저 필요한 것
L2 맥락과 통제
마치면
반복 작업을 스킬로, 검사를 훅으로, 외부 데이터를 MCP로 붙인다
범위
18~25장
이 편의 성격. L2가 "무엇을 알려주고 무엇을 막을지"였다면 이 편은 "없는 것을 어떻게 만들지"입니다. 손에 잡히는 결과는 셋입니다. 반복 작업 하나가 스킬이 되고, 반드시 돌아야 하는 검사 하나가 훅이 되고, 클로드가 못 보던 외부 데이터 하나가 MCP로 붙습니다. 여기서 만드는 것은 전부 파일 몇 개이므로 되돌리기도 쉽습니다.
18

확장 지점 지도

18.1확장 수단 전량

공식내장 도구가 대부분의 코딩 작업을 덮습니다. 확장은 그 위에 얹는 층이며, 각 수단이 에이전트 루프의 다른 지점에 끼워집니다. features-overview

수단하는 일쓸 때
CLAUDE.md매 대화 로드되는 지속 맥락프로젝트 관례, "항상 X 하라" 규칙
스킬클로드가 쓸 수 있는 지시·지식·워크플로재사용 내용, 참조 문서, 반복 작업
서브에이전트결과를 요약해 돌려주는 격리된 실행 맥락맥락 격리, 병렬 작업, 전문 작업자
에이전트 팀독립 세션 여러 개를 조율병렬 조사, 신규 기능 개발, 경쟁 가설 디버깅
코드 인텔리전스언어 서버 기반 탐색과 진단타입 언어, grep이 느리거나 부정확한 큰 코드베이스
MCP외부 서비스 연결외부 데이터나 동작
훅이벤트가 발생시키는 스크립트·HTTP 요청·프롬프트·서브에이전트매칭 이벤트마다 반드시 돌아야 하는 자동화
아티팩트세션 출력을 비공개 대화형 웹 페이지로 발행터미널 글보다 시각적으로 봐야 하는 산출물

공식플러그인은 그 위의 포장 층입니다. 스킬·훅·서브에이전트·MCP 서버를 하나의 설치 단위로 묶습니다. 플러그인 스킬은 /my-plugin:review처럼 이름공간을 쓰므로 여러 플러그인이 충돌 없이 공존합니다. 같은 세팅을 여러 저장소에서 재사용하거나 마켓플레이스로 남에게 배포할 때 씁니다. features-overview

가장 유연한 것은 스킬입니다. 공식스킬은 지식·워크플로·지시를 담은 마크다운 파일 하나입니다. /deploy처럼 명령으로 부를 수도 있고, 클로드가 관련 있다고 판단해 자동으로 로드할 수도 있습니다. 지금 대화에서 돌 수도 있고 서브에이전트를 통해 격리된 맥락에서 돌 수도 있습니다. features-overview

공식맥락 비용은 수단마다 다릅니다. 이것이 무엇을 어디에 둘지 정하는 실질 기준입니다. features-overview

수단로드 시점로드되는 것맥락 비용
CLAUDE.md세션 시작전문매 요청
스킬세션 시작 + 사용 시시작에는 설명, 사용 시 전문낮음(설명만 매 요청)
MCP 서버세션 시작도구 이름. 전체 스키마는 온디맨드도구를 쓸 때까지 낮음
코드 인텔리전스파일 편집 후와 온디맨드편집 후 진단, 조회 시 심볼 위치낮음. 다른 파일 읽기를 줄임
서브에이전트띄울 때지정된 스킬이 담긴 새 맥락메인 세션과 격리
훅발동 시없음(외부에서 실행)0. 훅이 출력을 돌려줄 때만 발생

공식계층이 겹칠 때의 규칙도 수단마다 다릅니다. CLAUDE.md는 더해집니다(모든 계층이 동시에 기여). 스킬과 서브에이전트는 이름으로 덮습니다(스킬은 관리형 > 사용자 > 프로젝트, 서브에이전트는 관리형 > CLI 플래그 > 프로젝트 > 사용자 > 플러그인). MCP 서버도 이름으로 덮습니다(로컬 > 프로젝트 > 사용자). 훅은 병합됩니다(출처와 무관하게 매칭되는 모든 훅이 발동). features-overview

18.2무엇을 언제 쓰나

공식처음부터 전부 세팅할 필요는 없습니다. 각 수단에는 알아볼 수 있는 계기가 있고, 대부분의 팀이 대략 아래 순서로 더해 갑니다. features-overview

계기더할 것
클로드가 관례나 명령을 두 번째로 틀린다CLAUDE.md에 적는다
같은 프롬프트를 계속 입력해 작업을 시작한다사용자 호출 스킬로 저장한다
같은 플레이북이나 다단계 절차를 세 번째로 붙여넣는다스킬로 포착한다
클로드가 못 보는 브라우저 탭에서 데이터를 계속 복사한다그 시스템을 MCP 서버로 연결한다
심볼이 어디 정의됐는지 찾느라 파일을 여럿 읽는다해당 언어의 코드 인텔리전스 플러그인을 설치한다
부수 작업이 다시 볼 일 없는 출력으로 대화를 채운다서브에이전트로 돌린다
묻지 않고 매번 일어나기를 원한다훅을 쓴다
두 번째 저장소가 같은 세팅을 필요로 한다플러그인으로 포장한다

공식같은 계기가 이미 있는 것을 언제 고칠지도 알려 줍니다. 반복되는 실수나 재발하는 리뷰 코멘트는 대화에서의 일회성 교정이 아니라 CLAUDE.md 수정입니다. 손으로 계속 조정하는 워크플로는 개정이 필요한 스킬입니다. features-overview

헷갈리기 쉬운 짝이 넷 있습니다. 각각의 갈림은 공식 문서가 표로 정리해 둔 것입니다.

비교스킬서브에이전트
정체재사용 가능한 지시·지식·워크플로자체 맥락을 가진 격리 작업자
핵심 이득맥락을 넘어 내용을 공유맥락 격리. 작업은 따로 돌고 요약만 돌아옴
컨텍스트 영향내 메인 창에 더해짐자체 입출력 토큰을 가진 별도 창
맞는 일참조 자료, 호출 가능한 워크플로파일을 많이 읽는 작업, 병렬 작업, 전문 작업자
비교훅스킬
실행하는 것셸 명령, HTTP 요청, LLM 프롬프트, 서브에이전트클로드가 읽고 따르는 지시
발동 주체PostToolUse·SessionStart 같은 수명주기 이벤트내가 /name을 치거나, 클로드가 설명을 내 작업에 맞춘 경우
결정성이벤트에 항상 발동. 트리거가 보장됨클로드가 지시를 해석. 결과가 달라질 수 있음
맥락 비용훅이 출력을 돌려주지 않으면 0설명은 매 세션, 전문은 쓸 때
맞는 일편집 후 린트, 위험한 명령 차단, 로깅, 알림추론이 필요한 워크플로, 참조 자료, 다단계 작업
가드레일은 훅에 둡니다. 공식CLAUDE.md나 스킬에 적은 ".env는 절대 편집하지 마라"는 요청이고 보장이 아닙니다. 그 편집을 막는 PreToolUse 훅이 강제입니다. 어떤 규칙이 매번 지켜져야 한다면 프롬프트 지시가 아니라 훅으로 만듭니다. features-overview
비교MCP스킬
정체외부 서비스 연결 프로토콜지식·워크플로·참조 자료
제공하는 것도구와 데이터 접근그 도구를 잘 쓰는 방법
예슬랙 연동, DB 질의, 브라우저 조작코드 리뷰 체크리스트, 배포 워크플로, API 스타일 가이드

공식이 둘은 서로 다른 문제를 풀고 함께 잘 돕니다. MCP 서버가 클로드를 데이터베이스에 연결하고, 스킬이 데이터 모델과 흔한 질의 패턴, 작업별로 어느 표를 쓸지를 가르칩니다. features-overview

공식실제 세팅은 조합입니다. 공식 문서가 드는 조합 넷입니다. 스킬 + MCP(연결은 MCP, 잘 쓰는 법은 스킬), 스킬 + 서브에이전트(스킬이 병렬 서브에이전트를 띄운다), CLAUDE.md + 스킬(항상 켜진 규칙과 온디맨드 참조 자료), 훅 + MCP(훅이 MCP를 통해 외부 동작을 발생시킨다). features-overview

판정

네 질문으로 자리가 정해집니다

1) 매 세션 알아야 하는가 → CLAUDE.md. 2) 때때로 필요한 지식이나 절차인가 → 스킬. 3) 클로드의 판단과 무관하게 반드시 돌아야 하는가 → 훅. 4) 클로드가 볼 수 없는 외부 시스템인가 → MCP. 여기에 하나가 더 붙습니다. 5) 작업이 대화를 오염시킬 만큼 크면 서브에이전트로 격리합니다.

실전이 판정을 실제로 해 보면 한쪽으로 기울기 쉽습니다. 이 가이드를 쓰는 볼트를 세어 보니 훅 핸들러가 12개(프로젝트 10 + 사용자 2)인데 스킬은 2개, 서브에이전트는 1개, MCP 서버는 1개였습니다. 훅으로 보장할 것을 훅에 둔 것은 맞지만, 반복 절차를 스킬로 옮기지 않아 같은 지시를 계속 입력하는 상태이기도 했습니다. 자기 프로젝트의 기울기는 아래로 한 번에 확인됩니다.

ls .claude/skills ~/.claude/skills 2>/dev/null | wc -l      스킬 수
ls .claude/agents ~/.claude/agents 2>/dev/null | wc -l      서브에이전트 수
python3 -c "import json;d=json.load(open('.claude/settings.json'));print(sum(len(m.get('hooks',[])) for v in d.get('hooks',{}).values() for m in v))"

19

스킬

19.1스킬이란

공식스킬은 지시가 담긴 SKILL.md 파일 하나이고, 그것을 만들면 클로드의 도구 모음에 추가됩니다. 클로드가 관련 있을 때 쓰거나 내가 /skill-name으로 직접 부릅니다. 만들 시점은 두 가지입니다. 같은 지시·체크리스트·다단계 절차를 대화에 계속 붙여넣을 때, 또는 CLAUDE.md의 한 섹션이 사실이 아니라 절차로 자라났을 때입니다. skills

커스텀 명령은 스킬로 합쳐졌습니다. 공식.claude/commands/deploy.md와 .claude/skills/deploy/SKILL.md는 둘 다 /deploy를 만들고 같은 방식으로 동작합니다. 기존 .claude/commands/ 파일은 그대로 돕니다. 스킬이 더하는 것은 셋입니다. 보조 파일을 둘 디렉터리, 누가 호출할지 정하는 프론트매터, 그리고 클로드가 관련 있을 때 자동으로 로드하는 능력입니다. 스킬과 명령이 같은 이름이면 스킬이 이깁니다. skills

공식CLAUDE.md 내용과 달리 스킬 본문은 쓸 때만 로드됩니다. 그래서 긴 참조 자료를 담아도 필요할 때까지 비용이 거의 없습니다. skills

공식어디에 두는지가 누가 쓸 수 있는지를 정합니다. skills

범위경로적용 대상
조직관리형 설정 참조조직의 모든 사용자
개인~/.claude/skills/<name>/SKILL.md내 모든 프로젝트
프로젝트.claude/skills/<name>/SKILL.md이 프로젝트만
플러그인<plugin>/skills/<name>/SKILL.md플러그인이 켜진 곳

공식이름이 겹치면 조직이 개인을, 개인이 프로젝트를 덮습니다. 어느 계층의 스킬이든 같은 이름의 내장 스킬을 덮으므로, 프로젝트의 code-review 스킬이 내장 /code-review를 대체합니다. 플러그인 스킬은 plugin-name:skill-name 이름공간을 쓰므로 충돌하지 않습니다. skills

공식프로젝트 스킬은 클로드코드를 시작한 디렉터리와 저장소 루트까지의 모든 상위 디렉터리에서 로드됩니다. 시작 디렉터리 아래의 중첩 .claude/skills/는 시작 시 로드되지 않고, 클로드가 그 하위 디렉터리의 파일을 처음 읽거나 편집할 때 로드되어 세션 내내 남습니다. 그때까지는 자동완성에 나타나지도, 이름으로 호출되지도 않습니다. skills

편집이 즉시 반영됩니다. 공식클로드코드는 스킬 디렉터리의 파일 변경을 감시합니다. ~/.claude/skills/나 프로젝트 .claude/skills/에서 스킬을 추가·수정·삭제하면 재시작 없이 현재 세션에 반영됩니다. 단 세션 시작 시 없던 최상위 스킬 디렉터리를 새로 만들었다면, 그 디렉터리를 감시하도록 클로드코드를 다시 시작해야 합니다. 감시는 SKILL.md 텍스트만 대상입니다. skills

19.2정의 파일 구조

공식스킬은 디렉터리이고 SKILL.md가 진입점입니다. 나머지 파일은 선택이며, 템플릿·예시 출력·클로드가 실행할 스크립트·상세 참조 문서를 담습니다. skills

my-skill/
├── SKILL.md           메인 지시(필수)
├── reference.md       상세 API 문서(필요할 때 로드)
├── examples.md        사용 예시(필요할 때 로드)
└── scripts/
    └── helper.py      유틸리티 스크립트(로드가 아니라 실행)

공식내용은 성격에 따라 두 갈래입니다. 참조 내용은 클로드가 지금 작업에 적용하는 지식입니다(관례·패턴·스타일 가이드·도메인 지식). 대화 맥락과 나란히 쓸 수 있도록 인라인으로 돕니다. 작업 내용은 배포·커밋·코드 생성처럼 특정 동작의 단계별 지시입니다. 보통 클로드가 판단하게 두지 않고 /skill-name으로 직접 부릅니다. skills

공식프론트매터 필드는 모두 선택이고 description만 권장입니다. 자주 쓰는 것부터 봅니다. skills

필드의미
name스킬 목록에 보이는 표시 이름. 기본값은 디렉터리 이름. 개인·프로젝트 스킬에서는 표시 라벨만 정하고 호출 이름은 디렉터리 이름에서 온다
description무엇을 하고 언제 쓰는지. 클로드가 이것으로 적용 여부를 판단한다. 생략하면 본문 첫 문단을 쓴다. 핵심 용도를 먼저 쓴다: description과 when_to_use를 합친 텍스트가 목록에서 1,536자로 잘린다
when_to_use트리거 문구나 예시 요청 같은 추가 맥락. description에 이어 붙고 같은 1,536자 상한을 공유한다
argument-hint자동완성에 보일 인자 힌트. 예: [issue-number]
arguments$name 치환에 쓸 이름 붙은 위치 인자. 공백 구분 문자열이나 YAML 목록
disable-model-invocationtrue면 클로드가 자동 로드하지 못한다. 기본값 false
user-invocablefalse면 / 메뉴에서 숨는다. 기본값 true
allowed-tools이 스킬을 호출한 턴 동안 승인 없이 쓸 도구. 다음 메시지를 보내면 해제된다
disallowed-tools이 스킬이 활성인 동안 도구 풀에서 제거할 도구. 역시 다음 메시지에서 해제
model · effort이 스킬이 활성일 때 쓸 모델과 노력 수준. 현재 턴에만 적용되고 설정에 저장되지 않는다
context · agent · backgroundfork면 서브에이전트 맥락에서 실행. agent가 종류를, background: false가 대기 여부를 정한다
paths이 스킬의 자동 활성을 제한하는 글로브. 경로 범위 규칙과 같은 형식
hooks이 스킬의 수명주기에 범위가 묶인 훅

공식불리언 필드는 true·false 외에 yes·no·on·off·1·0도 대소문자 구분 없이 받습니다. skills

본문도 반복 비용입니다. 공식스킬이 한 번 로드되면 그 내용은 세션 내내 맥락에 남습니다. 그래서 한 줄 한 줄이 반복되는 토큰 비용입니다. 왜 그런지를 설명하지 말고 무엇을 할지를 쓰고, CLAUDE.md에 적용하는 것과 같은 간결성 시험을 적용합니다. SKILL.md는 500줄 미만으로 두고 상세 참조는 별도 파일로 옮깁니다. skills

공식호출된 스킬의 내용은 렌더된 상태로 대화에 하나의 메시지로 들어가 세션 내내 남습니다. 클로드코드는 이후 턴에서 스킬 파일을 다시 읽지 않으므로, 작업 전체에 적용돼야 하는 안내는 일회성 단계가 아니라 상시 지시로 씁니다. 같은 내용으로 재호출하면 사본을 또 붙이지 않고 이미 로드됐다는 짧은 메모만 답니다. 인자나 동적 맥락이 달라져 렌더 결과가 다르면 전문을 다시 붙입니다. skills

공식자동 압축은 호출된 스킬을 토큰 예산 안에서 이어 갑니다. 각 스킬의 가장 최근 호출을 요약 뒤에 다시 붙이며 스킬당 첫 5,000 토큰을 유지하고, 합계 25,000 토큰을 가장 최근 호출부터 채웁니다. 한 세션에서 많이 호출했다면 오래된 스킬은 압축 후 통째로 사라질 수 있습니다. skills

19.3트리거 설계

공식클로드는 내 작업을 스킬 설명과 대조해 어느 것이 관련 있는지 판단합니다. 설명이 모호하거나 서로 겹치면 엉뚱한 스킬을 로드하거나 도움이 될 스킬을 놓칩니다. 특정 스킬을 쓰게 하려면 /name으로 직접 부릅니다. skills

공식누가 호출할 수 있는지는 두 필드가 정하고, 그것이 맥락 비용도 바꿉니다. skills

프론트매터내가 호출클로드가 호출맥락 로드
(기본)예예설명은 항상 맥락에, 전문은 호출 시
disable-model-invocation: true예아니오설명이 맥락에 없음, 전문은 내가 호출할 때
user-invocable: false아니오예설명은 항상 맥락에, 전문은 호출 시
부수효과가 있는 스킬에는 disable-model-invocation을 씁니다. 공식커밋·배포·메시지 전송처럼 부수효과가 있거나 시점을 내가 통제해야 하는 워크플로가 대상입니다. 코드가 준비돼 보인다고 클로드가 배포를 결정하는 것을 원하지 않습니다. 이 설정은 맥락 비용도 0으로 만듭니다. 클로드가 굳이 시도하면 클로드코드가 호출을 막고 다른 방식으로 배포 단계를 재현하지 말라고 지시하므로, 클로드는 /deploy를 직접 실행하라고 제안하게 됩니다. skills

공식스킬이 많아지면 설명이 잘립니다. 클로드코드는 스킬 이름과 설명 목록을 맥락에 로드하는데, 목록에는 항상 모든 이름이 들어가지만 문자 예산을 넘기면 설명을 줄입니다. 예산은 모델 컨텍스트 윈도우의 1퍼센트로 스케일되고, 넘칠 때는 가장 덜 호출하는 스킬부터 설명을 버리므로 자주 쓰는 스킬은 전문을 유지합니다. skills

공식예산을 올리려면 skillListingBudgetFraction(예: 0.02는 2퍼센트)이나 환경 변수 SLASH_COMMAND_TOOL_CHAR_BUDGET을 씁니다. 다른 스킬에 예산을 넘겨주려면 낮은 우선순위 항목을 skillOverrides에서 "name-only"로 둡니다. 원본에서 줄이는 방법도 있습니다. 항목별 합계가 예산과 무관하게 1,536자로 잘리므로 핵심 용도를 앞에 씁니다. 이 상한은 skillListingMaxDescChars로 조정합니다. skills

실전설명이 발화를 결정한다는 말의 무게는 실제 파일을 재 보면 드러납니다. 이 볼트의 스킬 두 개를 재어 보니 description이 각각 789자와 514자였고, 본문은 3,148자(50줄)와 3,841자(62줄)였습니다. 즉 설명이 본문의 4분의 1 분량입니다. 발화 조건이 그 안에 다 들어가야 해서 그렇게 됐습니다. 한 스킬의 설명에는 한국어 트리거("PPT 만들어줘", "슬라이드 만들어줘", "발표자료 만들어")와 영어 트리거를 나란히 넣었고, 마지막에 쓰지 말아야 할 경우도 한 줄 넣었습니다("장문 강의 코스에는 쓰지 말 것"). 오발화를 줄이는 데 이 한 줄이 실제로 효과가 있었습니다.

python3 - <<'EOF'
import re, glob
for f in glob.glob(".claude/skills/*/SKILL.md") + glob.glob("~/.claude/skills/*/SKILL.md"):
    t = open(f, encoding="utf-8").read()
    m = re.search(r"^---\n(.*?)\n---\n", t, re.S)
    d = re.search(r"^description:\s*(.*)$", m.group(1), re.M)
    print(len(d.group(1)) if d else 0, "자 |", f)
EOF
설명이 비어도 /name은 됩니다. 공식프론트매터 YAML이 깨지면 클로드코드는 본문을 빈 메타데이터로 로드합니다. 그래서 /skill-name은 여전히 동작하는데 클로드가 대조할 description이 없습니다. 자동 발화만 조용히 죽는 상태입니다. --debug로 파싱 오류를 봅니다. skills

19.4인자와 파일 참조

공식나와 클로드 모두 스킬을 호출할 때 인자를 넘길 수 있습니다. 본문에서 쓸 수 있는 치환은 아래와 같습니다. skills

변수의미
$ARGUMENTS넘긴 인자 전체. 본문에 없으면 ARGUMENTS: <값>으로 끝에 붙는다
$ARGUMENTS[N] · $N0부터 시작하는 위치 인자. $0이 첫 번째
$namearguments 프론트매터에 선언한 이름 붙은 인자. 순서대로 매핑
${CLAUDE_SESSION_ID}현재 세션 ID. 로깅과 세션별 파일 만들기에
${CLAUDE_EFFORT}현재 노력 수준(low~max)
${CLAUDE_SKILL_DIR}SKILL.md가 있는 디렉터리. 번들 스크립트를 작업 디렉터리와 무관하게 참조할 때
${CLAUDE_PROJECT_DIR}프로젝트 루트. 훅과 MCP 서버가 받는 것과 같은 경로
번들 스크립트를 프롬프트 없이 돌리는 정석. 공식클로드코드는 ${CLAUDE_SKILL_DIR}와 ${CLAUDE_PROJECT_DIR}를 두 곳에서 치환합니다. 스킬 본문과 allowed-tools의 Bash 규칙입니다. 같은 변수를 양쪽에 쓰면 허용 규칙이 본문이 지시하는 명령과 정확히 매칭되므로 승인 프롬프트 없이 스크립트가 돕니다. skills
---
name: render-chart
description: Render a chart from a CSV file
allowed-tools: Bash(${CLAUDE_SKILL_DIR}/scripts/render.sh *)
---

Run `${CLAUDE_SKILL_DIR}/scripts/render.sh <csv-file>` to render the chart.

공식위치 인자는 셸 방식 인용을 씁니다. /my-skill "hello world" second는 $0을 hello world로, $1을 second로 확장합니다. 대응 인자가 없는 위치 자리(예: 하나만 넘겼을 때의 $2)는 본문에 그대로 남고, 이름 붙은 자리는 빈 문자열이 됩니다. 숫자나 ARGUMENTS 앞의 리터럴 $는 백슬래시로 이스케이프합니다(\$1.00). skills

공식메시지 앞에 스킬 여러 개를 쌓을 수 있습니다. /write-tests /fix-issue 123은 둘을 모두 로드하고 뒤의 123을 양쪽 $ARGUMENTS로 넘깁니다. 첫 스킬 뒤로 최대 5개까지 확장하며, 인라인 사용자 호출 스킬이 아닌 첫 토큰에서 확장이 멈춥니다. 포크 서브에이전트로 도는 스킬(/code-review)이나 인자가 슬래시로 시작할 수 있는 스킬(/loop)도 거기서 끝냅니다. skills

공식보조 파일은 SKILL.md에서 참조해 클로드가 각 파일에 무엇이 있고 언제 로드할지 알게 합니다. 이렇게 하면 큰 참조 문서가 매번 맥락에 들어오지 않습니다. skills

## Additional resources

- For complete API details, see [reference.md](reference.md)
- For usage examples, see [examples.md](examples.md)

공식실행 결과를 미리 넣는 방법도 있습니다. !`<command>` 문법은 스킬 내용이 클로드에게 전달되기 전에 셸 명령을 돌리고 그 출력으로 자리를 대체합니다. 클로드가 실행하는 것이 아니라 전처리이고, 클로드는 최종 결과만 봅니다. 여러 줄이면 ```!로 여는 코드 블록을 씁니다. skills

## Pull request context
- PR diff: !`gh pr diff`
- PR comments: !`gh pr view --comments`
- Changed files: !`gh pr diff --name-only`

## Your task
Summarize this pull request...
치환은 한 번만 돕니다. 공식원본 파일에 대해 한 번 훑고, 명령 출력은 평문으로 삽입되며 다시 스캔되지 않습니다. 그래서 명령이 또 다른 자리표시자를 뱉어 다음 패스에서 확장되게 할 수는 없습니다. 그리고 인라인 형태는 !가 줄 시작이나 공백 바로 뒤에 올 때만 인식됩니다. KEY=!`cmd`처럼 다른 문자 뒤면 리터럴 텍스트로 남고 명령이 돌지 않습니다. 조직에서 이 기능을 끄려면 disableSkillShellExecution을 true로 둡니다. skills

19.5첫 스킬 만들기

실습

반복해 입력하던 지시 하나를 스킬로

  1. 지난주에 두 번 이상 입력한 지시를 하나 고릅니다. 절차가 있는 것이 좋습니다.
  2. 디렉터리를 만들고 SKILL.md를 씁니다. 프로젝트에서만 쓸 것이면 .claude/skills/, 모든 프로젝트에서 쓸 것이면 ~/.claude/skills/입니다.
  3. 프론트매터에 description을 씁니다. 내가 실제로 입력할 문구를 그대로 넣습니다.
  4. 부수효과가 있으면 disable-model-invocation: true를 더합니다.
  5. 세션에서 /<이름>으로 불러 봅니다. 스킬 디렉터리는 감시되므로 재시작이 필요 없습니다.
  6. 이번에는 부르지 않고, 평소 쓰던 문장으로 요청해 클로드가 스스로 그 스킬을 쓰는지 봅니다.

완료 판정. / 목록에 스킬이 보이고, 직접 부르지 않아도 설명만으로 발동합니다. 발동하지 않으면 설명에 내가 실제로 쓰는 단어가 빠진 것입니다.

mkdir -p .claude/skills/release-notes
cat > .claude/skills/release-notes/SKILL.md <<'EOF'
---
name: release-notes
description: 마지막 태그 이후의 커밋으로 릴리스 노트를 쓴다. "릴리스 노트 써줘", "변경사항 정리해줘" 같은 요청에 쓴다.
allowed-tools: Bash(git log *) Bash(git tag *)
---

마지막 태그 이후 커밋을 모아 릴리스 노트를 씁니다.

1. `git describe --tags --abbrev=0` 으로 마지막 태그를 찾습니다.
2. 그 태그 이후 커밋을 `git log --oneline` 으로 읽습니다.
3. 사용자에게 보이는 변경만 남기고 내부 리팩토링은 뺍니다.
4. 기능 · 수정 · 주의 세 갈래로 묶어 씁니다.
EOF

공식스킬이 발동하는 것을 봤다고 해서 의도한 일을 했다는 뜻은 아닙니다. 두 가지를 따로 재야 합니다. 발동해야 할 프롬프트에서 실제로 발동하는지, 그리고 발동했을 때 출력이 기대와 맞는지입니다. 둘 다의 검사는 기준선 비교입니다. 현실적인 프롬프트 몇 개를 모아 스킬이 있는 새 세션과 끈 세션에서 각각 돌려 비교합니다. 새 세션이 중요한데, 스킬을 만들며 쌓인 맥락이 지시문의 결손을 가려 주기 때문입니다. skills

비교를 자동화하는 플러그인이 있습니다. 공식skill-creator 플러그인이 이 비교 루프를 클로드코드 안에서 돌립니다. evals/evals.json에 테스트 케이스를 저장하고, 케이스마다 서브에이전트를 띄워 깨끗한 맥락에서 돌리고, 각 주장을 채점해 grading.json에 근거와 함께 쓰고, 스킬 있음과 없음의 통과율·시간·토큰을 benchmark.json으로 집계합니다. 두 버전 사이의 블라인드 A/B와 설명 문구 조정도 합니다. skills
/plugin install skill-creator@claude-plugins-official

공식설치가 실패하면 메시지를 봅니다. Marketplace "claude-plugins-official" not found면 /plugin marketplace add anthropics/claude-plugins-official로 마켓플레이스를 추가한 뒤 다시 설치합니다. 설치 요약에 Run /reload-plugins to activate.가 나오면 그 명령으로 현재 세션에 반영합니다. skills

19.6스킬 안티패턴

공식공식 문서가 드는 두 가지 고장부터 봅니다. 발동하지 않을 때는 설명에 사용자가 자연스럽게 말할 키워드가 들어 있는지 확인하고, 스킬이 목록에 보이는지 확인하고, 요청 문구를 설명에 가깝게 바꿔 보고, 사용자 호출이 가능하면 /name으로 직접 부릅니다. 너무 자주 발동할 때는 설명을 더 구체적으로 만들고, 수동 호출만 원하면 disable-model-invocation: true를 답니다. skills

공식첫 응답 이후 스킬이 영향을 못 미치는 것처럼 보이는 경우도 있습니다. 대개 내용은 여전히 맥락에 있고 모델이 다른 도구나 접근을 고르는 것입니다. 설명과 지시를 강화해 모델이 계속 그것을 선호하게 하거나, 결정론적으로 강제하려면 훅을 씁니다. 스킬이 크거나 그 뒤에 여럿을 호출했다면 압축 후 다시 호출해 전문을 복구합니다. skills

context: fork는 지시가 있는 스킬에만 의미가 있습니다. 공식"이 API 관례를 쓰라" 같은 지침만 있고 작업이 없는 스킬을 포크하면, 서브에이전트가 지침만 받고 실행할 프롬프트가 없어 의미 있는 출력 없이 끝납니다. skills

관행세 번째 안티패턴은 자리가 틀린 스킬입니다. 스킬은 때때로 필요한 것을 담는 자리인데, 매 세션 필요한 사실을 스킬에 넣으면 클로드가 그 스킬을 부르지 않은 세션에서 그 사실을 모릅니다. 반대로 반드시 지켜져야 하는 금지를 스킬에 적으면 강제력이 없습니다(18.2절). 매 세션 필요한 것은 CLAUDE.md, 반드시 도는 것은 훅입니다.

실전네 번째는 승인되지 않은 프로젝트 스킬입니다. 프로젝트 .claude/skills/의 allowed-tools는 그 폴더의 워크스페이스 신뢰 대화를 수락한 뒤에 적용됩니다. 이 볼트에서 확인해 보니 신뢰 수락 상태가 ~/.claude.json의 프로젝트 항목에 hasTrustDialogAccepted로 기록돼 있었습니다. 즉 남의 저장소를 클론해 열면 그 저장소의 스킬이 스스로에게 넓은 도구 권한을 부여할 수 있으므로, 신뢰하기 전에 프로젝트 스킬을 읽어 보는 것이 맞습니다.

grep -l "allowed-tools" .claude/skills/*/SKILL.md   신뢰 전에 읽어 볼 대상

공식남이 쓴 스킬을 파일을 고치지 않고 통제하려면 skillOverrides 설정을 씁니다. /skills 메뉴에서 항목을 고르고 Space로 상태를 순환한 뒤 Enter로 저장하면 .claude/settings.local.json에 기록됩니다. skills

값클로드에게 보이는 것/ 메뉴
"on"이름과 설명보임
"name-only"이름만보임
"user-invocable-only"숨김보임
"off"숨김숨김

공식클로드가 부를 수 있는 스킬을 권한으로 통제할 수도 있습니다. /permissions의 deny에 Skill을 넣으면 전부 막고, Skill(commit)은 정확히 일치, Skill(review-pr *)은 접두어 일치입니다. 플러그인 스킬은 skillOverrides의 영향을 받지 않으므로 /plugin으로 관리합니다. skills


20

서브에이전트

20.1컨텍스트 분리의 이점

공식서브에이전트는 특정 종류의 작업을 맡는 전문 조수입니다. 부수 작업이 다시 볼 일 없는 검색 결과·로그·파일 내용으로 메인 대화를 채울 때 씁니다. 그 작업을 자기 맥락에서 하고 요약만 돌려줍니다. 각 서브에이전트는 자체 컨텍스트 윈도우, 커스텀 시스템 프롬프트, 특정 도구 접근, 독립 권한으로 돕니다. sub-agents

공식이득은 다섯입니다. 탐색과 구현을 메인 대화 밖에 두어 맥락 보존, 쓸 수 있는 도구를 제한해 제약 강제, 사용자 수준 서브에이전트로 프로젝트 간 구성 재사용, 도메인별 집중 시스템 프롬프트로 동작 특화, Haiku 같은 빠르고 싼 모델로 작업을 돌려 비용 통제입니다. sub-agents

공식비포크 서브에이전트의 초기 맥락에 들어가는 것은 셋입니다. 에이전트 자신의 시스템 프롬프트(전체 클로드코드 시스템 프롬프트가 아니라 여기에 환경 정보가 붙은 것), 클로드가 작성한 위임 프롬프트, 그리고 메인 대화가 로드한 CLAUDE.md 계층 전체입니다. 대화 기록, 이미 호출한 스킬, 클로드가 이미 읽은 파일은 보이지 않습니다. sub-agents

내장 Explore와 Plan은 CLAUDE.md를 건너뜁니다. 공식탐색을 빠르고 싸게 유지하기 위해 CLAUDE.md와 부모 세션의 git 상태를 둘 다 생략합니다. 그 외 모든 내장 에이전트와 커스텀 서브에이전트는 둘 다 로드합니다. Explore나 Plan에 프로젝트 관례를 지키게 하려면 위임 프롬프트에 그 지시를 다시 적어야 합니다. sub-agents

공식내장 서브에이전트는 대화형 세션에서 기본 등록됩니다. sub-agents

에이전트모델도구용도
Explore메인 대화 상속. Claude API에서는 Opus 상한읽기 전용. Write·Edit 거부파일 발견, 코드 검색, 코드베이스 탐색
Plan메인 대화 상속읽기 전용. Write·Edit 거부계획 수립을 위한 코드베이스 조사
general-purpose메인 대화 상속서브에이전트가 쓸 수 있는 모든 도구탐색과 수정이 함께 필요한 복잡한 다단계 작업
claude상속모든 도구더 특화된 에이전트에 안 맞는 작업의 포괄
claude-code-guideHaiku클로드코드 기능에 대한 질문

공식Explore를 부를 때 클로드는 철저도를 함께 지정합니다. 표적 조회는 quick, 균형 탐색은 medium, 포괄 분석은 very thorough입니다. 사용자나 프로젝트 스코프에 Explore라는 이름의 서브에이전트를 정의하면 내장을 덮고 자기 model 필드를 유지하므로, model: haiku로 탐색을 싼 모델에 고정할 수 있습니다. sub-agents

공식실행 방식도 알아 둡니다. v2.1.198부터 서브에이전트는 기본적으로 백그라운드에서 돕니다. 클로드는 결과가 계속 진행에 필요할 때만 포그라운드로 돌립니다. 백그라운드 서브에이전트는 포그라운드보다 작은 내장 도구 집합으로 돌고, 권한 프롬프트는 메인 세션에 어느 서브에이전트가 묻는지와 함께 표시됩니다. 승인하면 계속 진행하고 Esc를 누르면 그 도구 호출 하나만 거부하며 서브에이전트는 멈추지 않습니다. Ctrl B로 도는 작업을 백그라운드로 보낼 수 있습니다. sub-agents

공식한계도 둘 있습니다. 한 세션에서 20개가 돌고 있으면 추가 생성이 Concurrent subagent limit reached로 실패하고, 오류가 클로드에게 재시도하지 말라고 알립니다(CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS로 변경). 중첩은 메인 대화 아래 3층까지이며, 한계에 닿은 서브에이전트에서는 Agent 도구가 회수되어 위임받은 일을 스스로 하고 요약 하나를 돌려줍니다(CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH로 변경, 1이면 중첩 없음). 세션 전체의 총 개수 제한은 없습니다. sub-agents

20.2정의와 도구 제한

공식서브에이전트는 YAML 프론트매터가 붙은 마크다운 파일입니다. 프론트매터가 메타데이터와 구성을, 본문이 시스템 프롬프트를 정합니다. name과 description만 필수입니다. sub-agents

---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---

You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.

공식자주 쓰는 프론트매터 필드입니다. sub-agents

필드의미
name소문자와 하이픈으로 된 고유 식별자. 훅이 agent_type으로 받는 값. 파일명과 일치할 필요는 없다. :는 플러그인 이름공간 전용이라 쓸 수 없다
description클로드가 언제 이 서브에이전트에 위임할지
tools쓸 수 있는 도구. 생략하면 서브에이전트가 쓸 수 있는 모든 도구를 상속. 목록의 어느 항목도 도구로 해석되지 않으면 대개 실행 실패한다. 스킬을 미리 로드하려면 여기에 Skill을 넣지 말고 skills 필드를 쓴다
disallowedTools거부할 도구. 상속·지정 목록에서 제거된다
modelsonnet·opus·haiku·fable, 전체 모델 ID, 또는 inherit. 기본값 inherit
permissionMode이 서브에이전트의 권한 모드. 플러그인 서브에이전트에서는 무시된다
maxTurns멈추기 전 최대 에이전트 턴 수
skills시작 시 맥락에 미리 로드할 스킬. 설명이 아니라 전문이 주입된다
mcpServers이 서브에이전트가 쓸 MCP 서버. 이미 구성된 서버 이름이나 인라인 정의
hooks이 서브에이전트에 범위가 묶인 수명주기 훅
memory영속 메모리 범위(user·project·local). 세션 간 학습을 켠다
backgroundtrue면 클로드가 결과를 바로 필요로 해도 항상 백그라운드로 돈다
isolationworktree면 임시 git 워크트리에서 돈다. 변경이 없으면 자동 정리된다
color작업 목록과 전사에서의 표시 색

공식같은 이름이 여러 곳에 있으면 우선순위가 높은 쪽을 씁니다. sub-agents

위치범위우선순위
관리형 설정조직 전체1(가장 높음)
--agents CLI 플래그현재 세션2
.claude/agents/현재 프로젝트3
~/.claude/agents/내 모든 프로젝트4
플러그인의 agents/플러그인이 켜진 곳5(가장 낮음)

공식.claude/agents/와 ~/.claude/agents/는 재귀 스캔되므로 agents/review/처럼 하위 폴더로 정리할 수 있습니다. 하위 경로는 식별과 호출에 영향을 주지 않습니다. 정체성은 name 프론트매터에서만 옵니다. 그래서 name은 트리 전체에서 유일해야 합니다. 같은 디렉터리 아래 두 파일이 같은 이름을 선언하면 클로드코드는 파일시스템 읽기 순서로 하나만 로드하며, 문서화된 우선순위가 없습니다. /doctor가 이 중복을 보고합니다. sub-agents

편집이 몇 초 안에 반영됩니다. 공식클로드코드가 두 디렉터리를 감시하므로 파일을 추가·수정하면 다음 위임에 갱신된 정의가 쓰입니다. 재시작이 필요한 경우는 둘입니다. 세션 시작 시 없던 agents 디렉터리에 그 스코프의 첫 파일을 만든 경우, 그리고 --disable-slash-commands로 시작한 세션입니다. sub-agents

공식도구 상속에는 두 겹의 필터가 걸립니다. 첫 필터는 모든 서브에이전트에서 몇 개를 제거하는데, tools에 적어도 제거됩니다. AskUserQuestion, EndConversation, EnterPlanMode, ScheduleWakeup, 그리고 깊이 한계에 닿았을 때의 Agent가 여기 해당합니다(ExitPlanMode는 permissionMode가 plan일 때만 남습니다). 둘째 필터는 백그라운드 서브에이전트의 내장 도구 집합을 줄입니다. 포크는 두 필터를 모두 건너뛰고 메인 대화의 도구 풀을 그대로 받습니다. sub-agents

플러그인 서브에이전트는 세 필드를 무시합니다. 공식보안상 hooks, mcpServers, permissionMode는 플러그인에서 로드할 때 무시됩니다. 필요하면 에이전트 파일을 .claude/agents/나 ~/.claude/agents/로 복사합니다. sub-agents

실전이 볼트에는 서브에이전트가 하나 있습니다(~/.claude/agents/youtube-article.md). 프론트매터는 name·description·tools·model 네 개뿐이고 나머지는 기본값에 맡겼습니다. tools는 Bash, Read, Write, Edit, Glob, Grep, WebFetch 일곱 개로 명시했고 model: inherit입니다. 본문(시스템 프롬프트)은 5,529자입니다. 흥미로운 것은 비율입니다. description이 308자로 스킬(789자·514자)보다 짧은데, 서브에이전트는 위임 판단만 하면 되고 절차는 본문에 있기 때문입니다. 스킬은 반대로 발화 조건이 설명에 다 들어가야 합니다.

20.3위임 지시 설계

공식공식 문서가 드는 패턴 셋입니다. 대용량 작업 격리는 테스트 실행·문서 수집·로그 처리처럼 출력이 많은 것을 위임해 상세는 서브에이전트 맥락에 두고 요약만 받는 것입니다. 병렬 조사는 독립적인 조사 여러 개를 동시에 띄우고 클로드가 종합하는 것으로, 조사 경로가 서로 의존하지 않을 때 가장 잘 됩니다. 연쇄는 다단계 작업에서 순서대로 쓰는 것입니다. sub-agents

서브에이전트로 테스트를 돌리고 실패한 테스트와 오류 메시지만 보고해 줘

인증·데이터베이스·API 모듈을 각각 별도 서브에이전트로 병렬 조사해 줘

code-reviewer 서브에이전트로 성능 문제를 찾고, 그다음 optimizer 서브에이전트로 고쳐 줘
많이 띄우면 결과가 다시 맥락을 채웁니다. 공식서브에이전트가 끝나면 결과가 메인 대화로 돌아옵니다. 각자 상세한 결과를 돌려주는 서브에이전트를 여럿 돌리면 상당한 맥락을 소비합니다. 지속적 병렬성이 필요하거나 컨텍스트 윈도우를 넘길 작업이면 에이전트 팀이 각 작업자에게 독립 맥락을 줍니다(L4에서 다룹니다). sub-agents

공식반환값의 신뢰도에 대한 장치도 있습니다. 클로드코드는 각 서브에이전트의 최종 보고를 클로드가 읽기 전에 스캔합니다. 서브에이전트가 내가 검토하지 않은 파일·웹 페이지·명령 출력을 읽었을 수 있고, 그 텍스트가 메인 대화를 겨냥한 지시를 담을 수 있기 때문입니다. 스캔은 아무것도 제거하거나 바꿔 쓰지 않고 두 가지만 합니다. 클로드코드 자신의 출력을 모방한 텍스트(<system-reminder> 태그나 Human:으로 시작하는 줄)에 백슬래시를 넣어 평문으로 읽히게 하고, 그런 모방이나 권한 설정 언급이 있으면 [harness: subagent output matched instruction-shaped pattern(s):로 시작하는 표시 줄을 앞에 붙입니다. sub-agents

스캔은 악성 여부를 판정하지 않습니다. 공식보고가 클로드를 이끌어 하게 만든 도구 호출은 여전히 세션의 권한 검사와 샌드박스를 통과해야 합니다. 서브에이전트가 닿을 수 있는 범위를 제한하는 것을 대체하지 않습니다. sub-agents

관행반환값을 데이터로 받으려면 위임 프롬프트에 형식을 지정하는 편이 낫습니다. "조사해 줘"는 산문 보고를 돌려주고, "파일 경로와 줄 번호, 한 줄 근거를 목록으로만 돌려 줘"는 그다음 단계에서 바로 쓸 수 있는 형태를 돌려줍니다. 서브에이전트는 대화 기록을 못 보므로, 내가 이미 아는 맥락은 프롬프트에 다시 적어야 합니다.

20.4위임하면 안 되는 일

공식공식 문서는 메인 대화를 쓸 네 경우를 명시합니다. 잦은 왕복이나 반복 정련이 필요할 때, 계획·구현·테스트처럼 여러 단계가 상당한 맥락을 공유할 때, 빠르고 표적화된 변경일 때, 그리고 지연이 중요할 때입니다. 서브에이전트는 새로 시작하므로 맥락을 모으는 데 시간이 듭니다. sub-agents

공식반대로 서브에이전트를 쓸 세 경우는 메인 맥락에 필요 없는 장황한 출력이 나올 때, 특정 도구 제한이나 권한을 강제하고 싶을 때, 작업이 자기완결적이라 요약을 돌려줄 수 있을 때입니다. 메인 대화 맥락에서 도는 재사용 프롬프트나 워크플로가 필요하면 서브에이전트가 아니라 스킬을 고려합니다. sub-agents

이미 대화에 있는 것을 묻는다면 서브에이전트가 아닙니다. 공식대화에 이미 있는 것에 대한 간단한 질문에는 /btw를 씁니다. 내 전체 맥락을 보지만 도구 접근이 없고, 답이 기록에 추가되지 않고 버려집니다. sub-agents

관행위임이 손해가 되는 지점은 대개 판단이 왕복을 필요로 할 때입니다. 서브에이전트는 중간에 나에게 물을 수 없습니다(AskUserQuestion이 도구 목록에서 제거됩니다). 그래서 요구사항이 모호한 작업을 위임하면 서브에이전트가 자기 해석으로 끝까지 밀고 나간 결과가 돌아옵니다. 모호한 것은 메인 대화에서 좁힌 뒤에 위임합니다.

관행또 하나는 맥락 자체가 산출물인 작업입니다. 리팩토링 대상을 함께 읽어 가며 판단해야 하는 작업을 위임하면, 위임한 쪽에는 요약만 남아 다음 결정의 근거가 사라집니다. 이때는 파일을 읽는 비용을 감수하고 메인에서 하는 편이 낫습니다.


21

훅

이 장이 이 편의 중심입니다. 공식훅은 사용자가 정의한 셸 명령·HTTP 엔드포인트·LLM 프롬프트·에이전트이며, 클로드코드가 자기 수명주기의 정해진 지점에서 자동으로 실행합니다. 그래서 결정론적 통제를 줍니다. LLM이 실행하기로 선택하는 데 의존하지 않고 특정 동작이 항상 일어납니다. 터미널·IDE 확장·데스크톱 앱·웹이 모두 같은 훅 이벤트를 발동시킵니다. hooks-guide

21.1훅이 발동하는 시점

공식이벤트는 주기로 셋으로 갈립니다. 세션당 한 번(SessionStart·SessionEnd), 턴당 한 번(UserPromptSubmit·Stop·StopFailure), 그리고 도구 호출마다(PreToolUse·PostToolUse, EndConversation은 제외)입니다. 이벤트가 발동하면 매칭되는 모든 훅이 병렬로 돕니다. hooks

이벤트발동 시점
SessionStart세션이 시작되거나 재개될 때
Setup--init-only로 시작할 때, 또는 -p 모드에서 --init·--maintenance와 함께. CI와 스크립트의 일회성 준비용
UserPromptSubmit프롬프트를 제출했을 때, 클로드가 처리하기 전
UserPromptExpansion사용자가 입력한 명령이 프롬프트로 확장될 때. 확장을 막을 수 있다
PreToolUse도구 호출 실행 전. 막을 수 있다
PermissionRequest도구 호출이 권한 결정을 필요로 할 때
PermissionDenied자동 모드 분류기가 도구 호출을 거부했을 때. {retry: true}로 재시도를 허용할 수 있다
PostToolUse · PostToolUseFailure도구 호출이 성공한 뒤 / 실패한 뒤
PostToolBatch병렬 도구 호출 배치 전체가 끝난 뒤, 다음 모델 호출 전
Notification클로드코드가 알림을 보낼 때
MessageDisplay어시스턴트 메시지 텍스트가 표시되는 동안
SubagentStart · SubagentStop서브에이전트가 생성될 때 / 끝날 때
TaskCreated · TaskCompleted작업이 생성될 때 / 완료로 표시될 때
Stop클로드가 응답을 마쳤을 때
StopFailureAPI 오류로 턴이 끝났을 때. 출력과 종료 코드는 무시된다
TeammateIdle에이전트 팀 동료가 유휴 상태로 가려 할 때
InstructionsLoadedCLAUDE.md나 .claude/rules/*.md가 맥락에 로드될 때. 세션 시작과 지연 로드 시 모두
ConfigChange세션 중 설정 파일이 바뀔 때
CwdChanged작업 디렉터리가 바뀔 때. direnv 같은 도구와의 반응형 환경 관리에 유용
DirectoryAdded세션 중 /add-dir로 작업 디렉터리가 추가될 때
FileChanged감시 중인 파일이 디스크에서 바뀔 때. matcher가 감시할 파일명을 지정한다
WorktreeCreate · WorktreeRemove워크트리가 만들어질 때 / 제거될 때. 생성 훅은 기본 git 동작을 대체한다
PreCompact · PostCompact컨텍스트 압축 전 / 완료 후
Elicitation · ElicitationResultMCP 서버가 도구 호출 중 사용자 입력을 요청할 때 / 응답 후
SessionEnd세션이 종료될 때
Stop은 작업 완료 시점이 아닙니다. 공식클로드가 응답을 마칠 때마다 발동합니다. 사용자 인터럽트에는 발동하지 않고, API 오류에는 StopFailure가 대신 발동합니다. PostToolUse 훅은 도구가 이미 실행됐으므로 동작을 되돌릴 수 없습니다. hooks-guide

21.2설정 위치와 형식

공식훅은 JSON 설정 파일에 세 겹으로 정의합니다. 1) 이벤트를 고르고, 2) 언제 발동할지 걸러 줄 매처 그룹을 더하고, 3) 매칭됐을 때 돌 핸들러를 하나 이상 정의합니다. hooks

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

공식어디에 두는지가 범위를 정합니다. hooks-guide

위치범위공유
~/.claude/settings.json내 모든 프로젝트아니오. 기기 로컬
.claude/settings.json단일 프로젝트예. 저장소에 커밋 가능
.claude/settings.local.json단일 프로젝트아니오. gitignore 처리
관리형 정책 설정조직 전체예. 관리자 통제
플러그인 hooks/hooks.json플러그인이 켜진 동안예. 플러그인에 번들
스킬·에이전트 프론트매터그 컴포넌트가 활성인 동안예. 컴포넌트 파일에 정의

공식matcher 필드의 해석 규칙은 세 가지입니다. hooks

매처 값해석예
"*", "", 생략전부 매칭매 발생마다 발동
글자·숫자·_·-·공백·,·|만 포함정확한 문자열, 또는 |·,로 구분한 목록Bash 또는 Edit|Write
다른 문자를 포함자바스크립트 정규식(앵커 없음)^Notebook 또는 mcp__memory__.*

공식이벤트마다 매처가 무엇을 거르는지가 다릅니다. 도구 이벤트는 도구 이름, SessionStart는 시작 방식(startup·resume·clear·compact·fork), SessionEnd는 종료 이유, SubagentStart·SubagentStop은 에이전트 종류, ConfigChange는 설정 출처, FileChanged는 감시할 파일명입니다. UserPromptSubmit·Stop·PostToolBatch·TaskCreated 등은 매처를 지원하지 않고 항상 발동합니다. hooks

공식핸들러 종류는 다섯입니다. 대부분은 "command"(셸 명령)를 씁니다. "http"는 URL로 이벤트 데이터를 POST하고, "mcp_tool"은 이미 연결된 MCP 서버의 도구를 부르고, "prompt"는 단일 턴 LLM 판정이고, "agent"는 도구 접근이 있는 다중 턴 검증입니다(실험 기능). hooks-guide

공식모든 핸들러가 공유하는 필드가 넷 있습니다. type(필수), if(권한 규칙 문법으로 조건을 좁힘. 도구 이벤트에서만), timeout(초), statusMessage(도는 동안 보일 문구)입니다. 기본 타임아웃은 command·http·mcp_tool이 10분, prompt가 30초, agent가 60초입니다. 단 UserPromptSubmit은 앞의 셋을 30초로, MessageDisplay는 10초로 낮추고, SessionEnd 훅은 종류와 무관하게 1.5초 예산을 공유합니다. hooks-guide

exec 형과 shell 형을 구분합니다. 공식args가 있으면 exec 형입니다. command가 PATH의 실행 파일로 해석되어 args를 인자 벡터로 직접 실행되며, 셸이 없어 인용 처리가 필요 없습니다. args를 생략하면 shell 형이라 문자열이 셸에 넘어가 파이프·&&·리다이렉트·글로브가 해석됩니다. 인용 문제로 고생할 때 "args": []를 더해 exec 형으로 바꾸는 것이 공식 권고입니다. hooks

공식스크립트 경로는 플레이스홀더로 씁니다. ${CLAUDE_PROJECT_DIR}는 프로젝트 루트, ${CLAUDE_PLUGIN_ROOT}는 플러그인 설치 디렉터리, ${CLAUDE_PLUGIN_DATA}는 플러그인의 영속 데이터 디렉터리입니다. hooks

실전이 볼트의 훅은 그 플레이스홀더를 절반만 씁니다. 로깅과 문체 점검 훅 4개는 $CLAUDE_PROJECT_DIR로 스크립트를 찾는데, SessionStart의 나머지 6개는 절대 경로를 리터럴로 담고 있습니다(윈도우용 3개는 K:\ 경로의 .ps1, 맥용 3개는 /Users/... 경로의 .sh). 의도는 OS별 쌍이고 각 기기가 자기 절반만 돌리는 구조입니다. 이 맥에서 확인하니 pwsh가 없고 K:도 없어 윈도우 3개는 실행되지 않았고, bash 3개는 정상 동작했습니다. 동작은 하지만 볼트 경로나 계정명이 바뀌면 조용히 깨지는 구조이고, 훅 실패는 눈에 잘 띄지 않습니다. 플레이스홀더로 바꾸면 쌍을 유지하면서 경로 의존이 사라집니다.

python3 -c "
import json
d = json.load(open('.claude/settings.json'))
for ev, ms in d.get('hooks', {}).items():
    for m in ms:
        for h in m.get('hooks', []):
            s = h.get('command', '') + ' ' + ' '.join(map(str, h.get('args') or []))
            if '/Users/' in s or ':\\\\' in s:
                print('절대경로 발견:', ev, '|', s[:80])
"

21.3입출력 계약

공식훅은 stdin·stdout·stderr·종료 코드로 클로드코드와 통신합니다. 이벤트가 발동하면 이벤트별 데이터가 JSON으로 스크립트의 stdin에 들어옵니다. 스크립트가 그 데이터를 읽고 일을 하고, 종료 코드로 다음에 무엇을 할지 알립니다. hooks-guide

공식모든 이벤트가 공유하는 입력 필드입니다. hooks

필드내용
session_id현재 세션 식별자
prompt_id처리 중인 사용자 프롬프트의 UUID. 첫 입력 전에는 없다
transcript_path대화 JSON 경로. 비동기로 쓰이므로 메모리 상태보다 뒤처질 수 있다
cwd훅이 불릴 때의 작업 디렉터리
permission_mode현재 권한 모드
hook_event_name발동한 이벤트 이름
agent_id · agent_type서브에이전트에서만. 식별자와 에이전트 이름

공식도구 이벤트는 여기에 tool_name과 tool_input이 붙습니다. Bash라면 tool_input.command에 셸 명령이 담깁니다. UserPromptSubmit은 대신 prompt 텍스트를, SessionStart는 source를 받습니다. hooks-guide

{
  "session_id": "abc123",
  "cwd": "/Users/sarah/myproject",
  "hook_event_name": "PreToolUse",
  "tool_name": "Bash",
  "tool_input": { "command": "npm test" }
}

공식종료 코드가 결과를 정합니다. hooks

코드의미동작
0성공stdout을 JSON으로 파싱. 대부분의 이벤트에서 stdout은 디버그 로그로 간다. 예외는 UserPromptSubmit·UserPromptExpansion·SessionStart로, 여기서는 stdout이 클로드가 볼 수 있는 맥락으로 추가된다
2차단 오류stdout과 JSON을 무시하고 stderr 텍스트를 오류 메시지로 쓴다. 효과는 이벤트에 따라 다르다
그 외비차단 오류동작은 진행된다. 전사에 <hook name> hook error 알림과 stderr 첫 줄이 표시된다

공식종료 코드 2가 무엇을 막는지는 이벤트마다 다릅니다. 막을 수 있는 것은 PreToolUse(도구 호출), PermissionRequest(권한 거부), UserPromptSubmit(프롬프트 처리를 막고 프롬프트를 지운다), UserPromptExpansion, Stop(클로드가 멈추지 못하게 하고 대화를 계속한다), SubagentStop, TaskCreated(생성을 되돌린다), TaskCompleted, ConfigChange, PreCompact, PostToolBatch, WorktreeCreate, Elicitation입니다. PostToolUse는 막지 못하지만 stderr를 클로드에게 보여 줍니다. hooks

#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')

if echo "$COMMAND" | grep -q "drop table"; then
  echo "Blocked: dropping tables is not allowed" >&2  # stderr가 클로드에게 가는 피드백
  exit 2                                               # 2 = 동작 차단
fi

exit 0  # 0 = 판정 없음. 정상 권한 흐름 적용

공식종료 코드 0으로 JSON을 출력하면 더 세밀하게 통제할 수 있습니다. 한 훅에서 둘을 섞지 말고 종료 코드만 쓰거나 JSON만 씁니다. 출력 상한은 1만 자이고 넘치면 파일로 저장되며 미리보기와 경로가 표시됩니다. 공용 필드는 continue(false면 클로드가 처리를 완전히 멈춘다), stopReason, suppressOutput, systemMessage, terminalSequence입니다. hooks

맥락을 더하려면 additionalContext를 씁니다. 공식이 필드는 훅이 발동한 지점에서 문자열을 시스템 리마인더로 클로드의 컨텍스트 윈도우에 넣습니다. 채팅 메시지로는 보이지 않고 클로드가 다음 모델 요청에서 읽습니다. 쓸 곳은 환경 상태와 조건부 규칙입니다(현재 브랜치, 배포 대상, 활성 기능 플래그, 어느 테스트 명령이 적용되는지). 정적인 지시는 스크립트 없이 로드되는 CLAUDE.md가 낫습니다. hooks
{
  "hookSpecificOutput": {
    "hookEventName": "PostToolUse",
    "additionalContext": "This file is generated. Edit src/schema.ts and run `bun generate` instead."
  }
}

공식문장 형태에도 주의가 필요합니다. "배포 대상은 production이다", "이 저장소는 bun test를 쓴다"처럼 사실 서술로 씁니다. 시스템 명령처럼 쓰면 클로드의 프롬프트 인젝션 방어를 발동시킬 수 있습니다. 그리고 주입된 텍스트는 전사에 저장되므로, --continue나 --resume으로 재개하면 훅을 다시 돌리지 않고 저장된 텍스트를 재생합니다. 타임스탬프나 커밋 SHA가 오래된 값으로 남습니다. SessionStart 훅은 재개 시 다시 돌므로 맥락을 갱신할 수 있습니다. hooks

공식여러 훅이 같은 이벤트에 매칭되면 모든 훅의 명령이 끝까지 돈 다음 결과가 병합됩니다. 한 훅이 deny를 돌려줘도 형제 훅의 실행은 멈추지 않습니다. PreToolUse 권한 결정은 가장 제한적인 답이 이기며 순서는 deny → defer → ask → allow입니다. additionalContext 텍스트는 모든 훅에서 수집되어 함께 전달됩니다. hooks-guide

훅은 제한을 조일 수 있고 풀 수는 없습니다. 공식PreToolUse 훅은 모든 권한 모드에서 권한 모드 검사보다 먼저 발동합니다(dontAsk 포함). permissionDecision: "deny"를 돌려주면 bypassPermissions 모드나 --dangerously-skip-permissions에서도 도구가 막힙니다. 사용자가 권한 모드를 바꿔 우회할 수 없는 정책을 강제할 수 있다는 뜻입니다. 반대는 성립하지 않습니다. "allow"를 돌려줘도 설정의 deny 규칙을 우회하지 못합니다. hooks-guide

21.4실전 훅 5종

공식 문서의 예제 둘과 이 볼트에서 실제로 도는 것 셋을 함께 봅니다. 붙여 쓸 수 있는 형태로 옮겼습니다.

공식1) 편집 후 자동 포맷. PostToolUse에 Edit|Write 매처를 걸어 편집된 파일 경로를 jq로 뽑아 포매터에 넘깁니다. 성공하면 대화에 아무것도 표시되지 않으므로, 확인은 파일이 재포맷됐는지로 합니다. hooks-guide

{
  "hooks": {
    "PostToolUse": [
      { "matcher": "Edit|Write",
        "hooks": [{ "type": "command",
          "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }] }
    ]
  }
}

공식2) 보호 파일 편집 차단. 스크립트가 대상 경로를 보호 패턴 목록과 대조하고 종료 코드 2로 편집을 막습니다. 클로드는 stderr를 피드백으로 받아 접근을 바꿉니다. 맥과 리눅스에서는 chmod +x로 실행 권한을 줘야 합니다. hooks-guide

#!/bin/bash
# .claude/hooks/protect-files.sh
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
FILE_PATH="${FILE_PATH//\\//}"   # 윈도우 백슬래시 정규화

PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")
for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if [[ "$FILE_PATH" == *"$pattern"* ]]; then
    echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2
    exit 2
  fi
done
exit 0

실전3) 대화 전량 적재. 이 볼트는 질문과 응답을 전부 디스크에 남깁니다. 같은 스크립트를 세 이벤트에 다른 인자로 걸었습니다. UserPromptSubmit에 --질문(타임아웃 10초), Stop에 --응답(20초), SessionStart에 --백필(60초)입니다. 핵심은 두 가지 방어입니다. 파이썬 실행기를 command -v로 확인해 python3 → python 순으로 폴백하고, 출력을 전부 버린 뒤 exit 0을 명시해 무슨 일이 있어도 세션을 막지 않게 했습니다. 로깅 훅이 세션을 깨뜨리면 로그의 가치보다 손해가 큽니다.

p="$CLAUDE_PROJECT_DIR/00_시스템/_대화로그/로그_적재.py"
if [ -f "$p" ]; then
  { command -v python3 >/dev/null 2>&1 && python3 "$p" --질문; } ||
  { command -v python  >/dev/null 2>&1 && python  "$p" --질문; }
fi >/dev/null 2>&1; exit 0

실전4) 문체 규칙 강제. Stop 훅이 그 턴의 최종 답변을 스캔해 금지 패턴이 걸리면 종료 코드 2로 재작성을 요구합니다. 패턴은 12종이고 각각 임계값을 갖습니다. em dash·원형숫자·이모지처럼 한 번이라도 나오면 위반인 것(임계 1)과, 한 번은 정당하고 반복이 문제인 것(예: 같은 대구 반복은 임계 3, 굵은 용어 + 콜론 불릿은 임계 4)을 나눴습니다. 임계값은 이 볼트의 응답 300건을 실측해 정했습니다.

실전이 훅에서 배운 것 둘이 있습니다. 첫째, 루프 방지가 필수입니다. 스크립트가 stop_hook_active 필드를 읽어 이미 이 훅으로 이어진 턴이면 즉시 통과시킵니다. 이것이 없으면 훅이 계속 차단해 턴이 끝나지 않습니다. 둘째, 훅 자신의 실패는 조용해야 합니다. 스캔 자체가 예외로 죽으면 종료 코드 0으로 통과시킵니다. 문체 점검기가 고장 났다고 세션을 못 쓰게 되는 것은 과한 대가입니다.

Stop 훅에는 차단 상한이 있습니다. 공식진전 없이 8회 연속 차단하면 클로드코드가 Stop 훅을 무시하고 턴을 끝냅니다. 그래서 스크립트가 stop_hook_active를 확인해 true면 일찍 종료해야 합니다. 정당하게 8회 이상 수렴이 필요하면 CLAUDE_CODE_STOP_HOOK_BLOCK_CAP으로 상한을 올립니다. hooks-guide
#!/bin/bash
INPUT=$(cat)
if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then
  exit 0  # 이미 이 훅으로 이어붙인 턴 = 루프 차단
fi
# ... 나머지 훅 로직

실전5) 세션 시작 점검 3종. 백업·메모리 정리·구조 최적화 점검을 SessionStart에 걸었습니다. 여기서 쓴 설계 둘이 유용했습니다. 셋 중 둘은 async: true로 백그라운드에서 돌려 세션 시작을 늦추지 않고, 결과를 바로 봐야 하는 하나만 async: false로 대기합니다. 그리고 args를 쓴 exec 형이라 한글이 든 경로를 셸 인용 없이 그대로 넘깁니다. 셸 형으로 한글 경로를 넘기면 인용 처리에서 깨지기 쉽습니다.

공식판단이 필요한 검사는 prompt·agent 훅이 맡습니다. prompt 훅은 프롬프트와 훅 입력을 모델(기본 Haiku)에 보내 {"ok": true|false, "reason": "..."}만 받습니다. agent 훅은 서브에이전트를 띄워 파일을 읽고 명령을 돌려 실제 상태를 확인한 뒤 같은 형식으로 답합니다(기본 60초, 최대 50 도구 턴). 훅 입력 데이터만으로 판단이 되면 prompt, 코드베이스의 실제 상태를 확인해야 하면 agent입니다. hooks-guide

{
  "hooks": {
    "Stop": [
      { "hooks": [{ "type": "agent",
          "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",
          "timeout": 120 }] }
    ]
  }
}

21.5훅 디버깅

공식훅이 아예 안 돌 때 확인할 것 넷입니다. /hooks로 올바른 이벤트 아래 나타나는지 보고, 매처 패턴이 도구 이름과 정확히 맞는지 보고(대소문자를 구분합니다), 이벤트 종류가 맞는지 보고, 비대화 모드라면 PermissionRequest 대신 PreToolUse를 써야 하는지 봅니다. hooks-guide

공식/hooks에 아무 훅도 안 보이면 원인은 셋입니다. 파일 변경이 감시기에 잡히지 않았거나(몇 초 뒤에도 없으면 세션 재시작), JSON이 유효하지 않거나(뒤따르는 쉼표와 주석은 허용되지 않습니다), 설정 파일 위치가 틀린 것입니다. hooks-guide

공식전사에 훅 오류가 보일 때는 스크립트를 직접 돌려 봅니다. hooks-guide

echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh
echo $?   # 종료 코드 확인

공식메시지별 처방이 있습니다. command not found면 절대 경로나 ${CLAUDE_PROJECT_DIR}를 쓰거나, 셸 인용을 아예 피하려면 "args": []로 exec 형으로 바꿉니다. jq: command not found면 jq를 설치하거나 파이썬·노드로 JSON을 파싱합니다. 스크립트가 아예 안 돌면 chmod +x를 확인합니다. hooks-guide

셸 프로필의 echo가 JSON을 깨뜨립니다. 공식셸 형 훅은 비대화 셸에서 돌지만 Git Bash나 BASH_ENV 설정에 따라 프로필을 읽는 경우가 있습니다. 프로필에 조건 없는 echo가 있으면 그 출력이 훅의 JSON 앞에 붙어 파싱이 실패합니다. 프로필의 echo를 대화형 셸에서만 돌게 감싸면 해결됩니다. hooks-guide
# ~/.zshrc 또는 ~/.bashrc
if [[ $- == *i* ]]; then
  echo "Shell ready"
fi

공식결과 확인은 Ctrl O로 전사 뷰를 엽니다. 종료 코드 0으로 성공한 뒤에는 아무것도 보이지 않습니다. 그래서 돌았는지 확인하려면 효과(재포맷된 파일 등)를 보거나 디버그 로깅을 켭니다. 차단 오류(2)에서는 stderr가 보이고, 비차단 오류에서는 <hook name> hook error 알림과 Failed with non-blocking status code:가 붙은 stderr 첫 줄이 보입니다. hooks-guide

claude --debug-file /tmp/claude.log     알려진 경로로 디버그 로그 기록
tail -f /tmp/claude.log                 다른 터미널에서 따라 보기

실전디버깅에서 가장 자주 쓴 것은 위 두 줄이 아니라 훅 스크립트에 직접 로그를 남기는 것이었습니다. 훅은 성공하면 침묵하므로, 개발 중에는 스크립트 첫 줄에서 입력 JSON을 파일에 통째로 덤프해 두면 어떤 필드가 실제로 오는지 바로 보입니다. 문서의 스키마와 실제 입력이 다른 것은 아니지만, 어느 이벤트에서 어떤 필드가 비어 있는지는 실물을 봐야 알 수 있습니다.

INPUT=$(cat)
echo "$INPUT" >> /tmp/hook-input.jsonl   # 개발 중에만
# ... 나머지 로직

21.6훅으로 규칙을 강제한다는 것

공식공식 문서의 문장이 이 절의 전제입니다. CLAUDE.md나 스킬에 적은 지시는 요청이고, 그 동작을 막는 PreToolUse 훅이 강제입니다. 어떤 규칙이 매번 지켜져야 한다면 프롬프트 지시가 아니라 훅으로 만듭니다. features-overview

실전이 차이를 이 볼트에서 실제로 겪었습니다. 문체 규칙(em dash 금지, 원형숫자 금지, 상투구 금지)은 원래 규칙 문서에 적혀 있었습니다. 문서로만 있을 때는 지켜지는 비율이 일정하지 않았고, 어겨도 아무 일도 일어나지 않아서 어겼다는 사실 자체를 나중에야 알았습니다. 같은 규칙을 Stop 훅으로 옮긴 뒤에는 위반이 그 턴에서 즉시 되돌려집니다. 규칙 텍스트는 한 글자도 바뀌지 않았고 발화 지점만 바뀌었습니다.

실전다만 옮기면서 규칙을 줄여야 했습니다. 문서의 전수 목록은 사람 판단용이라 오탐이 많았고, 기계로 강제할 수 있는 것은 고정밀 부분집합뿐이었습니다. 그래서 훅에는 12개만 넣고 나머지는 문서에 남겼습니다. 훅 스크립트의 주석에 그 경계를 명시해 뒀습니다. "규격 정본은 문체 규격 문서이고, 이 파일은 그 목록의 고정밀 부분집합을 기계로 강제한다. 전수 목록은 사람 판단용이라 여기 옮기지 않는다." 훅으로 강제할 수 있는 것과 문서로 남길 것을 나누는 이 판단이 실제 작업의 대부분이었습니다.

훅에는 대가가 있습니다. 실전세 가지를 값으로 치렀습니다. 첫째, 훅이 도는 동안 세션이 기다립니다(이 볼트는 문체 점검에 15초, 세션 시작 백필에 60초 타임아웃을 뒀습니다). 둘째, 훅 자체가 고장 날 수 있어 실패 시 통과를 설계에 넣어야 합니다. 셋째, 훅은 조용히 성공하므로 돌고 있는지 아무도 모릅니다. 세 번째가 가장 실질적인 문제였습니다. 도는 것을 확인할 방법을 함께 만들지 않으면, 어느 시점부터 안 돌고 있어도 알 수 없습니다.

관행그래서 훅을 만들 때 같이 만들 것이 하나 있습니다. 그 훅이 돌았다는 증거입니다. 로그 파일 한 줄이든, 카운터든, 주기적으로 확인할 명령 한 줄이든 상관없습니다. 이 볼트는 대화 로그 자체가 그 증거 역할을 합니다. 적재가 멈추면 로그가 늘지 않으므로 바로 드러납니다.

공식마지막으로 끄는 방법도 알아 둡니다. 설정 파일에 "disableAllHooks": true를 두면 훅과 커스텀 상태줄이 모두 꺼집니다. 관리형 설정에 있는 훅은 관리형 설정에도 이 값이 있어야 꺼집니다. 개별 훅을 없애려면 설정 JSON에서 그 항목을 지웁니다. hooks


22

출력과 표시 커스터마이징

22.1출력 스타일

공식출력 스타일은 클로드가 무엇을 아는지가 아니라 어떻게 답하는지를 바꿉니다. 시스템 프롬프트를 수정해 역할·어조·출력 형식을 정합니다. 매 턴 같은 목소리나 형식을 다시 요청하고 있을 때, 또는 클로드가 소프트웨어 엔지니어가 아닌 다른 역할을 하기를 원할 때 씁니다. 프로젝트·관례·코드베이스에 대한 지시는 CLAUDE.md가 맞습니다. output-styles

공식기본 스타일 외에 내장 스타일이 셋 있습니다. Proactive는 즉시 실행하고 루틴한 결정에서 멈추지 않고 합리적 가정을 세우며 계획보다 행동을 선호합니다. 자동 모드보다 강한 자율 실행 지침이면서 권한 모드를 바꾸지 않으므로 권한 프롬프트는 그대로 뜹니다. Explanatory는 작업 사이에 교육적인 "Insights"를 넣습니다. Learning은 협업 학습 모드로, 통찰을 공유하는 데 그치지 않고 작지만 전략적인 코드 조각을 직접 쓰게 하며 코드에 TODO(human) 마커를 남깁니다. output-styles

공식바꾸는 방법은 /config에서 Output style을 고르는 것입니다. 선택은 .claude/settings.local.json에 저장됩니다. 메뉴 없이 하려면 설정 파일의 outputStyle 필드를 직접 고칩니다. 독립 /output-style 명령은 v2.1.73에서 폐기되고 v2.1.91에서 제거됐습니다. output-styles

{
  "outputStyle": "Explanatory"
}
재시작이나 /clear가 필요합니다. 공식출력 스타일은 시스템 프롬프트의 일부이고 클로드코드는 그것을 세션 시작에 한 번 읽습니다. 그래서 변경은 /clear나 새 세션 뒤에 적용됩니다. L2의 설정 반영 표에서 model과 함께 예외였던 두 키 중 하나가 이것입니다. output-styles

공식커스텀 스타일은 프론트매터가 붙은 마크다운 파일입니다. 파일명이 스타일 이름이 되고(name을 지정하면 그것을 씁니다), 위치는 세 곳입니다. 사용자 ~/.claude/output-styles, 프로젝트 .claude/output-styles, 그리고 관리형 설정 디렉터리 안의 같은 경로입니다. output-styles

프론트매터용도기본값
name파일명과 다른 이름을 쓸 때파일명 상속
description/config 선택기에 표시없음
keep-coding-instructions클로드코드의 내장 소프트웨어 엔지니어링 지시를 유지false
force-for-plugin플러그인 전용. 플러그인이 켜지면 사용자 선택 없이 자동 적용false
keep-coding-instructions의 기본값이 false입니다. 공식커스텀 출력 스타일은 이 값을 true로 두지 않으면 클로드코드의 내장 엔지니어링 지시(변경 범위를 어떻게 잡고, 주석을 어떻게 쓰고, 작업을 어떻게 검증하는지)를 빼 버립니다. 소통 방식만 바꾸면서 코딩은 그대로 하게 하려면 반드시 true로 둡니다. 클로드가 소프트웨어 엔지니어링을 아예 하지 않는 용도(글쓰기 보조, 데이터 분석)라면 빼는 것이 맞습니다. output-styles
---
name: Diagrams first
description: Lead every explanation with a diagram
keep-coding-instructions: true
---

When explaining code, architecture, or data flow, start with a Mermaid diagram
showing the structure, then explain in prose.

## Diagram conventions

Use `flowchart TD` for control flow and `sequenceDiagram` for request paths.
Keep diagrams under 15 nodes.

공식적용 범위도 알아 둡니다. 출력 스타일은 메인 대화에만 적용됩니다. 서브에이전트는 자기 시스템 프롬프트로 돌기 때문입니다. 예외는 포크로, 부모의 전체 시스템 프롬프트를 상속합니다. 토큰 비용은 스타일에 따라 다릅니다. 시스템 프롬프트에 지시를 더하면 입력 토큰이 늘지만 프롬프트 캐싱이 첫 요청 이후 비용을 줄입니다. 내장 Explanatory와 Learning은 설계상 기본보다 긴 응답을 내므로 출력 토큰이 늘어납니다. output-styles

공식비슷한 기능과의 갈림입니다. 출력 스타일은 시스템 프롬프트를 직접 수정하고 모든 응답에 적용됩니다. 나머지는 기본 시스템 프롬프트를 바꾸지 않고 지시를 더하거나, 특정 작업으로 범위를 좁힙니다. output-styles

기능작동 방식쓸 때
출력 스타일시스템 프롬프트를 수정매 턴 다른 역할·어조·기본 응답 형식을 원할 때
CLAUDE.md시스템 프롬프트 뒤에 사용자 메시지를 더함클로드가 항상 프로젝트 관례와 코드베이스 맥락을 알아야 할 때
--append-system-prompt아무것도 제거하지 않고 시스템 프롬프트에 덧붙임단일 실행의 일회성 추가
서브에이전트자체 시스템 프롬프트·모델·도구로 서브에이전트를 실행집중된 작업을 위한 별도 범위의 조수
스킬호출되거나 관련될 때 작업별 지시를 로드재사용 워크플로가 있을 때

22.2상태줄

공식상태줄은 클로드코드 하단의 바이며 내가 구성한 아무 셸 스크립트나 실행합니다. stdin으로 JSON 세션 데이터를 받고 스크립트가 출력한 것을 그대로 표시합니다. 컨텍스트 사용량·비용·git 상태를 상시로 보는 데 씁니다. 내장 푸터 배지 위의 자기 줄에 렌더되며 배지를 대체하지 않습니다. 다만 커스텀 상태줄을 두면 esc to interrupt 같은 대부분의 키보드 힌트가 사라집니다. statusline

공식가장 쉬운 방법은 /statusline에 자연어로 원하는 것을 말하는 것입니다. 클로드코드가 ~/.claude/에 스크립트 파일을 만들고 설정을 자동으로 갱신합니다. statusline

/statusline show model name and context percentage with a progress bar

공식직접 구성하려면 statusLine 필드를 씁니다. type을 "command"로 두고 command에 스크립트 경로나 인라인 셸 명령을 지정합니다. statusline

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}

공식선택 필드가 셋 있습니다. padding은 가로 여백을 문자 수로 더합니다(기본 0). refreshInterval은 이벤트 기반 갱신에 더해 N초마다 다시 돌립니다(최소 1). 시계처럼 시간 기반 데이터를 보일 때, 또는 메인 세션이 유휴인 동안 백그라운드 서브에이전트가 git 상태를 바꿀 때 씁니다. hideVimModeIndicator는 내장 -- INSERT -- 표시를 숨깁니다. statusline

공식갱신 시점은 정해져 있습니다. 세션이 시작될 때(재개 포함) 한 번 돌고, 그 뒤에는 새 어시스턴트 메시지가 도착할 때, /compact가 끝날 때, 권한 모드가 바뀔 때, vim 모드가 토글될 때, 그리고 refreshInterval 타이머가 지날 때입니다. 갱신은 300밀리초로 디바운스되며, 스크립트가 도는 중에 새 갱신이 발생하면 진행 중인 스크립트를 취소합니다. statusline

공식stdin으로 오는 JSON에서 자주 쓰는 필드입니다. statusline

필드내용
model.id · model.display_name현재 모델 식별자와 표시 이름
workspace.current_dir · workspace.project_dir현재 작업 디렉터리 / 클로드코드를 시작한 디렉터리
workspace.git_worktree연결된 워크트리 안이면 워크트리 이름. 메인 워크트리에서는 없음
context_window.used_percentage · remaining_percentage미리 계산된 컨텍스트 사용·잔여 비율
context_window.context_window_size최대 컨텍스트 크기. 기본 200000, 확장 컨텍스트 모델은 1000000
cost.total_cost_usd클라이언트에서 계산한 추정 세션 비용. 실제 청구와 다를 수 있고 /clear로 새 세션이 되면 0으로 초기화
cost.total_duration_ms · total_api_duration_ms세션 시작 후 총 시간 / API 응답 대기 시간
cost.total_lines_added · total_lines_removed변경된 코드 줄 수
effort.level · thinking.enabled · fast_mode현재 노력 수준 / 확장 사고 여부 / 패스트 모드 여부
rate_limits.five_hour.used_percentage · seven_day5시간·7일 사용 한도 소비 비율(0~100)과 초기화 시각
session_id · session_name · version세션 식별자 / 세션 이름 / 클로드코드 버전
output_style.name · vim.mode · agent.name현재 출력 스타일 / vim 모드 / --agent 실행 시 에이전트 이름
pr.number · pr.url · pr.review_state현재 브랜치의 열린 PR과 리뷰 상태
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

echo "[$MODEL] ${DIR##*/} | ${PCT}% context"

공식출력에 쓸 수 있는 것은 셋입니다. 여러 줄(각 echo가 한 행), 색(ANSI 이스케이프 코드), 링크(OSC 8 시퀀스, iTerm2·Kitty·WezTerm 같은 지원 터미널에서 클릭 가능)입니다. 터미널 폭에 맞추려면 tput cols가 아니라 환경 변수 COLUMNS와 LINES를 읽습니다. 클로드코드가 스크립트 출력을 캡처하므로 스크립트 안에서는 터미널 크기를 직접 읽을 수 없습니다. statusline

상태줄은 토큰을 쓰지 않습니다. 공식로컬에서 돌고 API 토큰을 소비하지 않습니다. 자동완성 제안·도움말 메뉴·권한 프롬프트 같은 일부 UI 상호작용 중에는 일시적으로 숨습니다. statusline

관행상태줄에 넣을 것을 고를 때 기준이 하나 있습니다. 그 값을 보고 지금 행동을 바꿀 수 있는가입니다. 컨텍스트 사용률은 세션을 나눌 판단을 바꾸므로 값을 합니다(12장). 반면 누적 비용은 보고 나서 할 수 있는 일이 없으면 자리만 차지합니다. 이 편의 다른 것과 달리 상태줄은 상시 보이는 표면이라 넣은 만큼 매번 읽게 됩니다.

22.3키바인딩

공식/keybindings를 실행하면 ~/.claude/keybindings.json을 만들거나 엽니다. 파일은 bindings 배열을 가진 객체이고, 각 블록이 컨텍스트와 키 조합 대 동작의 맵을 지정합니다. 파일 변경은 재시작 없이 자동 감지됩니다. keybindings

{
  "$schema": "https://www.schemastore.org/claude-code-keybindings.json",
  "bindings": [
    {
      "context": "Chat",
      "bindings": {
        "ctrl+e": "chat:externalEditor",
        "ctrl+u": null
      }
    }
  ]
}

공식컨텍스트는 그 바인딩이 적용되는 자리입니다. Global(앱 전역), Chat(메인 입력창), Autocomplete, Settings, Confirmation(권한·확인 대화), Tabs, Help, Transcript, HistorySearch, Task, ThemePicker, Attachments, Footer, MessageSelector, DiffDialog, ModelPicker, Select, Plugin, Scroll이 있습니다. keybindings

공식동작은 namespace:action 형식입니다. 자주 손대는 것 몇 개입니다. keybindings

동작기본내용
app:toggleTodosCtrl+T클로드의 할 일 체크리스트 표시 전환
app:toggleTranscriptCtrl+O상세 전사 전환
chat:submit · chat:newlineEnter · Ctrl+J메시지 전송 / 전송 없이 줄바꿈
chat:externalEditorCtrl+G, Ctrl+X Ctrl+E외부 편집기에서 열기
chat:cycleModeShift+Tab권한 모드 순환
chat:killAgentsCtrl+X Ctrl+K이 세션의 백그라운드 서브에이전트 전부 중지
chat:stashCtrl+S현재 프롬프트 임시 저장
task:backgroundCtrl+B, Ctrl+X Ctrl+B현재 작업을 백그라운드로. 후자는 tmux 접두어 충돌을 피한다
history:searchCtrl+R히스토리 검색 열기
confirm:toggleExplanationCtrl+EBash·PowerShell 권한 프롬프트에서 명령 설명 전환

공식키 표기법은 +로 수정자를 잇습니다. ctrl, shift, alt(opt·option·meta), cmd(command·super·win)입니다. 다만 cmd 계열은 Super 수정자를 보고하는 터미널에서만 감지되므로, 어디서나 되게 하려면 ctrl이나 meta를 씁니다. 단독 대문자는 Shift를 함의하므로 K는 shift+k와 같지만, 수정자가 붙은 대문자는 함의하지 않아 ctrl+K는 ctrl+k와 같습니다. 공백으로 구분하면 코드가 됩니다(ctrl+k ctrl+s). keybindings

공식기본 단축키를 해제하려면 동작 자리에 null을 둡니다. 코드 바인딩도 같습니다. 어떤 접두어를 단독 키로 되찾으려면 그 접두어를 공유하는 코드를 전부 해제해야 하며, 활성 컨텍스트에 코드가 하나라도 남아 있으면 접두어가 예약된 상태로 유지됩니다. keybindings

재바인딩 불가이유
Ctrl+C하드코딩된 인터럽트·취소
Ctrl+D하드코딩된 종료
Ctrl+M터미널에서 Enter와 동일(둘 다 CR을 보낸다)
Caps Lock터미널 앱에 전달되지 않는다
터미널 멀티플렉서와 충돌합니다. 공식Ctrl+B는 tmux 접두어(두 번 눌러야 전달), Ctrl+A는 GNU screen 접두어, Ctrl+Z는 유닉스 프로세스 중단(SIGTSTP)입니다. 클로드코드는 파일을 로드할 때 파싱 오류·잘못된 컨텍스트 이름·예약 단축키 충돌·멀티플렉서 충돌·같은 컨텍스트 내 중복 바인딩에 대해 경고를 표시하고 디버그 로그에 씁니다. keybindings

공식vim 모드와는 독립적으로 동작합니다. vim 모드는 텍스트 입력 수준(커서 이동·모드·모션)을, 키바인딩은 컴포넌트 수준(할 일 전환·전송)을 다룹니다. vim 모드의 Escape는 INSERT에서 NORMAL로 바꾸며 chat:cancel을 발동시키지 않습니다. vim 키는 이 파일로 재매핑할 수 없고, INSERT 모드의 jj 같은 두 키 시퀀스를 Escape에 매핑하려면 vimInsertModeRemaps 설정을 씁니다. keybindings

실전이 볼트는 키바인딩 파일을 두지 않았습니다(~/.claude/keybindings.json 없음). 이 편의 다른 수단과 달리 키바인딩은 없어도 마찰이 없으면 만들 이유가 없는 쪽입니다. 실제로 손이 가는 것은 대개 하나뿐입니다. tmux를 쓰면 Ctrl+B가 겹치므로 task:background를 코드 형태(Ctrl+X Ctrl+B)로 쓰거나 다른 키로 옮기는 것입니다. 그것도 이제 기본값에 코드가 함께 들어 있어 손댈 일이 줄었습니다.


23

플러그인

23.1플러그인이 담는 것

공식플러그인은 포장 층입니다. 스킬·에이전트·훅·MCP 서버를 하나의 설치 단위로 묶어 프로젝트와 팀에 걸쳐 공유합니다. 독립 구성(.claude/ 디렉터리)과의 갈림은 목적입니다. plugins

방식스킬 이름맞는 상황
독립(.claude/)/hello개인 워크플로, 프로젝트 한정 커스터마이징, 빠른 실험
플러그인/plugin-name:hello팀 공유, 커뮤니티 배포, 버전 릴리스, 프로젝트 간 재사용

공식공식 권고는 .claude/에서 빠르게 반복하다가 공유할 준비가 됐을 때 플러그인으로 바꾸는 것입니다. plugins

공식플러그인 루트에 둘 수 있는 디렉터리 전량입니다. plugins

디렉터리·파일담는 것
.claude-plugin/plugin.json매니페스트. 컴포넌트가 기본 위치를 쓰면 선택
skills/<name>/SKILL.md 디렉터리 형태의 스킬
commands/평평한 마크다운 파일 형태의 스킬. 새 플러그인은 skills/를 쓴다
agents/커스텀 에이전트 정의
hooks/hooks.json이벤트 핸들러
.mcp.jsonMCP 서버 구성
.lsp.json코드 인텔리전스용 LSP 서버 구성
monitors/monitors.json백그라운드 모니터 구성
bin/플러그인이 켜진 동안 Bash 도구의 PATH에 추가되는 실행 파일
settings.json플러그인이 켜질 때 적용되는 기본 설정(agent·subagentStatusLine 키만)
가장 흔한 실수는 위치입니다. 공식commands/·agents/·skills/·hooks/를 .claude-plugin/ 안에 두지 않습니다. .claude-plugin/에는 plugin.json만 들어가고 나머지는 모두 플러그인 루트에 둡니다. 그리고 플러그인 루트는 개별 플러그인 자신의 디렉터리이며 절대 ~/.claude/가 아닙니다. plugins

공식매니페스트의 필수 필드는 사실상 name과 description입니다. name은 고유 식별자이자 스킬 이름공간이고, version은 선택인데 설정하면 이 필드를 올릴 때만 사용자에게 갱신이 갑니다. plugins

{
  "name": "my-first-plugin",
  "description": "A greeting plugin to learn the basics",
  "version": "1.0.0",
  "author": { "name": "Your Name" }
}

공식스킬 하나만 담는 플러그인은 skills/를 만들지 않고 SKILL.md를 플러그인 루트에 바로 둘 수 있습니다. 그때는 프론트매터 name이 호출 이름이 됩니다. 두 개 이상으로 자랄 가능성이 있으면 skills/ 배치를 씁니다. plugins

23.2설치와 마켓플레이스

공식마켓플레이스는 남이 만들어 공유한 플러그인 카탈로그입니다. 쓰는 절차는 두 단계입니다. 마켓플레이스를 추가해 카탈로그를 등록하고(이때 아무것도 설치되지 않습니다), 그다음 원하는 플러그인을 설치합니다. discover-plugins

공식공식 Anthropic 마켓플레이스(claude-plugins-official)는 처음 대화형으로 시작할 때 자동 추가됩니다. 추가되지 않았다면 직접 추가합니다. discover-plugins

/plugin marketplace add anthropics/claude-plugins-official
/plugin install github@claude-plugins-official

공식추가 소스는 네 종류입니다. GitHub 저장소(owner/repo), git URL(GitLab·Bitbucket·자체 호스팅 포함), 로컬 경로, 그리고 호스팅된 marketplace.json의 원격 URL입니다. git URL은 .git 접미어와 https:// 접두어를 붙입니다. 접두어 없이 쓰면 GitHub owner/repo 약칭으로 잘못 읽혀 거부됩니다. 특정 브랜치나 태그는 # 뒤에 붙입니다. discover-plugins

/plugin marketplace add anthropics/claude-code                       GitHub
/plugin marketplace add https://gitlab.com/company/plugins.git       git URL
/plugin marketplace add https://gitlab.com/company/plugins.git#v1.0.0 태그 지정
/plugin marketplace add ./my-marketplace                             로컬 경로
/plugin marketplace add https://example.com/marketplace.json         원격 URL

공식/plugin은 탭 네 개짜리 패널을 엽니다. Discover(모든 마켓플레이스의 플러그인 탐색), Installed(설치된 것 관리), Marketplaces(추가·제거·갱신), Errors(로딩 오류)입니다. 상세 창은 설치 전에 세 가지를 보여 줍니다. 매 턴 컨텍스트에 더할 토큰의 Context cost 추정, Last updated 날짜, 그리고 무엇이 추가되는지 열거하는 Will install 섹션입니다. discover-plugins

공식설치 범위는 셋입니다. 사용자(모든 프로젝트에서 나만), 프로젝트(이 저장소의 모든 협업자, .claude/settings.json에 추가됨), 로컬(이 저장소에서 나만). 관리자가 관리형 설정으로 설치한 managed 범위도 있으며 수정할 수 없습니다. discover-plugins

공식설치 요약이 세션 반영 여부를 알려 줍니다. Plugin is now active.면 이미 활성이고, Run /reload-plugins to activate.면 활성화가 프롬프트 캐시를 무효화하거나 시도가 실패한 것이니 그 명령을 돌립니다. 재적용이 캐시를 무효화하는 경우에는 경고와 함께 건너뛰므로 --force로 다시 돌립니다. discover-plugins

/plugin list                          설치 목록(--enabled·--disabled로 필터)
/plugin disable name@marketplace      제거하지 않고 끄기
/plugin enable name@marketplace       다시 켜기
/plugin uninstall name@marketplace    완전 제거
/plugin marketplace update <name>     카탈로그 갱신
/reload-plugins                       재시작 없이 변경 적용
안 쓰는 플러그인을 찾아 줍니다. 공식클로드코드는 직접 설치한 마켓플레이스 플러그인 중 최소 10세션에 걸쳐 2주 이상 쓰지 않은 것을 Not used recently 헤더 아래 모아 보여 주고, 상세에 Last used를 표시합니다. 쓰지 않는데도 시작·컨텍스트 비용을 계속 내는 것을 찾아 끄거나 지우는 데 씁니다. 조직이 관리하는 플러그인과 --plugin-dir로 로드한 것, 그리고 테마·출력 스타일·모니터·워크플로를 제공하는 플러그인은 이 목록에 오르지 않습니다. discover-plugins

공식자동 갱신은 마켓플레이스별로 켜고 끕니다. 켜져 있으면 세션 시작 후 최대 10분의 무작위 지연을 두고 카탈로그와 설치된 플러그인을 갱신하므로, 도는 세션은 시작 시 로드한 버전을 계속 씁니다. 갱신되면 /reload-plugins를 권하는 알림이 뜨거나 다음 실행에서 새 버전이 로드됩니다. 공식 마켓플레이스는 기본 켜짐, 서드파티와 로컬 개발 마켓플레이스는 기본 꺼짐입니다. discover-plugins

플러그인은 신뢰 대상입니다. 공식플러그인과 마켓플레이스는 내 사용자 권한으로 임의 코드를 실행할 수 있는 고신뢰 컴포넌트입니다. 신뢰하는 출처에서만 설치합니다. Anthropic은 플러그인에 어떤 MCP 서버·파일·소프트웨어가 들어 있는지 통제하지 않고 의도대로 동작하는지도 검증하지 않습니다. 조직은 strictKnownMarketplaces로 추가 가능한 마켓플레이스를 제한할 수 있습니다. discover-plugins

공식마켓플레이스를 제거하면 그것으로 설치한 플러그인이 모두 제거됩니다. 플러그인 스킬이 안 보이면 rm -rf ~/.claude/plugins/cache로 캐시를 비우고 재시작한 뒤 다시 설치합니다. discover-plugins

실전이 볼트에는 플러그인 2개가 사용자 범위로 설치돼 있습니다. 공식 마켓플레이스의 하나와, 직접 만든 git 마켓플레이스의 하나입니다. 설치 대장(~/.claude/plugins/installed_plugins.json)에 버전·설치 시각·gitCommitSha가 함께 기록돼 있어 무엇이 언제 어느 커밋으로 들어왔는지가 남습니다. 활성화는 별도로 ~/.claude/settings.json의 enabledPlugins에 "name@marketplace": true 형태로 기록됩니다. 즉 설치와 활성화가 다른 파일이고, 설치돼 있는데 꺼져 있는 상태가 가능합니다.

python3 -c "
import json, os
p = os.path.expanduser('~/.claude/plugins/installed_plugins.json')
d = json.load(open(p))
for name, vs in d['plugins'].items():
    for v in vs:
        print(name, '|', v['version'], '|', v['scope'], '|', v['installedAt'][:10])
"

23.3직접 만들기

실습

플러그인 하나를 만들어 로컬에서 돌리기

  1. 디렉터리를 만듭니다. 위치는 아무 곳이나 됩니다. mkdir my-first-plugin
  2. 매니페스트를 만듭니다. mkdir my-first-plugin/.claude-plugin 뒤에 plugin.json을 씁니다.
  3. 스킬을 더합니다. mkdir -p my-first-plugin/skills/hello 뒤에 SKILL.md를 씁니다.
  4. claude --plugin-dir ./my-first-plugin으로 실행하고 /my-first-plugin:hello를 부릅니다.
  5. 고친 뒤에는 /reload-plugins로 재시작 없이 반영합니다.

완료 판정. /help의 Custom commands 탭에 플러그인 이름공간 아래로 스킬이 보입니다.

/reload-plugins의 스킬 개수는 믿지 마세요. 공식요약의 스킬 개수는 각 플러그인의 commands/ 디렉터리만 셉니다. 그래서 skills/의 스킬이 정상적으로 다시 로드됐어도 0 skills로 보고할 수 있습니다. plugins

공식매번 --plugin-dir를 붙이는 대신 스킬 디렉터리에서 개발할 수도 있습니다. claude plugin init my-tool이 ~/.claude/skills/my-tool/에 매니페스트와 시작용 SKILL.md를 만들고, 다음 세션에서 마켓플레이스나 설치 단계 없이 my-tool@skills-dir로 로드됩니다. plugins

공식테스트 플래그가 셋 있습니다. --plugin-dir는 디렉터리나 .zip 아카이브를 받고 여러 번 반복해 여러 플러그인을 로드합니다. 설치된 마켓플레이스 플러그인과 이름이 같으면 그 세션에서는 로컬 사본이 우선하므로 설치를 지우지 않고 변경을 테스트할 수 있습니다(관리형 설정이 강제한 플러그인은 예외). URL에 호스팅된 .zip은 --plugin-url로 그 세션 동안만 로드합니다. plugins

claude --plugin-dir ./my-plugin
claude --plugin-dir ./my-plugin.zip
claude --plugin-dir ./plugin-one --plugin-dir ./plugin-two
claude plugin validate ./my-plugin

공식이미 .claude/에 있는 것을 플러그인으로 옮기는 절차도 정해져 있습니다. 매니페스트를 만들고, commands·agents·skills 디렉터리를 플러그인 루트로 복사하고, 훅은 settings.json의 hooks 객체를 그대로 hooks/hooks.json으로 옮깁니다(형식이 같습니다). 옮긴 뒤에는 원본을 지워 중복을 없앱니다. plugins

이관 뒤 원본을 지워야 플러그인 쪽이 적용됩니다. 공식프로젝트와 사용자 .claude/agents/ 정의는 같은 이름의 플러그인 에이전트를 덮습니다. 그래서 원본을 지우기 전까지 플러그인 버전은 적용되지 않습니다. 반면 플러그인 스킬은 /plugin-name:skill-name으로 이름공간이 붙으므로 원래 /skill-name과 플러그인 사본이 둘 다 남습니다. plugins

공식디버깅은 셋입니다. 디렉터리가 .claude-plugin/ 안이 아니라 플러그인 루트에 있는지 확인하고, 스킬·에이전트·훅을 개별로 시험하고, 검증·디버깅 도구를 씁니다. 에이전트는 /context의 Custom Agents에 나타나는지로 확인하고, 훅은 그 이벤트를 실제로 발생시켜 효과를 확인합니다. plugins

23.4마켓플레이스 운영

공식마켓플레이스는 .claude-plugin/marketplace.json 하나입니다. 필수 필드는 셋입니다. plugin-marketplaces

필드내용
namekebab-case 식별자. 공개 이름이며 사용자가 /plugin install my-tool@your-marketplace로 볼 값. 사용자별로 한 이름에 하나만 등록되고, 같은 이름을 다시 추가하면 앞의 것을 대체한다
owner유지관리자 정보. name 필수, email·url 선택
plugins플러그인 목록. 항목마다 name과 source가 필수

공식선택 필드 중 실무에 쓸 만한 것이 넷 있습니다. metadata.pluginRoot는 상대 소스 경로에 붙는 기본 디렉터리라 "./plugins"로 두면 항목마다 "source": "formatter"로 짧게 쓸 수 있습니다. renames는 옛 플러그인 이름을 현재 이름(또는 제거됐으면 null)으로 매핑해 기존 사용자를 자동 이전시킵니다. allowCrossMarketplaceDependenciesOn은 이 마켓플레이스의 플러그인이 의존할 수 있는 다른 마켓플레이스를 열거하며, 목록에 없는 곳의 의존은 설치 시 차단됩니다. $schema는 편집기 자동완성용이고 로드 시 무시됩니다. plugin-marketplaces

공식플러그인 항목에는 매니페스트 스키마의 아무 필드나 넣을 수 있고, 여기에 마켓플레이스 전용 필드가 더해집니다. source, category, tags, strict, relevance입니다. 그 밖에 displayName(UI 표시명), defaultEnabled(false면 설치 후 꺼진 상태로 두고 사용자가 켜게 함), version(설정하면 그 문자열로 고정되고 값이 바뀔 때만 갱신이 전달됨)이 자주 쓰입니다. plugin-marketplaces

예약된 이름이 있습니다. 공식claude-plugins-official, claude-plugins-community, claude-community, anthropic-plugins 등은 공식 용도로 예약돼 서드파티가 쓸 수 없습니다. official-claude-plugins처럼 공식을 사칭하는 이름도 차단됩니다. 예약 검사는 추가할 때만이 아니라 로드할 때마다 다시 돌기 때문에, 나중에 예약된 이름으로 이미 등록해 둔 마켓플레이스는 로딩이 멈추고 신뢰할 수 없는 출처로 보고됩니다. 다른 이름으로 다시 추가하면 됩니다. plugin-marketplaces

공식팀 단위로는 프로젝트 .claude/settings.json에 extraKnownMarketplaces를 두면 팀원이 저장소 폴더를 신뢰할 때 설치를 권합니다. 관리자는 각 항목에 "autoUpdate": true를 둬서 사용자마다 토글하지 않아도 자동 갱신을 켤 수 있습니다. discover-plugins

{
  "extraKnownMarketplaces": {
    "my-team-tools": {
      "source": { "source": "github", "repo": "your-org/claude-plugins" }
    }
  }
}

실전이 볼트는 실제로 자체 마켓플레이스를 하나 운영하고 있습니다. 사용자 설정의 extraKnownMarketplaces에 git 소스로 등록해 두고, 거기서 플러그인 하나를 설치해 씁니다. 그 marketplace.json을 열어 보면 실제로 쓰이는 필드가 많지 않았습니다. 최상위는 name·description·owner{name,url}·plugins 넷이고, 각 항목은 name·description·source·category·tags 다섯입니다. source는 전부 "./plugins/<이름>" 상대 경로이고 version은 항목에 없습니다.

{
  "name": "<마켓플레이스 이름>",
  "description": "...",
  "owner": { "name": "...", "url": "https://github.com/..." },
  "plugins": [
    {
      "name": "docs-guide",
      "description": "...",
      "source": "./plugins/docs-guide",
      "category": "development",
      "tags": ["documentation", "llms-txt", "official-docs", "guide"]
    }
  ]
}

실전여기서 배운 것 둘입니다. 첫째, 항목에 version을 안 쓰면 갱신 시점을 내가 통제하지 못합니다. 설치 대장에는 gitCommitSha가 기록되므로 커밋을 밀면 갱신 대상이 됩니다. 릴리스 단위로 배포하고 싶으면 version을 명시하는 편이 낫습니다. 둘째, 서드파티 마켓플레이스는 자동 갱신이 기본 꺼짐이라(공식만 켜짐) 내가 커밋을 밀어도 사용자 쪽은 /plugin marketplace update를 돌릴 때까지 예전 것을 씁니다. 내 마켓플레이스를 남에게 쓰게 하려면 이 사실을 README에 적어 두는 것이 필요했습니다.

실전설치된 플러그인의 구조도 실제로 열어 봤습니다. 스킬만 제공하는 플러그인이라 skills/와 설치용 setup/, 그리고 언어별 README 다섯 개만 있었습니다. 훅도 MCP도 없습니다. 즉 플러그인이라고 해서 전부를 담을 필요가 없습니다. 스킬 하나를 여러 프로젝트에서 쓰고 싶다는 이유만으로 플러그인이 될 수 있습니다.

공식 마켓플레이스에 무엇이 있는지 알아 두면 직접 만들 일이 줄어듭니다. 공식코드 인텔리전스 11종(C/C++·C#·Go·자바·코틀린·루아·PHP·파이썬·러스트·스위프트·타입스크립트, 각각 언어 서버 바이너리를 따로 설치해야 합니다), 외부 연동(github·gitlab·atlassian·asana·linear·notion·figma·vercel·firebase·supabase·slack·sentry), 보안 검토(security-guidance), 개발 워크플로(commit-commands·pr-review-toolkit·agent-sdk-dev·plugin-dev), 출력 스타일 2종이 있습니다. discover-plugins

24

MCP: 외부 도구 연결

24.1MCP가 무엇을 해결하나

개념

MCP(Model Context Protocol)

AI와 도구를 잇는 오픈소스 표준입니다. MCP 서버가 클로드코드에 내 도구·데이터베이스·API 접근을 제공합니다. 붙일 시점의 신호는 하나입니다. 다른 도구에서 데이터를 대화로 복사해 붙이고 있을 때입니다. 연결하면 붙여넣은 것으로 일하는 대신 그 시스템을 직접 읽고 조작합니다.

공식공식 문서가 드는 용례입니다. 이슈 트래커의 기능을 구현하고 PR을 만들기, 모니터링 데이터를 분석하기, 데이터베이스를 질의하기, 피그마 디자인을 반영하기, 메일 초안을 만들기, 그리고 외부 이벤트에 반응하기입니다. 마지막 것은 MCP 서버가 채널로 동작해 텔레그램·디스코드 메시지나 웹훅 이벤트를 세션에 밀어 넣는 형태입니다. mcp

공식18장의 갈림을 다시 확인해 둡니다. MCP는 연결이고 스킬은 그 연결을 잘 쓰는 법입니다. MCP 서버가 데이터베이스에 연결하고, 스킬이 데이터 모델과 흔한 질의 패턴을 가르칩니다. 둘은 함께 씁니다. features-overview

24.2서버 붙이기

공식전송 방식은 네 가지입니다. 원격 서버에는 HTTP가 권장이고 클라우드 서비스에서 가장 널리 지원됩니다. SSE는 폐기됐지만 일부 서비스가 아직 그것만 노출합니다. stdio는 로컬 프로세스로 도는 방식이라 시스템 접근이나 커스텀 스크립트가 필요한 도구에 맞습니다. WebSocket은 지속 양방향 연결로 서버가 먼저 이벤트를 밀어야 할 때 쓰며, OAuth와 --transport 플래그를 지원하지 않아 헤더 인증만 가능합니다. mcp

claude mcp add --transport http notion https://mcp.notion.com/mcp
claude mcp add --transport http secure-api https://api.example.com/mcp \
  --header "Authorization: Bearer your-token"
claude mcp add --transport sse asana https://mcp.asana.com/sse
claude mcp add --env AIRTABLE_API_KEY=YOUR_KEY --transport stdio airtable \
  -- npx -y airtable-mcp-server
stdio 서버는 --로 인자를 갈라야 합니다. 공식-- 뒤의 모든 것이 서버로 그대로 넘어갑니다. 없으면 클로드코드가 서버의 --port 같은 플래그를 자기 옵션으로 파싱하려 합니다. 그리고 --env 바로 뒤에 서버 이름을 두면 CLI가 그것을 또 하나의 KEY=value로 읽어 거부하므로, --env와 이름 사이에 다른 옵션을 하나 둡니다. mcp

공식JSON으로 구성할 때 type 필드는 streamable-http를 http의 별칭으로 받습니다. MCP 명세가 이 전송을 그 이름으로 부르기 때문에, 서버 문서에서 복사한 구성이 수정 없이 동작합니다. 반대로 url은 있는데 type이 없는 항목은 구성 오류입니다. 클로드코드가 type 없는 항목을 stdio 서버로 읽기 때문이고, 그 서버를 건너뛰며 has a "url" but no "type" 오류를 보고합니다. mcp

공식스코프는 셋이고, 어느 프로젝트에서 로드되는지와 팀 공유 여부가 다릅니다. mcp

스코프로드되는 곳팀 공유저장 위치
로컬(기본값)추가한 프로젝트만아니오~/.claude.json의 그 프로젝트 항목
프로젝트추가한 프로젝트만예, 버전 관리로프로젝트 루트의 .mcp.json
사용자내 모든 프로젝트아니오~/.claude.json
MCP의 "로컬 스코프"는 일반 로컬 설정과 다릅니다. 공식MCP 로컬 스코프 서버는 홈 디렉터리의 ~/.claude.json에 저장되고, 일반 로컬 설정은 프로젝트 디렉터리의 .claude/settings.local.json을 씁니다. 이름만 같고 파일이 다릅니다. mcp

공식같은 서버가 여러 곳에 정의되면 한 번만 연결하며 우선순위가 가장 높은 정의를 씁니다. 순서는 로컬 → 프로젝트 → 사용자 → 플러그인 제공 서버 → claude.ai 커넥터입니다. 필드가 스코프 간에 병합되지 않고 그 출처의 항목 전체가 쓰입니다. 앞의 세 스코프는 이름으로 중복을 판정하고, 플러그인과 커넥터는 엔드포인트로 판정합니다. mcp

공식프로젝트 스코프에는 승인 절차가 있습니다. 보안상 .mcp.json의 서버를 쓰기 전에 대화형 세션에서 승인을 묻습니다. 승인 선택을 초기화하려면 claude mcp reset-project-choices입니다. 다만 claude -p 실행, Agent SDK 세션, 클라우드 세션은 그 프롬프트를 띄울 수 없어 묻지 않고 로드합니다. 그래도 막으려면 disabledMcpjsonServers에 넣습니다(모든 모드에서 차단). mcp

공식.mcp.json은 환경 변수 확장을 지원합니다. ${VAR}와 ${VAR:-default} 문법을 command·args·env·url·headers에서 쓸 수 있어, 팀이 구성을 공유하면서 기기별 경로와 API 키를 각자 두게 합니다. 변수가 설정되지 않고 기본값도 없으면 구성은 그대로 로드되고 claude mcp list에 누락 경고가 나며 ${VAR} 텍스트가 그대로 쓰입니다. mcp

{
  "mcpServers": {
    "api-server": {
      "type": "http",
      "url": "${API_BASE_URL:-https://api.example.com}/mcp",
      "headers": { "Authorization": "Bearer ${API_KEY}" }
    }
  }
}

공식stdio 서버에는 편의가 하나 더 있습니다. 클로드코드가 서버 환경에 CLAUDE_PROJECT_DIR를 프로젝트 루트로 설정하므로, 서버가 작업 디렉터리에 의존하지 않고 프로젝트 상대 경로를 해석할 수 있습니다(노드는 process.env.CLAUDE_PROJECT_DIR, 파이썬은 os.environ["CLAUDE_PROJECT_DIR"]). 단 이 변수는 서버의 환경에 설정되고 클로드코드 자신의 환경에는 없으므로, .mcp.json의 command나 args에서 ${...} 확장으로 참조하려면 ${CLAUDE_PROJECT_DIR:-.}처럼 기본값을 둬야 합니다. mcp

claude mcp list             전체 서버와 연결 상태
claude mcp get notion       특정 서버 상세
claude mcp remove notion    제거
/mcp                        세션 안에서 상태 확인

공식claude mcp add는 Added ... 줄로 구성이 기록됐다는 것만 확인해 줍니다. 실제 연결 상태는 claude mcp list가 서버마다 Connected·Needs authentication·Failed to connect(각각 앞에 상태 기호가 붙습니다)로 보여 줍니다. 실패 상태는 그 서버에 연결하지 못했다는 뜻이고 list 명령이 실패한 것이 아닙니다. mcp

실전이 볼트는 MCP 서버를 하나만 씁니다. 사용자 스코프 stdio 서버이고 구성은 네 줄입니다. type: "stdio", 로컬 바이너리 command, args: ["mcp"], 빈 env입니다. 프로젝트 .mcp.json은 없고, ~/.claude.json의 프로젝트 항목에서 enabledMcpjsonServers와 disabledMcpjsonServers가 둘 다 빈 배열이었습니다. 즉 승인·거부 목록이 비어 있는 상태이며, 프로젝트 스코프 서버를 쓰지 않으니 승인할 것도 없습니다. 자기 상태 확인은 아래로 합니다.

claude mcp list
python3 -c "
import json, os
d = json.load(open(os.path.expanduser('~/.claude.json')))
print('사용자 스코프:', list((d.get('mcpServers') or {}).keys()))
"

24.3인증과 권한

공식많은 클라우드 MCP 서버가 인증을 요구하고, 클로드코드는 OAuth 2.0을 지원합니다. 서버가 401 Unauthorized나 403 Forbidden으로 답하면 인증 필요로 표시됩니다. 이미 로그인한 OAuth 서버가 401을 돌려주면 저장된 토큰을 갱신하고 재연결해 요청을 한 번 재시도하며, 그 재시도까지 실패할 때만 /mcp에 표시합니다. 시작 시 인증이 필요한 서버가 있으면 알림도 띄웁니다. mcp

/mcp                          패널에서 로그인 흐름 실행
claude mcp login sentry       셸에서 직접 OAuth 흐름
claude mcp login sentry --no-browser   브라우저 없이 URL 붙여넣기 방식
claude mcp logout sentry       저장된 자격증명 삭제

공식claude mcp login은 로컬 브라우저가 없는 경우(SSH 세션, 디스플레이 서버 없는 리눅스)를 감지해 브라우저를 열려 하지 않고 인증 URL을 출력합니다. 내 기기에서 그 URL을 열고 리다이렉트된 전체 URL을 프롬프트에 붙여넣습니다. 붙여넣기 단계에 대화형 터미널이 필요하므로 ssh -t로 접속합니다. mcp

비대화 모드에서는 OAuth 흐름을 돌릴 수 없습니다. 공식-p 실행과 Agent SDK 세션에는 /mcp 패널이 없습니다. 도구 검색이 켜져 있으면(기본값) 클로드코드가 그 서버의 도구를 쓸 수 없다는 사실을 클로드에게 알려 주므로, 클로드가 서버가 구성되지 않은 것처럼 답하는 대신 로그인이 필요한 서버 이름을 말할 수 있습니다. 로그인은 대화형 세션에서 마칩니다. mcp

공식직접 headers.Authorization을 구성했는데 서버가 그 헤더를 거부하면, 클로드코드는 OAuth로 넘어가지 않고 연결 실패로 보고합니다. 토큰이 그 MCP 엔드포인트에 유효한지 확인하거나, 헤더를 지워 OAuth 흐름을 쓰게 합니다. mcp

공식권한 규칙 쪽은 L2에서 본 문법을 그대로 씁니다. mcp__puppeteer는 그 서버의 모든 도구, mcp__puppeteer__puppeteer_navigate는 특정 도구입니다. deny 규칙에는 도구 이름 글로브도 되므로 mcp__*로 모든 MCP 도구를 막을 수 있습니다. 반면 allow 규칙의 글로브는 mcp__<server>__ 리터럴 접두어 뒤에만 허용되고 서버 구간에는 글로브를 쓸 수 없습니다. permissions

조직이 ask로 설정한 커넥터 도구는 allow 규칙을 무시합니다. 공식그 도구는 auto와 bypassPermissions 모드에서도 매 호출마다 물어봅니다. dontAsk 모드는 절대 묻지 않으므로 대신 거부합니다. 커넥터 도구는 mcp__claude_ai_<server>__<tool> 형태로 나타납니다. 같은 원리로 MCP 도구에 requiresUserInteraction 표시가 붙어 있으면 분류기를 건너뛰고 직접 물어봅니다. permissions

24.4도구가 많아질 때

공식도구 검색은 도구 정의를 클로드가 필요할 때까지 지연시켜 MCP 맥락 사용량을 낮춥니다. 세션 시작에는 도구 이름과 서버 지시만 로드되므로 MCP 서버를 더 붙여도 컨텍스트 윈도우에 미치는 영향이 작습니다. 클로드코드는 서버당 도구 개수 상한을 두지 않고, 실질 한계는 내 컨텍스트 예산입니다. mcp

공식기본값은 켜짐입니다. 임계 기반 로딩을 원하면 ENABLE_TOOL_SEARCH로 조절합니다. mcp

값동작
(미설정)모든 MCP 도구를 지연시키고 온디맨드로 로드
true모두 지연. 프록시로 베타 헤더를 보내므로 tool_reference를 지원하지 않는 프록시에서는 요청이 실패한다
auto임계 모드. 컨텍스트 윈도우의 10퍼센트 안에 들어가면 미리 로드하고 넘치는 것만 지연
auto:N임계 비율을 직접 지정(0~100). 예: auto:5
false모든 MCP 도구를 미리 로드. 지연 없음

공식도구 검색은 tool_reference 블록을 지원하는 모델이 필요합니다(Sonnet 4.5·Haiku 4.5·Opus 4.5 이후). ANTHROPIC_BASE_URL이 서드파티 호스트를 가리키면 대부분의 프록시가 그 블록을 전달하지 않아 클로드코드가 자동으로 끕니다. CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS를 설정하면 도구 검색이 꺼진 상태로 유지되고 ENABLE_TOOL_SEARCH로도 되돌릴 수 없습니다. mcp

서버를 만드는 쪽이라면 서버 지시가 중요해집니다. 공식도구 검색이 켜지면 서버 지시가 스킬의 설명과 비슷한 역할을 합니다. 어떤 범주의 작업을 다루는지, 언제 내 도구를 찾아야 하는지, 어떤 핵심 기능을 제공하는지를 적습니다. 클로드코드는 도구 설명과 서버 지시를 각각 2KB에서 자르므로 중요한 것을 앞에 둡니다. mcp

공식출력 크기에도 한계가 있습니다. MCP 도구 출력이 1만 토큰을 넘으면 경고를 표시하고, 최대 허용치의 기본값은 2만 5천 토큰이며 MAX_MCP_OUTPUT_TOKENS로 조절합니다. 이 변수는 자기 한계를 선언하지 않은 도구에 적용되고, anthropic/maxResultSizeChars를 선언한 도구는 텍스트 내용에 대해 그 값을 씁니다(하드 상한 50만 자). 이미지 데이터를 돌려주는 도구는 여전히 토큰 한계를 따릅니다. mcp

export MAX_MCP_OUTPUT_TOKENS=50000
claude

공식연결 실패도 클로드에게 전달됩니다. 구성된 서버가 연결에 실패하면 클로드코드가 어느 서버가 실패했고 오류가 무엇인지 알려 주므로(도구 검색 결과에 매칭 도구가 없을 때도 포함) 클로드가 응답에서 연결 실패를 보고합니다. 도구 검색이 없는 구성에서는 이 전달이 되지 않아, 클로드가 그 서버의 도구가 애초에 구성되지 않은 것처럼 답할 수 있습니다. mcp

24.5MCP 고르는 기준

관행판정 질문은 하나입니다. 지금 내가 그 시스템의 데이터를 대화로 복사해 붙이고 있는가. 공식 문서가 드는 계기와 같습니다. 그렇지 않다면 MCP가 해결하는 문제가 아직 없는 것입니다. "붙일 수 있다"와 "붙이면 이득이다"는 다릅니다.

공식비용 면에서는 도구 검색이 예전보다 판단을 쉽게 만들었습니다. 유휴 MCP 도구는 이름만 올라가므로 맥락 소비가 최소입니다. /mcp가 연결 상태와 서버별 토큰 비용을 보여 주고, 안 쓰는 서버는 연결을 끊을 수 있습니다. features-overview

MCP 서버는 샌드박스 밖에서 돕니다. 공식L2의 격리 표를 다시 봅니다. 내장 샌드박스는 Bash 명령만 제한하고 MCP 서버와 훅은 호스트에서 그대로 돕니다. 그래서 MCP 서버를 하나 붙이는 것은 내 권한으로 도는 프로세스를 하나 더 두는 것입니다. 세 겹 모두 격리하려면 샌드박스 런타임이나 컨테이너로 클로드코드 프로세스 자체를 감싸야 합니다. sandbox-environments

관행그래서 실무 기준은 셋으로 좁혀집니다. 첫째, 대체 경로가 없는가. CLI가 있으면 Bash가 더 싸고 빠릅니다(gh가 있는데 GitHub MCP를 붙이는 것이 항상 이득은 아닙니다). 둘째, 인증을 서버가 대신 관리하는가. MCP의 실질 이득이 여기서 가장 큽니다. OAuth와 토큰 갱신을 서버가 처리하면 내가 키를 어디에 둘지 고민하지 않아도 됩니다. 셋째, 출처를 신뢰하는가. 임의 코드가 내 권한으로 돕니다.

실전이 볼트가 서버를 하나만 쓰는 이유가 그 셋입니다. 붙인 하나는 CLI로 대체할 수 없는 브라우저 조작이고, 나머지 필요는 대개 Bash와 훅으로 해결됐습니다. 실제로 파일·git·검색은 내장 도구가 이미 덮고, 반복 절차는 스킬이, 반드시 도는 검사는 훅이 맡고 있습니다. 즉 MCP는 마지막에 남는 것을 붙이는 자리였습니다. 확장 수단 넷 중 무엇으로 풀 수 있는지 순서대로 물어보면 MCP까지 내려오는 경우가 생각보다 적습니다.

여기까지 됐는지 확인
  • /mcp로 지금 연결된 서버와 상태를 확인했습니다.
  • 붙이려는 시스템이 대화로 데이터를 복사하고 있던 곳인지 확인했습니다.
  • 같은 일을 CLI나 훅으로 할 수 있는지 먼저 검토했습니다.
  • 프로젝트 스코프로 붙일 것이면 .mcp.json에 비밀 값이 리터럴로 들어가지 않게 환경 변수 확장을 썼습니다.

25

화면과 컴퓨터를 쓰게 하기

이 장은 표면에 크게 의존합니다. 브라우저 연결은 CLI와 VS Code 확장에서, 컴퓨터 조작은 맥 CLI와 데스크톱 앱에서, iOS 시뮬레이터 창은 데스크톱 앱에서만 동작합니다. 요금제 조건도 각각 다릅니다. 자기 표면에 없는 것은 건너뛰고 읽으면 됩니다.

25.1브라우저 연결

공식클로드코드는 Claude in Chrome 확장과 연동해 CLI나 VS Code 확장에서 브라우저 자동화를 제공합니다. 코드를 빌드한 뒤 맥락을 옮기지 않고 브라우저에서 테스트하고 디버깅합니다. 클로드는 브라우저 작업에 새 탭을 열고 내 브라우저의 로그인 상태를 공유하므로 이미 로그인한 사이트에 접근할 수 있습니다. 동작은 보이는 크롬 창에서 실시간으로 돌고, 로그인 페이지나 CAPTCHA를 만나면 멈추고 직접 처리해 달라고 합니다. chrome

공식전제 조건이 넷입니다. 크로미움 기반 브라우저(크롬·엣지·브레이브·아크·비발디·오페라), Claude in Chrome 확장 1.0.36 이상, 클로드코드, 그리고 직접 Anthropic 요금제(Pro·Max·Team·Enterprise)입니다. /login 로그인도 필요합니다. API 키나 장기 토큰으로 인증하면 확장이 그 자격증명으로 인증할 수 없어 --chrome을 넘겨도 꺼진 상태로 둡니다. Bedrock·Agent Platform·Foundry 같은 서드파티 프로바이더에서는 쓸 수 없고, WSL도 지원되지 않습니다. chrome

claude --chrome        브라우저 연동을 켜고 시작
/chrome                연결 상태·권한 관리·재연결·브라우저 선택

공식상태 패널에 Status: Enabled와 Extension: Installed가 보이면 동작하는 상태입니다. 매 세션 플래그를 붙이지 않으려면 /chrome에서 "Enabled by default"를 고릅니다. 다만 브라우저 도구가 항상 로드되므로 맥락 사용이 늘어납니다. 사이트별 권한은 크롬 확장 설정에서 관리하며 클로드코드가 그것을 상속합니다. chrome

공식플랜 모드에서의 동작이 명확히 갈립니다. 페이지나 브라우저 상태를 읽기만 하는 호출은 프롬프트 없이 돌고(read_page, get_page_text, find, 콘솔·네트워크 읽기, 스크린샷), 상태를 바꾸는 호출은 승인을 묻습니다(클릭·입력·내비게이션·탭 관리·GIF 녹화). 읽기 전용 호출이라도 상태를 바꾸는 입력 플래그를 켜면(createIfEmpty, 콘솔·네트워크 읽기의 clear, 스크린샷의 save_to_disk) 승인을 묻습니다. browser_batch는 안의 모든 동작이 읽기 전용일 때만 프롬프트 없이 돕니다. chrome

공식파일 업로드에는 제약이 셋 있습니다. 세션이 그 파일을 읽을 수 있어야 하므로 Read deny 규칙이 업로드도 막습니다. 한 번에 총 10MB까지입니다. 그리고 하드 링크가 여럿인 파일은 거부되는데 node_modules 같은 패키지 매니저 저장소에서 흔한 경우이므로 복사해서 올립니다. chrome

GIF 녹화는 보이는 전부를 담습니다. 공식로그인된 페이지의 계정 정보까지 포함되므로 팀 밖으로 공유하기 전에 확인합니다. chrome

공식자주 나는 오류 넷과 처방입니다. chrome

오류원인처방
Browser extension is not connected네이티브 메시징 호스트가 확장에 닿지 못함크롬과 클로드코드를 재시작한 뒤 /chrome으로 재연결
/chrome에 Not detected확장이 설치되지 않았거나 꺼져 있음chrome://extensions에서 설치·활성화
No tab available탭이 준비되기 전에 동작을 시도새 탭을 만들고 재시도하게 한다
Receiving end does not exist확장 서비스 워커가 유휴 상태로 감/chrome에서 "Reconnect extension"

공식브라우저가 응답하지 않을 때 가장 먼저 볼 것은 모달 대화입니다. alert·confirm·prompt 같은 자바스크립트 대화가 브라우저 이벤트를 막아 클로드가 명령을 받지 못합니다. 직접 닫고 계속하라고 알려 줍니다. 긴 세션에서 연결이 끊기는 것은 확장 서비스 워커가 유휴로 가는 것이므로 재연결합니다. chrome

25.2컴퓨터 조작

공식컴퓨터 조작은 맥에서 도는 리서치 프리뷰이고 Pro나 Max 요금제가 필요합니다. Team과 Enterprise에서는 쓸 수 없고, 대화형 세션이 필요해 -p 비대화 모드에서는 쓸 수 없습니다. 클로드가 앱을 열고 화면을 조작해 GUI가 필요한 작업을 합니다. computer-use

공식클로드가 도구를 고르는 순서가 정해져 있습니다. 그 서비스의 MCP 서버가 있으면 그것, 셸 명령이면 Bash, 브라우저 작업이고 Claude in Chrome이 있으면 그것, 그 어느 것도 아니면 컴퓨터 조작입니다. 화면 조작은 다른 어떤 것도 닿을 수 없는 것(네이티브 앱, 시뮬레이터, API 없는 도구)에만 씁니다. computer-use

공식켜는 절차는 셋입니다. /mcp에서 내장 computer-use 서버를 찾아 Enable을 고르고(프로젝트별로 유지되므로 한 번만), 맥 권한 두 개를 허용합니다. 손쉬운 사용(클릭·입력·스크롤)과 화면 기록(화면 보기)입니다. 화면 기록 허용 후에는 클로드코드 재시작이 필요할 수 있습니다. computer-use

공식서버를 켰다고 모든 앱 접근이 열리는 것은 아닙니다. 세션에서 특정 앱이 처음 필요할 때 프롬프트가 뜨고, 어느 앱을 조작하려는지, 클립보드 같은 추가 권한을 요구하는지, 작업 중 몇 개의 앱이 숨겨지는지를 보여 줍니다. 승인은 현재 세션 동안만 유효합니다. 접근 범위가 넓은 앱에는 경고가 함께 뜹니다. computer-use

경고해당 앱
셸 접근과 동등터미널·iTerm·VS Code·Warp 등 터미널과 IDE
모든 파일을 읽고 쓸 수 있음파인더
시스템 설정을 바꿀 수 있음시스템 설정

공식통제 수준도 앱 범주에 따라 다릅니다. 브라우저와 트레이딩 플랫폼은 보기만, 터미널과 IDE는 클릭만, 그 외는 전체 통제입니다. computer-use

공식동작 방식에서 알아 둘 것 넷입니다. 한 세션만 가능하며, 첫 컴퓨터 조작 동작부터 그 세션이 종료할 때까지 기기 전역 락을 잡습니다(작업을 마쳐도 풀리지 않습니다). 클로드가 화면을 조작하기 시작하면 다른 앱이 숨겨지고 승인된 앱만 남으며, 내 터미널 창은 보이는 상태로 유지되고 스크린샷에서 제외됩니다(클로드가 자기 출력을 보지 못하게). 스크린샷은 자동으로 축소되므로 해상도를 낮출 필요가 없습니다. 그리고 Esc를 어디서든 눌러 즉시 중단할 수 있습니다. computer-use

샌드박스와 신뢰 경계가 다릅니다. 공식컴퓨터 조작은 샌드박스된 Bash 도구와 달리 실제 데스크톱에서 승인한 앱에 접근해 돕니다. 클로드가 각 동작을 검사하고 화면 콘텐츠의 프롬프트 인젝션 가능성을 표시하지만 신뢰 경계 자체가 다릅니다. 내장 가드레일은 넷입니다. 앱별 승인, 넓은 권한 앱에 대한 경고, 터미널을 스크린샷에서 제외, 그리고 전역 Esc(키 입력이 소비되므로 프롬프트 인젝션이 그것으로 대화를 닫을 수 없습니다). computer-use

공식computer-use가 /mcp에 안 보이면 조건을 확인합니다. 맥인지(CLI에서는 리눅스·윈도우 불가), Pro나 Max인지(/status로 확인), claude.ai로 인증했는지, 그리고 대화형 세션인지입니다. computer-use

25.3iOS 시뮬레이터

공식iOS 시뮬레이터 창은 맥의 클로드코드 데스크톱에서 퍼블릭 베타입니다. Pro·Max·Team에서 쓸 수 있고 Enterprise에서는 안 됩니다. 클로드가 앱을 빌드·설치·실행·확인할 때 창이 자동으로 열려 기기 화면을 실시간으로 스트리밍합니다. 시뮬레이터를 직접 구동하므로 컴퓨터 조작이 필요하지 않고 내 화면을 점유하거나 다른 창을 숨기지도 않습니다. CLI에서는 대신 컴퓨터 조작으로 시뮬레이터에 닿습니다. desktop-ios-simulator

공식요구 사항은 셋입니다. 클로드 데스크톱 v1.24012.0 이상, 맥, 그리고 iOS 플랫폼이 설치된 Xcode입니다. Xcode 26.x를 씁니다. Xcode 27은 시뮬레이터 앱을 Device Hub로 대체해 아직 동작하지 않습니다. xcode-select가 27을 가리키면 26.x를 함께 설치하고 경로로 선택합니다. 클라우드와 SSH 세션에서는 클로드가 내 맥의 시뮬레이터에 닿을 수 없어 로컬 세션에서만 됩니다. desktop-ios-simulator

xcode-select -p                                    지금 선택된 설치 확인
sudo xcode-select -s /Applications/Xcode-26.4.app  26.x로 전환
xcodebuild -downloadPlatform iOS                   iOS 시뮬레이터 런타임 설치

공식여는 방법은 명령이나 설정이 아니라 요청 문구입니다. 실행이나 검증을 중심으로 말하면(예: "앱을 빌드하고 시뮬레이터에서 온보딩 흐름을 확인해 줘") 앱이 시뮬레이터에서 실행될 때 창이 열립니다. 특정 기기에서 테스트하려면 요청에 이름을 넣습니다("iPhone SE 시뮬레이터에서 돌려 줘"). 직접 열려면 세션 툴바의 Views 메뉴에서 iOS Simulator를 고르고 Attach simulator를 누릅니다. desktop-ios-simulator

공식창은 뷰어가 아니라 대화형입니다. 화면을 클릭·드래그해 탭하고 스와이프할 수 있고, 애플 시뮬레이터 앱과 같은 단축키로 하드웨어 버튼을 누르고(Cmd Shift H 홈, Cmd L 잠금, Cmd 방향키 볼륨·회전), Cmd S로 스크린샷과 Cmd R로 화면 녹화를 데스크톱에 저장합니다. desktop-ios-simulator

나와 클로드가 같은 기기를 씁니다. 공식내 탭이 클로드가 보는 앱 상태를 바꿉니다. 클로드가 기기를 조작하는 동안에는 화면 위에 Claude is using this device 배지가 뜨므로, 결과가 내 입력이 아니라 앱을 반영하게 하려면 배지가 사라질 때까지 탭하지 않습니다. 특정 화면을 확인하게 하려면 내가 탭으로 이동한 뒤 물어봅니다. desktop-ios-simulator

공식기기는 그것을 띄운 세션에 속하므로 병렬 세션이 기기를 공유하지 않습니다. 클로드가 여러 기기를 쓰면 각각 창을 열며 세션당 최대 4개입니다. 클로드코드 데스크톱이 띄운 시뮬레이터는 앱을 종료할 때, 세션을 보관할 때, 또는 창에서 분리한 뒤 10분 후에 종료됩니다. 내가 직접 띄운 기기는 자동으로 종료되지 않습니다. desktop-ios-simulator

공식동의 모델이 두 층입니다. 기기를 처음 쓸 때 기기별로 한 번 동의를 받고(세션마다가 아닙니다), 그 뒤 탭·입력·앱 실행·스크린샷은 추가 프롬프트 없이 돕니다. 시뮬레이션된 기기만 건드리므로 컴퓨터 조작이 요구하는 맥 손쉬운 사용·화면 기록 권한이 필요하지 않습니다. 다만 두 동작은 세션의 권한 모드를 따릅니다. 기기에서 URL 열기(데이터가 기기 밖으로 나갈 수 있으므로)와 앱 빌드(xcodebuild가 내 맥에서 프로젝트 빌드 스크립트를 돌리므로)입니다. desktop-ios-simulator

실제 계정으로 로그인하지 않습니다. 공식클로드의 기기 스크린샷은 Anthropic으로 전송되고 일반 대화 보관 설정에 따라 유지됩니다. 그래서 클로드가 쓰는 기기에 실제 계정으로 로그인하지 말라고 문서가 명시합니다. 그리고 클로드는 시뮬레이션된 기기만 조작할 수 있고 실제 아이폰·아이패드는 통제할 수 없습니다. 실물에서 테스트하려면 Xcode로 직접 올린 뒤 본 것을 설명하거나 스크린샷을 첨부합니다. desktop-ios-simulator

25.4검증 루프로 묶기

이 장의 세 가지는 각각 다른 표면이지만 쓰이는 방식은 하나로 수렴합니다. 클로드가 자기 변경을 눈으로 확인하게 만드는 것입니다. 고치고 끝내는 대신 고친 뒤 열어 보고 어긋나면 다시 고치는 루프를 붙이는 것입니다.

공식공식 문서의 용례가 모두 그 형태입니다. 로그인 폼 검증을 고친 뒤 localhost:3000을 열어 잘못된 데이터를 넣어 보고 오류 메시지가 맞게 나오는지 확인하기, 좁은 창에서만 나는 레이아웃 버그를 창을 줄여 재현하고 스크린샷을 찍은 뒤 CSS를 고치고 다시 확인하기, 네이티브 앱을 빌드해 실행하고 모든 탭을 눌러 보며 오류 상태를 스크린샷으로 남기기입니다. computer-use

실전이 가이드 자체가 그 루프로 만들어졌습니다. 각 편을 발행할 때마다 배포된 주소를 브라우저로 열어 확인했고, 그 과정에서 소스에서는 보이지 않던 결함을 두 번 잡았습니다. 배포본에서만 CSS가 죽은 경우와, 아직 없는 편을 링크해 404가 난 경우입니다. 로컬 서버에서는 둘 다 정상으로 보였습니다. 검증 루프의 값은 여기서 나옵니다. 내가 만든 것을 내가 만든 환경에서만 확인하면 환경이 가려 주는 결함을 못 봅니다.

실전실제로 붙여 쓴 순서는 넷입니다. 배포하고, 브라우저로 그 주소를 열고, 콘솔 오류와 끊긴 참조를 기계로 확인하고, 마지막에 스크린샷을 본 것입니다. 앞의 셋은 자동화되고 마지막 하나만 사람 판단이 필요했습니다. 그래서 검증 루프를 짤 때 기준은 어디까지 기계가 판정할 수 있는가입니다. 콘솔 오류 개수와 링크 상태 코드는 기계가 판정합니다. "읽기 좋은가"는 아직 사람이 봅니다.

루프의 종료 조건을 프롬프트에 넣습니다. 관행"확인해 줘"로 끝내면 클로드가 한 번 보고 보고합니다. "콘솔 오류가 0이 될 때까지 고치고 다시 확인해 줘"는 조건을 만족할 때까지 돕니다. L1에서 본 /goal이 이 형태를 세션 수준으로 올린 것입니다. 조건은 클로드 자신의 출력으로 증명될 수 있는 형태여야 합니다.

관행마지막으로 이 장의 도구들을 안 쓰는 판단도 필요합니다. 브라우저 연동은 켜 두면 도구가 항상 로드되어 맥락을 먹고, 컴퓨터 조작은 세션이 기기 락을 잡습니다. 검증할 것이 있는 세션에서만 켜는 편이 낫습니다. 이 판단은 18.2절의 계기 기준과 같습니다. 마찰이 있을 때 붙입니다.


이 편을 마치며

없는 기능을 만들 수 있게 됐습니다

스킬로 반복을 도구화하고, 서브에이전트로 맥락을 격리하고, 훅으로 규칙을 강제하고, MCP로 외부 데이터를 붙였습니다. 여기까지가 세션 하나 안에서의 확장입니다.

완료 체크리스트

  • 18.2절 판정표로 지금 프로젝트가 어느 수단에 기울어 있는지 확인했습니다.
  • 반복해 입력하던 지시 하나를 스킬로 만들어 /로 불러 봤습니다.
  • 그 스킬이 직접 부르지 않아도 설명만으로 발동하는지 확인했습니다.
  • 부수효과가 있는 스킬에 disable-model-invocation: true를 붙였습니다.
  • 큰 탐색을 서브에이전트로 위임해 메인 맥락이 비어 있는 것을 /context로 확인했습니다.
  • 반드시 돌아야 하는 검사 하나를 훅으로 만들고 /hooks에서 등록을 확인했습니다.
  • 그 훅이 돌았다는 증거를 함께 만들었습니다.
  • Stop 훅을 만들었다면 stop_hook_active로 루프를 막았습니다.
  • 여러 프로젝트에서 쓸 것이 생겼다면 플러그인으로 묶어 --plugin-dir로 시험했습니다.
  • MCP를 붙이기 전에 CLI나 훅으로 될 일인지 먼저 물어봤습니다.

여기까지가 하나의 세션 안에서 할 수 있는 확장입니다. 다음 편 L4 오케스트레이션은 여러 개를 동시에 돌리는 쪽입니다. 워크트리로 세션을 나누고, 서브에이전트를 병렬로 묶고, 에이전트 팀으로 조율하고, 워크플로 스크립트로 팬아웃을 결정론적으로 만드는 것입니다. 이 편에서 만든 것들이 그 병렬 구조의 부품이 됩니다.

자주 막히는 곳

스킬을 만들었는데 클로드가 안 씁니다

순서대로 봅니다. /skills에 나타나는지 확인하고(안 보이면 파일이 .claude/skills/name.md가 아니라 .claude/skills/name/SKILL.md인지 봅니다), 설명에 내가 실제로 쓰는 단어가 들어 있는지 봅니다. 프론트매터 YAML이 깨지면 본문은 로드되어 /name은 되지만 대조할 description이 없어 자동 발화만 조용히 죽습니다. --debug로 파싱 오류를 봅니다.

스킬이 너무 자주 발동합니다

설명을 더 구체적으로 만들고, 쓰지 말아야 할 경우를 한 줄 넣습니다. 수동 호출만 원하면 disable-model-invocation: true를 답니다. 남이 쓴 스킬이라 파일을 고치기 어려우면 skillOverrides에서 "name-only"나 "off"로 둡니다.

스킬이 첫 응답 이후에는 효과가 없는 것 같습니다

내용은 대개 여전히 맥락에 있고 모델이 다른 접근을 고르는 것입니다. 클로드코드는 이후 턴에서 스킬 파일을 다시 읽지 않으므로, 작업 전체에 적용될 지시는 일회성 단계가 아니라 상시 지시로 씁니다. 압축을 겪은 뒤라면 다시 호출해 전문을 복구합니다.

서브에이전트가 CLAUDE.md 규칙을 지키지 않습니다

내장 Explore와 Plan 에이전트는 CLAUDE.md와 git 상태를 건너뜁니다. 그 둘에게는 위임 프롬프트에 지시를 다시 적습니다. 커스텀 서브에이전트는 로드하므로, 그쪽에서 안 지켜지면 중요한 지시를 에이전트 파일 본문(시스템 프롬프트)에 넣습니다.

훅이 등록됐는데 안 돕니다

매처를 봅니다. 배열이 아니라 "Edit|Write" 같은 단일 문자열이어야 하고, 대소문자를 구분합니다. 스크립트에 실행 권한이 있는지(chmod +x), 경로가 절대 경로나 ${CLAUDE_PROJECT_DIR}인지 봅니다. 인용 문제로 의심되면 "args": []를 더해 exec 형으로 바꿉니다. 그래도 안 되면 샘플 JSON을 파이프로 넣어 직접 돌려 봅니다.

훅이 도는데 아무 표시가 없습니다

정상입니다. 종료 코드 0으로 성공하면 대화에 아무것도 보이지 않습니다. 확인하려면 효과를 보거나(재포맷된 파일 등) claude --debug-file /tmp/claude.log로 로그를 켭니다. 훅을 만들 때 그 훅이 돌았다는 증거를 함께 만드는 편이 낫습니다.

Stop 훅 때문에 턴이 끝나지 않습니다

진전 없이 8회 연속 차단하면 클로드코드가 그 훅을 무시하지만, 그 전까지는 계속 돕니다. 스크립트에서 stop_hook_active를 읽어 true면 즉시 exit 0합니다. 정당하게 더 필요하면 CLAUDE_CODE_STOP_HOOK_BLOCK_CAP으로 상한을 올립니다.

플러그인 스킬이 안 보입니다

설치 요약이 Run /reload-plugins to activate.였는지 봅니다. /reload-plugins가 캐시 무효화 경고로 건너뛰면 --force로 다시 돌립니다. 요약의 스킬 개수는 commands/만 세므로 0 skills여도 실제로는 로드됐을 수 있습니다. 그래도 안 보이면 rm -rf ~/.claude/plugins/cache 뒤 재시작하고 재설치합니다.

MCP 서버가 연결되지 않습니다

/mcp로 상태를 봅니다. 프로젝트 스코프 서버는 일회성 승인이 필요하므로 프롬프트를 놓쳤으면 거기서 승인합니다. command나 args의 상대 경로는 .mcp.json 위치가 아니라 클로드코드를 시작한 디렉터리를 기준으로 풀리므로 절대 경로를 씁니다. 연결됐는데 도구가 0개면 /mcp에서 Reconnect하고, 그래도 0이면 claude --debug=mcp로 서버 stderr를 봅니다.


5부 · L4

오케스트레이션

하나가 아니라 여러 개를 동시에

먼저 필요한 것
L3 확장
마치면
한 작업을 병렬로 쪼개 돌리고 격리·추적·수렴까지 설계한다
범위
26~32장
이 편의 성격. L3이 "없는 기능을 내가 만든다"였다면 이 편은 하나가 아니라 여러 개를 동시에 돌린다입니다. 앞 편에서 만든 서브에이전트와 훅이 여기서 병렬 구조의 부품이 됩니다. 다만 이 편의 기능 중 일부는 연구 프리뷰이거나 기본으로 꺼져 있고, 표면과 공급자에 따라 아예 없기도 합니다. 자기에게 없는 것은 건너뛰고 읽으면 됩니다. 가용 여부는 색인 편 부록 C에 정리돼 있습니다.
26

병렬의 네 갈래

26.1누가 계획을 들고 있는가

"여러 개를 동시에 돌린다"는 말에는 네 가지 다른 것이 섞여 있습니다. 겉으로는 다 병렬이지만, 갈리는 축은 하나입니다. 누가 계획을 들고 있는가입니다. 이 축을 먼저 잡지 않으면 서브에이전트로 될 일을 팀으로 하거나, 스크립트로 잡아야 할 것을 대화로 조율하게 됩니다.

공식공식 문서가 네 갈래를 이렇게 구분합니다. 서브에이전트는 한 세션 안의 위임 일꾼으로 자기 맥락에서 곁가지 작업을 하고 요약만 돌려줍니다. 에이전트 뷰는 백그라운드로 도는 세션들을 한 화면에서 띄우고 지켜보는 자리입니다(claude agents, 연구 프리뷰). 에이전트 팀은 리드가 관리하는 여러 세션으로 공유 작업 목록과 에이전트 간 메시지를 갖습니다(실험 기능, 기본 비활성). 동적 워크플로는 많은 서브에이전트를 돌리고 결과를 서로 대조하는 스크립트입니다. agents

갈래주는 것이럴 때
서브에이전트 한 세션 안의 위임 일꾼. 자기 맥락에서 곁가지 작업을 하고 요약을 돌려줍니다 곁가지 작업이 검색 결과나 로그, 다시 볼 일 없는 파일 내용으로 메인 대화를 채울 때
에이전트 뷰 백그라운드 세션을 띄우고 지켜보는 한 화면 독립된 작업이 여러 개 있고, 넘겨 두고 상태만 훑다가 필요할 때만 들어가고 싶을 때
에이전트 팀 공유 작업 목록과 에이전트 간 메시지를 가진 조율된 세션들 클로드가 프로젝트를 쪼개 배정하고 일꾼들을 서로 맞물리게 하길 원할 때
동적 워크플로 많은 서브에이전트를 돌리고 결과를 교차 검증하는 스크립트 서브에이전트 몇 개로 감당이 안 되거나, 결과를 서로 대조해 검증하고 싶을 때

공식네 갈래 모두 일꾼은 클로드 세션입니다. 다른 도구를 끌어들이려면 그것을 MCP 서버로 노출해야 합니다. agents

계획의 소유자로 다시 본 표

공식워크플로 문서는 같은 구분을 더 정밀하게 적어 두었습니다. 스킬까지 넣어 다섯을 비교하는데, 핵심 행은 "다음에 무엇이 돌지 누가 정하는가"와 "중간 결과가 어디에 사는가"입니다. workflows

서브에이전트스킬에이전트 팀워크플로
무엇인가클로드가 띄우는 일꾼클로드가 따르는 지침동료 세션을 감독하는 리드런타임이 실행하는 스크립트
다음을 정하는 주체클로드, 턴마다클로드, 프롬프트를 따라리드 에이전트, 턴마다스크립트
중간 결과가 사는 곳클로드의 컨텍스트 윈도우컨텍스트 윈도우공유 작업 목록스크립트 변수
재사용되는 것일꾼 정의지침팀 정의오케스트레이션 자체
규모턴당 위임 몇 건서브에이전트와 같음장기 실행 동료 소수런당 수십에서 수백
중단하면턴이 다시 시작턴이 다시 시작동료는 계속 돎같은 세션 안에서 재개 가능

공식워크플로가 계획을 코드로 옮기는 것이라는 점이 여기서 드러납니다. 서브에이전트와 스킬, 에이전트 팀에서는 클로드가 오케스트레이터라서 턴마다 무엇을 띄울지 정하고 모든 결과가 컨텍스트 윈도우에 들어옵니다. 워크플로 스크립트는 루프와 분기, 중간 결과를 자기가 들고 있어서 클로드의 맥락에는 최종 답만 남습니다. workflows

병렬을 돕지만 병렬 방식은 아닌 것 셋

공식아래 셋은 병렬 방식을 받쳐 주는 도구입니다. 워크트리는 각 세션에 별도 git 체크아웃을 줘서 병렬 세션이 같은 파일을 건드리지 않게 합니다. 세션 간 메시지는 이 기기의 다른 세션을 나열하고 메시지를 보내게 하거나, 다른 기기와 웹의 세션에서 온 메시지에 답하게 합니다. /batch는 큰 변경 하나를 5개에서 30개의 워크트리 격리 서브에이전트로 쪼개 각각 PR을 열게 하는 스킬로, 서브에이전트와 워크트리를 묶어 쓴 것이지 별도 방식이 아닙니다. agents

공식반대로 병렬처럼 보이지만 다른 문제를 푸는 것도 있습니다. 백그라운드 bash 명령은 셸 명령 하나를 대화를 막지 않고 돌리는 것이고 에이전트를 띄우지 않습니다. /subtask로 시작하는 포크 서브에이전트는 새로 시작하는 대신 전체 대화 맥락을 상속하는 서브에이전트로, 서브에이전트를 띄우는 한 방식입니다. 세션 전체를 옆에서 도는 백그라운드 세션으로 복사하려면 /fork를 씁니다. 루틴은 클라우드에서 일정에 맞춰 세션을 돌리는 것이고 내 기기에서 병렬로 도는 것이 아닙니다. agents

토큰은 배수로 늡니다. 공식여러 세션이나 서브에이전트를 동시에 돌리면 토큰 사용량이 곱해집니다. 병렬은 시간을 사는 대신 사용량을 지불하는 거래이므로, 무엇을 병렬로 돌릴지 고르는 판단이 이 편에서 가장 중요합니다. agents

26.2무엇을 언제 쓰나

공식공식 문서가 세 질문으로 고르게 합니다. 이 순서대로 답하면 대개 하나로 좁혀집니다. agents

  1. 일을 누가 조율하는가. 클로드가 한 대화 안에서 위임하고 결과를 모은다면 서브에이전트, 내가 독립 작업을 넘겨 두고 나중에 확인한다면 에이전트 뷰, 클로드가 계획하고 배정하고 감독한다면 에이전트 팀, 턴마다의 판단이 아니라 스크립트가 계획을 들고 있어야 한다면 워크플로입니다.
  2. 일꾼들이 서로 대화해야 하는가. 서브에이전트는 자기를 띄운 대화에만 보고하고, 에이전트 뷰 세션은 사람에게만 보고합니다(별도 세션끼리는 세션 간 메시지로 주고받을 수 있습니다). 팀의 동료는 공유 작업 목록을 갖고 서로 직접 메시지를 보냅니다.
  3. 같은 파일을 만지는가. 그렇다면 워크트리로 격리합니다. 서브에이전트와 내가 직접 띄운 세션은 각각 별도 워크트리를 쓸 수 있습니다. 에이전트 팀은 동료를 워크트리로 격리하지 않으므로, 동료마다 다른 파일 집합을 갖게 일을 나눠야 합니다.
판정 요령

세 번째 질문을 먼저 던져도 됩니다

관행실제로는 "같은 파일을 만지는가"가 가장 먼저 결과를 가릅니다. 파일을 함께 만지는 병렬은 격리 없이는 반드시 덮어쓰기를 만들고, 덮어쓰기는 조용히 일어나 나중에 발견됩니다. 조율 방식은 나중에 바꿀 수 있지만 덮어써서 사라진 작업은 되돌리기 어렵습니다.

실제로는 무엇이 쓰이는가

실전필자가 클로드코드로 운영하는 작업 볼트에서 오케스트레이션 도구가 실제로 얼마나 호출됐는지 재 봤습니다. 2026-07-07부터 2026-08-11까지 응답 턴 1,864건에서 Agent(서브에이전트 띄우기) 409회, 작업 목록 갱신 TaskUpdate 309회, TaskCreate 173회입니다. 반면 Workflow는 2회이고, 워크트리 진입과 에이전트 팀은 0회입니다(.claude/worktrees 디렉터리도 없고 ~/.claude/teams도 비어 있습니다). 서브에이전트 타입은 세 종류만 쓰였습니다: general-purpose 81회, Explore 14회, 직접 만든 claude-code-guide 3회.

# 자기 세션 기록에서 같은 값을 세는 법(도구 이름별 호출 수)
grep -ho '"name":"\(Agent\|Workflow\|EnterWorktree\|SendMessage\|Monitor\)"' \
  ~/.claude/projects/*/*.jsonl | sort | uniq -c

# 워크트리와 팀 디렉터리가 실제로 있는지
ls .claude/worktrees ~/.claude/teams 2>/dev/null

이 분포에서 읽을 것이 두 가지 있습니다. 하나는 서브에이전트가 병렬의 기본값이라는 점입니다. 곁가지 탐색을 위임하는 것은 별도 설정이 필요 없고 실패 비용이 낮습니다. 다른 하나는 워크트리가 0인 이유가 작업 성격이라는 점입니다. 이 볼트의 산출물은 대부분 문서와 정적 사이트여서 같은 파일을 동시에 고칠 일이 드물고, 그래서 격리 장치가 필요하지 않았습니다. 코드베이스에서 병렬 편집을 한다면 이 값이 0이면 안 됩니다.

실전워크플로가 2회뿐인 것도 정직하게 적어 둡니다. 이것은 워크플로가 쓸모없다는 뜻이 아니고, 스크립트로 잡을 만큼 반복되는 대규모 팬아웃이 아직 없었다는 뜻입니다. 워크플로가 값을 하는 지점은 같은 오케스트레이션을 다시 돌릴 때인데, 한 번만 돌릴 일이라면 서브에이전트 몇 개로 충분합니다. 반복이 확인되기 전에 스크립트를 만드는 것은 L3의 스킬 안티패턴과 같은 실수입니다.

고르기 전에 확인할 것
  • 이 작업이 한 세션 안에서 끝나는 규모인가. 그렇다면 이 편의 나머지는 아직 필요하지 않습니다.
  • 병렬로 나눌 독립된 단위가 실제로 있는가. 순차 의존이 많은 일은 병렬로 더 느려집니다.
  • 같은 파일을 만지는가. 그렇다면 30장을 먼저 읽습니다.
  • 같은 오케스트레이션을 다시 돌릴 것인가. 그렇다면 28장의 워크플로가 맞습니다.
  • 일꾼들이 서로 논쟁해야 하는가. 그렇다면 29장의 팀입니다. 그 외에는 대개 서브에이전트입니다.

27

병렬 에이전트 실행

27.1동시 실행 기본

가장 낮은 비용의 병렬은 서브에이전트입니다. 만드는 법은 L3 20장에 있고, 여기서는 여러 개가 동시에 돌 때 무엇이 달라지는지만 다룹니다.

공식돌고 있는 일을 확인하는 명령은 어느 방식을 썼는지에 따라 갈립니다. 백그라운드 세션은 claude agents가 에이전트 뷰를 열어 모든 세션과 상태, 내 입력이 필요한 것을 한 화면에 보여 줍니다. 지금 세션의 서브에이전트는 이름이 붙은 백그라운드 서브에이전트가 @ 멘션 자동완성에 상태와 함께 나타납니다. 지금 세션의 백그라운드 항목 전체는 /tasks가 나열하고 확인, 붙기, 정지를 할 수 있게 합니다(끝난 서브에이전트도 목록에 들어옵니다). 동적 워크플로는 /workflows가 실행 중과 완료된 런, 각 런의 단계, 끝난 에이전트 수를 보여 줍니다. agents

확인 대상명령보이는 것
백그라운드 세션 전부claude agents세션, 상태, 내 입력이 필요한 것
지금 세션의 서브에이전트@ 자동완성이름 붙은 백그라운드 서브에이전트와 상태
지금 세션의 백그라운드 전부/tasks각 항목, 붙기·정지, 끝난 서브에이전트
동적 워크플로/workflows런 목록, 단계, 완료 에이전트 수

공식v2.1.198부터 /agents는 패널을 열지 않고 서브에이전트 파일 위치를 알려 주는 안내만 출력합니다. 만들고 고치려면 클로드에게 시키거나 파일을 직접 편집합니다. 이름이 비슷하지만 /agents와 claude agents는 다른 것입니다. agents

서브에이전트는 이제 기본이 백그라운드입니다. 공식2026년 27주(v2.1.195~v2.1.201) 변경으로 서브에이전트가 기본으로 백그라운드에서 돌고, 그래서 클로드가 기다리지 않고 계속 일합니다. 이 기본값이 병렬의 체감을 바꿉니다. 위임이 더 이상 대화를 멈추게 하지 않습니다. whats-new 27주

27.2에이전트 뷰

공식에이전트 뷰는 claude agents로 열리는, 모든 백그라운드 세션을 위한 한 화면입니다. 무엇이 돌고 있고, 무엇이 내 입력을 기다리고, 무엇이 끝났는지 보여 줍니다. 각 백그라운드 세션은 터미널이 붙어 있지 않아도 계속 도는 완전한 대화이므로, 열어서 답하고 나가는 것을 아무 때나 할 수 있습니다. agent-view

claude agents

공식기본 루프는 넷입니다. 프롬프트를 입력하고 Enter를 누르면 새 백그라운드 세션이 시작되고 행 하나가 생깁니다. 입력한 프롬프트마다 새 세션이 시작되므로, 두 번째 프롬프트는 첫 세션에 이어지지 않고 두 번째 세션이 됩니다. 행을 고르고 Space를 누르면 미리보기(peek) 패널이 열려 최근 출력이나 묻고 있는 질문을 보여 주고, 거기서 바로 답을 보낼 수 있습니다. Enter나 →로 붙으면 전체 대화가 열립니다. Esc로 셸로 돌아가도 세션은 계속 돕니다. agent-view

공식각 행의 한 줄 요약은 Haiku 계열 모델이 씁니다. 세션이 일하는 동안 행 텍스트는 모델 요청 없이 세션의 최근 출력에서 최대 15초에 한 번 갱신되고, 턴이 끝날 때 모델이 새 요약을 씁니다. 긴 턴에서는 몇 분마다 요약을 다시 써서 오래된 문장이 남아 있지 않게 합니다. 턴 끝 요약과 중간 재작성은 각각 짧은 Haiku 계열 요청이고 세션과 같은 데이터 처리 조건으로 과금됩니다. agent-view

디스패치하는 세 경로

경로방법메모
에이전트 뷰에서입력창에 프롬프트를 쓰고 EnterShift+Enter는 띄우고 바로 붙습니다
세션 안에서/background(별칭 /bg) 또는 /fork앞은 지금 대화를 넘기고 터미널을 비웁니다. 뒤는 사본을 보내고 나는 계속 씁니다
셸에서claude --bg "지시"프롬프트는 위치 인자입니다. -p와 함께 쓸 수 없습니다

공식--bg는 --agent와 조합해 특정 서브에이전트를 그 세션의 주 에이전트로 돌릴 수 있습니다. 이름이 맞지 않으면 경고를 내고 세션은 즉시 오류로 종료합니다. --name으로 에이전트 뷰에 보일 이름을 정할 수 있습니다. agent-view

claude --bg "SettingsChangeDetector 테스트가 간헐 실패하는 원인을 조사해라"

# 특정 서브에이전트를 주 에이전트로, 이름을 붙여서
claude --agent code-reviewer --bg --name "pr-1234" "PR 1234의 리뷰 코멘트를 처리해라"

공식세션을 나가려는데 백그라운드 작업(서브에이전트, 백그라운드 셸 명령, 워크플로, 모니터)이 아직 돌고 있으면 바로 종료하지 않고 대화상자를 띄웁니다. Move to background and exit를 고르면 /background와 같은 방식으로 세션을 백그라운드로 보내고 셸로 돌아갑니다. agent-view

파일 편집이 격리되는 방식

공식모든 백그라운드 세션은 내 작업 디렉터리에서 시작하지만, 파일을 고치기 전에 클로드가 세션을 .claude/worktrees/ 아래의 격리된 워크트리로 옮깁니다. 그래서 병렬 세션이 같은 체크아웃을 읽되 각자 자기 것에 씁니다. 워크트리로 들어간 뒤에는 메인 체크아웃에 닿는 파일 편집과 명령이 세션과 그 서브에이전트 모두에게 차단됩니다. agent-view

공식워크트리를 건너뛰는 경우도 정해져 있습니다. 이미 연결된 git 워크트리 안에 있을 때, 작업 디렉터리가 git 저장소가 아니고 WorktreeCreate 훅도 없을 때, 그리고 쓰기 대상이 작업 디렉터리 밖일 때입니다. git 워크트리가 실용적이지 않은 저장소에서는 worktree.bgIsolation을 "none"으로 두어 격리를 끕니다. agent-view

{
  "worktree": {
    "bgIsolation": "none"
  }
}

공식백그라운드 세션이 띄운 서브에이전트는 그 세션의 작업 디렉터리를 상속하므로, 편집이 내 작업 사본이 아니라 세션의 워크트리에 들어갑니다. 서브에이전트에게 별도 워크트리를 주려면 프론트매터에 isolation: worktree를 넣거나 띄울 때 지정합니다. agent-view

어디에 살고 누가 돌리는가

공식백그라운드 세션은 터미널과 에이전트 뷰와 별개인 사용자별 슈퍼바이저 프로세스가 호스팅합니다. 처음 세션을 백그라운드로 보내거나 에이전트 뷰를 열 때 자동으로 시작되고, 직접 관리할 것은 없습니다. 슈퍼바이저는 미리 데워 둔 워커 프로세스 하나를 유지해서 디스패치가 콜드 스타트 지연 없이 시작되게 합니다. 대화형 세션과 같은 저장 자격 증명으로 인증하고 모델 API 외에 추가 네트워크 연결을 만들지 않습니다. agent-view

경로내용
~/.claude/daemon.log슈퍼바이저 로그
~/.claude/daemon/roster.json도는 백그라운드 세션 목록. 재시작 후 재연결에 씁니다
~/.claude/jobs/<id>/state.json에이전트 뷰에 보이는 세션별 상태
~/.claude/jobs/<id>/tmp/세션별 임시 디렉터리. 여기 쓰기는 권한을 묻지 않습니다

공식각 백그라운드 세션에는 CLAUDE_JOB_DIR 환경 변수가 자기 ~/.claude/jobs/<id> 디렉터리로 설정되므로, 세션이 돌리는 셸 명령이 병렬 세션과 충돌하지 않게 임시 파일을 쓸 수 있습니다. 파일을 직접 읽지 않고 상태를 보려면 claude daemon status를 씁니다. agent-view

claude daemon status

공식백그라운드 세션의 권한 모드는 시작 방식에 달립니다. /bg로 기존 세션을 넘기면 지금 권한 모드가 유지되고, 에이전트 뷰 입력이나 claude --bg로 디스패치하면 그 디렉터리 설정의 defaultMode 또는 디스패치한 서브에이전트 프론트매터의 permissionMode를 씁니다. agent-view

공식연구 프리뷰이며 한계가 셋 있습니다. 백그라운드 세션도 대화형 세션과 똑같이 사용량을 먹으므로 열 개를 병렬로 돌리면 쿼터가 열 배 빠르게 줍니다. 세션은 로컬이라 절전은 견디지만 기기가 꺼지면 멈춥니다. 클로드가 만든 워크트리는 에이전트 뷰에서 세션을 지울 때 함께 삭제되므로, 워크트리에서 파일을 고친 세션을 지우기 전에 커밋해야 합니다. agent-view

실전정직하게 적을 것이 있습니다. 필자의 볼트에서 ~/.claude/jobs는 비어 있습니다(항목 0개). 에이전트 뷰와 백그라운드 세션을 실제로는 쓰지 않았다는 뜻입니다. 서브에이전트는 409회 띄웠으면서 백그라운드 세션은 0인 이유를 되짚어 보니, 이 볼트의 작업은 대체로 한 대화 안에서 결과를 보고 다음을 정하는 형태였습니다. 넘겨 두고 나중에 확인하는 형태의 일이 적었습니다. 자기 값은 아래로 확인할 수 있습니다.

ls ~/.claude/jobs 2>/dev/null | wc -l
claude daemon status

27.3세션 간 메시지

공식세션 간 메시지는 내 클로드코드 세션 하나에서 다른 세션으로 메시지를 전달합니다. 한 세션의 변경이 다른 세션이 만들고 있는 것을 깨뜨리면 클로드가 그 세션에 먼저 알릴 수 있고, 한 세션이 다른 세션이 막혀 있던 질문을 해결하면 답을 보낼 수 있습니다. v2.1.224 이상, macOS와 리눅스에서 동작하며 조건을 만족하면 켜는 것 없이 바로 켜져 있습니다. cross-session-messaging

공식메시지는 한 클로드가 다른 클로드에게 쓰는 텍스트 한 조각이고, 대화 이력이나 파일이 아닙니다. 대화 전체나 그 맥락을 옮기려면 세션을 재개해야 합니다. 클로드는 ListAgents로 닿을 수 있는 에이전트를 찾고 SendMessage로 이름을 지정해 보냅니다. 두 도구를 사람이 직접 호출하지는 않습니다. cross-session-messaging

다른 터미널에서 도는 세션에 마이그레이션이 끝났는지 물어봐 줘

공식어디서 도는 세션이냐에 따라 전달 경로와 보낼 수 있는 것이 달라집니다. cross-session-messaging

상대 세션 위치전달 경로보낼 수 있는 것
이 기기세션별 소켓. Anthropic 서버를 거치지 않습니다새 메시지와 답장
내 다른 기기Anthropic 서버를 거쳐 그 기기의 리모트 컨트롤 연결로답장만
클로드코드 웹Anthropic 서버를 거쳐 클라우드 세션으로답장만

공식같은 기기 전달은 각 세션이 디스크에 자기를 등록하고 받은 편지함 소켓을 거기 바인딩하는 방식입니다. 그래서 같은 파일을 볼 수 있는 두 세션만 서로 닿습니다. 컨테이너는 자기 파일 시스템을 가지므로 컨테이너 안 세션과 호스트 세션은 서로 닿지 않고, 같은 컨테이너 안 두 세션은 닿습니다. cross-session-messaging

도착한 메시지를 받는 쪽은 어떻게 대하는가

공식세션 A가 세션 B에게 메시지를 보내면, 클로드코드는 B의 클로드에게 이 메시지는 사람이 아니라 다른 세션에서 왔다고 알리고 할 수 있는 것을 제한합니다. 무엇도 승인하지 못하고(대기 중인 권한 프롬프트에 대신 답할 수 없습니다), 설정을 바꾸지 못하고(권한 설정이나 지침 파일을 다른 세션이 요청했다고 바꾸지 않습니다), 메시지 안의 명령은 평문으로 도착해 실행되지 않으며, 메시지에 따라 행동하는 데 권한이 필요하면 평소와 같은 프롬프트가 뜹니다. cross-session-messaging

공식보내는 쪽에도 경계가 있습니다. 클로드는 자기 세션에서 거부되거나 차단된 행동, 또는 자기 권한 설정이 막을 행동을 다른 세션에 요청하지 않도록 지시받고, 그런 일은 사람에게 되돌립니다. cross-session-messaging

수신을 통제하는 값

공식crossSessionInbound로 도착한 메시지를 어떻게 할지 정합니다. 값에 따라 전달, 보류, 거부로 갈립니다. cross-session-messaging

값동작
accept메시지를 클로드에게 전달합니다
hold알림만 띄우고 전달하지 않습니다. 나중에 accept가 적용되면 보류분을 풀어 줍니다
refuse전달하지 않고 버립니다

공식값을 안 정하면 두 세션의 권한 모드로 판단합니다. 권한 프롬프트를 띄우는 세션이 받는 쪽이면 전달하고, 보내는 쪽이 프롬프트를 우회한다고 밝힌 경우에만 승인을 위해 보류합니다. 반대로 받는 쪽이 프롬프트를 우회하는 세션이면 기본이 보류이고, 보내는 쪽도 우회한다고 밝힌 경우에만 전달합니다. 보류된 메시지는 승인 대화상자로 뜨고, dialogExpiry 기한(기본 5분)을 넘기면 닫히고 버려집니다. cross-session-messaging

공식메시지 루프는 스스로 멈춥니다. 발신자별로 반복 메시지에 속도 제한이 걸리고, 짧은 시간 안에 도착한 동일 반복은 버려지며, 클로드가 읽기를 기다리는 수락 메시지는 세션당 50개로 제한됩니다. 보류는 별도로 최대 100개까지이고 넘으면 가장 오래된 것을 버립니다. cross-session-messaging

공식닿을 수 있는 세션을 직접 보려면 /list-agents(별칭 /peers)를 씁니다. 이 명령이 인식되지 않으면 그 세션에는 기능이 없는 것이고, 동작하는데 메시지가 안 갔으면 더 좁은 원인이 있는 것입니다(권한 거부 규칙, 받는 쪽 수신 통제, 다른 기기의 답장 전용 제약). /status의 Peer address 줄에 자기 받은 편지함 주소가 나옵니다. cross-session-messaging

/list-agents

실전필자의 볼트 로그에서 SendMessage는 8회 호출됐습니다. 서브에이전트 409회에 비하면 미미하고, 대부분은 세션 간이 아니라 서브에이전트에게 보낸 것이었습니다(같은 도구가 둘 다 씁니다). 세션 여러 개를 띄워 두고 서로 대화시키는 형태가 실제로는 잘 생기지 않았습니다. 이 기능이 값을 하는 조건은 좁습니다. 두 세션이 같은 저장소의 다른 부분을 동시에 만지고 있고, 한쪽의 변경이 다른 쪽의 전제를 깨는 경우입니다.

끄는 방법도 알아 둡니다. 공식수신을 막으려면 crossSessionInbound를 refuse로, 발신과 나열을 막으려면 SendMessage와 ListAgents에 권한 거부 규칙을 답니다. 둘 다 도구 이름만 적습니다. 다른 기기로 나가는 메시지에 매번 승인을 받으려면 isolatePeerMachines를 true로 둡니다. SendMessage를 거부하면 서브에이전트와 팀 동료에게 보내는 것도 함께 막힙니다(같은 도구입니다). cross-session-messaging

27.4병렬 생성 규율

여기까지가 병렬을 돌리는 방법입니다. 이 절은 병렬을 수렴시키는 방법입니다. 병렬 실행에서 실제로 문제가 되는 것은 속도가 아니라, 여러 일꾼이 낸 결과가 서로 다른 물건이 되는 것입니다.

실전지금 읽고 있는 이 시리즈가 그 사례입니다. 8편을 병렬로 쓰려고 했는데, 착수 전에 세 가지를 먼저 잠그지 않으면 8편이 서로 다른 문서가 된다는 것이 분명했습니다. 그래서 다음 순서로 진행했습니다.

  1. 픽스처를 먼저 확정했습니다. CSS와 스크립트, 페이지 골격을 정본 한 곳에 두고, 주입기 하나가 8편에 인라인으로 반영하게 했습니다. 각 편이 자기 스타일을 갖는 순간 수렴은 불가능해집니다.
  2. 지배 의도 문서를 두었습니다. 목차 설계(무엇을 어느 편에), 집필 규격(문장과 라벨 규칙), 용어 통일표(같은 것을 같은 이름으로) 세 문서가 모든 편을 지배합니다. 집필자는 이 셋과 자기 절 목록만 보고 씁니다.
  3. 수렴 게이트를 코드로 만들었습니다. 검증기가 마커 누락, 금지 문자, 출처 라벨 누락, 끊긴 앵커, 목차에 없는 장, 끊긴 자산 참조를 잡습니다. 통과하지 못한 편은 발행되지 않습니다.

실전이 구조가 실제로 값을 한 지점을 하나 적습니다. 공식 문서가 용어를 바꾼 것을 L0 집필 중에 발견했을 때(Slash commands가 Commands로, Headless mode가 Non-interactive mode로), 8편을 각각 고치는 대신 용어 통일표 한 곳을 고치고 이후 편들이 그것을 따랐습니다. 정본이 없었다면 편마다 다른 이름이 남았을 것입니다.

실전반대로 이 구조에도 구멍이 있었습니다. 라벨 규율을 본문에만 적용하고 메타데이터(칩·요약)를 규율 대상에서 빠뜨렸습니다. 그 결과 실측한 것이 없는데 칩이 "비용 절약 실측"을 주장한 상태로 발행됐고, 라이브 화면을 눈으로 보다 발견했습니다. 병렬 생성에서 게이트는 사람이 보는 모든 면을 덮어야 합니다. 본문만 검사하는 게이트는 본문만 지킵니다.

규율 세 줄

픽스처 선확정 · 지배 의도문서 · 적대적 수렴 게이트

관행병렬 생성에서 반복적으로 통하는 형태입니다. 공유되는 것(형식·용어·규격)은 착수 전에 잠그고, 판단이 필요한 것(내용)만 병렬로 나눕니다. 그리고 수렴은 사람의 검토가 아니라 통과 여부를 내는 검사로 만듭니다. 사람 검토는 편수에 비례해 늘어나고, 검사는 그렇지 않습니다.

공식공식 문서도 같은 방향을 권합니다. 오래 자율로 돌수록 완료를 세기 전의 독립 검사가 중요해지고, 새 맥락의 리뷰어는 결과를 만든 추론을 보지 않으므로 자기 기준으로 평가합니다. 다만 갭을 찾도록 지시받은 리뷰어는 작업이 건전해도 대개 무언가를 보고하므로, 정확성이나 명시된 요구에 영향을 주는 것만 표시하라고 일러 둡니다. best-practices

실습

병렬 착수 전 3분 점검

병렬로 나누기 직전에 아래 셋을 종이에 적어 봅니다. 하나라도 못 적으면 아직 나눌 준비가 안 된 것입니다.

  1. 공유 픽스처: 모든 일꾼이 같아야 하는 것은 무엇인가(형식, 파일 이름 규칙, 출력 구조). 그것이 이미 파일로 존재하는가.
  2. 지배 문서: 일꾼이 판단이 갈릴 때 볼 정본은 무엇인가. 그 문서를 열지 않고도 알 수 있게 프롬프트에 다 넣을 것인가.
  3. 수렴 게이트: 일꾼의 결과가 합격인지 판정하는 돌릴 수 있는 검사는 무엇인가. 없다면 병렬 대신 하나씩 하는 편이 낫습니다.

확인 세 항목을 적었고, 세 번째가 사람의 눈이 아니라 명령 한 줄인 것을 확인했습니다.


28

동적 워크플로

28.1워크플로가 결정론을 주는 이유

공식동적 워크플로는 서브에이전트를 대규모로 오케스트레이션하는 JavaScript 스크립트입니다. 설명한 작업에 맞는 스크립트를 클로드가 쓰고, 런타임이 그것을 백그라운드에서 실행하는 동안 세션은 계속 반응합니다. v2.1.154 이상이 필요하고, 유료 플랜 전부와 Anthropic API, Amazon Bedrock, Google Cloud, Microsoft Foundry에서 쓸 수 있습니다. Pro에서는 /config의 Dynamic workflows 행에서 켭니다. workflows

공식워크플로를 꺼낼 시점은 두 가지입니다. 한 대화가 조율할 수 있는 것보다 많은 에이전트가 필요할 때, 또는 오케스트레이션 자체를 읽고 다시 돌릴 수 있는 스크립트로 굳히고 싶을 때입니다. 예로는 코드베이스 전체 버그 스윕, 500개 파일 마이그레이션, 출처를 서로 대조해야 하는 조사 질문, 그리고 결정하기 전에 여러 각도에서 초안을 뽑아 볼 만한 어려운 계획이 있습니다. workflows

공식계획을 코드로 옮기면 단순히 에이전트를 더 돌리는 것과 다른 것이 생깁니다. 독립된 에이전트들이 서로의 발견을 적대적으로 검토한 뒤에 보고하게 하거나, 여러 각도에서 계획 초안을 뽑아 서로 견주게 할 수 있습니다. 그래서 한 번 통과한 결과보다 더 신뢰할 만한 것이 나옵니다. workflows

가장 빠르게 보는 방법

공식번들 워크플로 /deep-research가 하나 들어 있습니다. 질문 하나를 여러 각도로 웹 검색해 팬아웃하고, 찾은 출처를 가져와 서로 대조하고, 각 주장에 투표해서 교차 검증을 통과하지 못한 주장을 걸러 낸 인용 리포트를 냅니다. WebSearch 도구가 있어야 합니다. workflows

/deep-research Node.js v20과 v22 사이에서 권한 모델이 무엇이 바뀌었나

공식실행 흐름은 이렇습니다. 클로드코드가 워크플로를 허용할지 묻고, 승인하면 백그라운드에서 시작됩니다. /workflows로 런을 골라 진행 화면을 열면 각 단계의 에이전트 수, 토큰 총량, 경과 시간이 보이고, 단계로 들어가면 에이전트별로 무엇을 찾았는지 볼 수 있습니다. 끝나면 리포트가 세션에 들어오고, 각 주장이 어느 출처에서 왔는지 인용이 붙습니다. v2.1.196부터는 검증 에이전트가 주장을 확인할 수 없었던 경우(속도 제한이나 API 오류 뒤) 반증된 것으로 세지 않고 미검증으로 표시합니다. workflows

공식/deep-research는 사람이 부를 때만 돕니다. v2.1.218 전에는 클로드가 스스로 시작할 수도 있었습니다. workflows

내 작업으로 워크플로를 시작하는 두 경로

공식세션의 노력 수준을 바꾸지 않고 한 작업만 워크플로로 돌리려면 프롬프트에 ultracode 키워드를 넣습니다. "워크플로를 써 달라"처럼 자기 말로 요청해도 같은 옵트인으로 취급합니다. 클로드코드가 입력에서 그 키워드를 강조 표시하고, 클로드는 턴마다 처리하는 대신 그 작업을 위한 워크플로 스크립트를 씁니다. workflows

ultracode: src/routes/ 아래 모든 API 엔드포인트에서 인증 검사 누락을 감사해라

공식키워드는 오케스트레이션 방식만 고릅니다. 이렇게 시작한 워크플로는 세션의 기존 권한 모드 안에서 돌고, 에이전트의 도구 호출은 다른 도구 호출과 같은 권한 검사와 샌드박스를 받습니다. workflows

공식다른 경로는 세션 전체를 워크플로 성향으로 바꾸는 것입니다. /effort ultracode는 xhigh 추론 노력과 자동 워크플로 오케스트레이션을 합친 설정입니다. 켜면 클로드가 실질적 작업마다 워크플로를 계획하고, 요청 하나가 여러 워크플로로 이어질 수 있습니다(코드를 이해하는 것 하나, 변경하는 것 하나, 검증하는 것 하나). 세션의 모든 작업에 적용되므로 요청마다 토큰이 더 들고 오래 걸립니다. 현재 세션에만 유지되고 새 세션에서 초기화됩니다. workflows

/effort ultracode

# 처음부터 켜고 시작하려면
claude --effort ultracode

공식키워드가 옵트인으로 인정되는 자리는 사람이 직접 타이핑한 프롬프트뿐입니다. 대화형 프롬프트, IDE 확장 패널, 리모트 컨트롤 클라이언트, 그리고 키보드 입력을 사람 입력으로 표시하는 Agent SDK 애플리케이션이 여기 해당합니다. -p로 넘긴 프롬프트, 사람 표시 없이 SDK가 보낸 프롬프트, 예약 작업 프롬프트, 웹훅 페이로드나 PR 코멘트가 대화로 중계된 것은 워크플로를 시작하지 않습니다(v2.1.210 전에는 이 경로들도 시작시켰습니다). workflows

승인 프롬프트는 권한 모드에 달립니다. 공식기본과 acceptEdits 모드에서는 매 런마다 묻습니다("이 워크플로는 이 프로젝트에서 다시 묻지 않기"를 고른 경우는 제외). 자동 모드에서는 첫 실행만 묻고 어떤 Yes든 사용자 설정에 동의를 기록해 이후에는 묻지 않으며, ultracode가 켜져 있으면 아예 건너뜁니다. bypassPermissions와 claude -p, Agent SDK에서는 묻지 않고 바로 시작합니다. workflows

공식주의할 지점이 하나 있습니다. 내 권한 모드는 시작 프롬프트만 통제합니다. 워크플로가 띄우는 서브에이전트는 세션 모드와 무관하게 항상 acceptEdits 모드로 돌고 내 도구 허용 목록을 상속합니다. 파일 편집은 자동 승인됩니다. 허용 목록에 없는 셸 명령, 웹 가져오기, MCP 도구는 런 중간에 물어볼 수 있으므로, 긴 런에서는 에이전트가 필요한 명령을 미리 허용 목록에 넣습니다. workflows

28.2스크립트 작성

스크립트는 클로드가 씁니다. 사람이 알아야 하는 것은 생성된 것을 읽고 판단할 수 있을 만큼의 모양입니다. 이 절의 목표는 스크립트를 손으로 쓰는 법이 아니라, 클로드가 낸 스크립트를 보고 "이건 팬아웃이 잘못됐다"고 말할 수 있게 되는 것입니다.

공식저장된 워크플로 파일은 meta 블록과 서브에이전트를 오케스트레이션하는 본문으로 이루어집니다. 본문은 최상위 await를 쓰는 평범한 JavaScript입니다. agent()가 서브에이전트 하나를 띄우고, pipeline()이 목록의 항목마다 하나씩 돌립니다. workflows

export const meta = {
  name: 'audit-routes',
  description: 'Audit every route handler for missing auth checks',
}

const found = await agent('List every .ts file under src/routes/.', {
  schema: { type: 'object', required: ['files'],
            properties: { files: { type: 'array', items: { type: 'string' } } } },
})

const audits = await pipeline(found.files, file =>
  agent(`Audit ${file} for missing authentication checks.`, { label: file }),
)

return audits.filter(Boolean)

공식마지막 줄의 .filter(Boolean)에 이유가 있습니다. agent() 호출은 사람이 런 중간에 멈추거나 복구 불가능한 API 오류를 만나면 null로 결정되고, pipeline()은 그 null을 결과 배열에 그대로 남깁니다. 그래서 결과를 쓰기 전에 걸러 냅니다. workflows

공식스크립트를 손으로 고치고 싶으면 클로드에게 변경을 안내받거나, Agent SDK 레퍼런스의 Workflow 도구 항목에서 옵션 전량을 봅니다. agent-sdk/typescript

런타임이 스크립트에 채우는 제약

공식워크플로 런타임은 대화와 분리된 격리 환경에서 스크립트를 실행합니다. 중간 결과는 클로드의 맥락에 들어오지 않고 스크립트 변수에 남습니다. 제약은 아래 다섯입니다. workflows

제약이유
런 중간에 사용자 입력을 받지 않습니다에이전트 권한 프롬프트만 런을 멈출 수 있습니다. 단계 사이에 사람의 결재가 필요하면 각 단계를 별도 워크플로로 돌립니다
워크플로 자체는 파일 시스템과 셸에 직접 닿지 않습니다읽고 쓰고 명령을 돌리는 것은 에이전트입니다. 스크립트는 에이전트를 조율합니다
모듈 로딩이 없습니다. import()가 있으면 런 시작 전에 실패합니다본문은 평범한 JavaScript입니다. 라이브러리가 필요한 일은 에이전트의 작업으로 넣습니다
동시 에이전트는 최대 16개, CPU 코어가 적은 기기에서는 더 적습니다로컬 자원 사용을 묶습니다
런당 총 1,000 에이전트폭주 루프를 막습니다

공식매 런은 스크립트를 ~/.claude/projects/ 아래 세션 디렉터리에 파일로 씁니다. 런이 시작될 때 클로드가 그 경로를 받으므로 물어볼 수 있습니다. 그 파일을 열어 클로드가 쓴 오케스트레이션을 읽거나, 이전 런의 스크립트와 비교하거나, 고쳐서 그 버전으로 다시 돌리게 할 수 있습니다. workflows

재사용하려면 저장합니다

공식반복할 작업이면 그 런의 스크립트를 명령으로 저장합니다. /workflows에서 런을 고르고 s를 누르면 저장 대화상자가 열리고, Tab으로 두 위치를 번갈아 고릅니다. 프로젝트의 .claude/workflows/는 저장소를 클론하는 모든 사람과 공유되고, 홈의 ~/.claude/workflows/는 모든 프로젝트에서 쓰이며 나만 봅니다. 저장하면 이후 세션에서 /<이름>으로 돕니다. 프로젝트 워크플로와 개인 워크플로가 이름이 같으면 프로젝트 것이 이깁니다. workflows

공식모노레포에서는 적용되는 패키지 옆에 워크플로를 둘 수 있습니다. v2.1.178부터 프로젝트 위치에 저장하면 작업 디렉터리와 저장소 루트 사이에 이미 존재하는 가장 가까운 .claude/workflows/에 쓰고, 프로젝트 워크플로는 그 경로상의 모든 .claude/workflows/에서 로드되며 같은 이름이 여러 곳에 있으면 작업 디렉터리에 가장 가까운 것이 돕니다. workflows

공식팀이나 저장소를 가로질러 공유하려면 플러그인에 넣습니다. 플러그인 루트의 workflows/ 디렉터리에 스크립트를 두거나 매니페스트의 workflows 필드로 다른 위치를 가리킵니다. 플러그인 워크플로는 플러그인 이름으로 네임스페이스가 붙어서, acme-tools 플러그인의 release-audit는 /acme-tools:release-audit로 돕니다. workflows

공식저장한 워크플로는 args로 입력을 받습니다. 스크립트는 그것을 args라는 전역으로 읽습니다. 조사 질문, 대상 경로 목록, 설정 객체를 호출 시점에 넘기고 싶을 때 씁니다. 클로드가 구조화된 데이터로 넘기므로 스크립트가 파싱 없이 배열과 객체 메서드를 바로 쓸 수 있고, 넘기지 않으면 전역이 undefined입니다. workflows

/triage-issues 를 이슈 1024, 1025, 1030 에 대해 돌려 줘

어떤 모양의 작업이 맞는가

공식공식 문서가 예시 프롬프트로 여섯 가지 모양을 제시합니다. 스크립트를 직접 쓰지 않고 클로드에게 요청하는 형태입니다. workflows

모양구조
같은 문제로 여러 파일 감사파일당 에이전트 하나로 팬아웃하고, 발견을 모아 검증합니다
검사가 통과할 때까지 고치기검사기를 돌리고 실패를 고치고, 통과하거나 진전이 없을 때까지 반복합니다
여러 파일 병렬 마이그레이션대상을 찾고, 각 파일을 격리된 사본에서 변환하고, 결과를 검증합니다
변경 파일 전수 리뷰 후 한 요약파일당 리뷰어를 돌리고, 모든 발견을 한 에이전트가 순위 매겨 중복을 제거합니다
여러 출처에 걸친 조사변경 이력, 이슈, 문서로 독자를 팬아웃하고 종합합니다
목록이 더 안 늘 때까지 찾기라운드를 반복하고, 새 라운드가 새것을 못 내면 멈춥니다

관행이 여섯을 관통하는 것은 항목이 여러 개이고 각 항목의 처리가 서로 독립이라는 성질입니다. 반대로 단계가 앞 단계의 판단에 의존하는 일은 워크플로로 옮겨도 이득이 없습니다. 스크립트가 들 수 있는 것은 제어 흐름이고, 판단은 여전히 에이전트가 합니다.

28.3검증 패턴

워크플로의 실제 가치는 결과를 서로 대조하는 구조를 반복 가능하게 만드는 것에 있습니다. 이 절은 그 구조 셋을 봅니다.

적대적 반증

공식발견마다 독립된 검증자를 띄우고, 확인하는 것이 아니라 반증하라고 지시하는 형태입니다. 공식 예시 프롬프트가 이 형태를 직접 요청합니다. workflows

워크플로로 src/routes/ 아래 모든 라우트 핸들러의 인증 검사 누락을 감사하고,
각 발견을 보고 전에 적대적으로 검증해라

공식왜 이것이 필요한지는 검증 문서가 설명합니다. 두 번째 의견을 두는 이유는 일을 한 에이전트가 채점자가 되지 않게 하는 것입니다. 새 맥락의 모델이 결과를 반증해 보게 하면, 그럴듯하지만 틀린 발견이 통과하지 않습니다. best-practices

관행반증 지시에는 기본값을 함께 넣는 편이 낫습니다. "확신이 없으면 반증된 것으로 처리하라"처럼 애매한 경우의 처리를 정해 두지 않으면, 검증자가 판정을 미루고 목록이 그대로 남습니다.

판정단

공식여러 각도에서 독립적으로 초안을 뽑고 서로 견주게 하는 형태입니다. 공식 문서가 워크플로의 값을 설명할 때 든 두 예 중 하나입니다. 하나는 발견의 적대적 상호 검토이고, 다른 하나는 여러 각도에서 계획 초안을 뽑아 서로 견주는 것입니다. 그래서 한 번 통과보다 신뢰할 만한 결과가 됩니다. workflows

관행판정단이 값을 하는 조건은 후보들이 실제로 다른 각도여야 한다는 것입니다. 같은 프롬프트를 세 번 돌리면 세 번 비슷한 답이 나오고 다수결이 의미를 잃습니다. 각 후보에 명시적으로 다른 렌즈를 주는 편이 낫습니다(최소 구현 우선, 위험 우선, 사용자 경험 우선 같은 식으로).

마를 때까지

공식규모를 모르는 발견 작업(버그, 이슈, 엣지 케이스)에서는 라운드를 반복하고 새 라운드가 새것을 못 낼 때 멈추는 형태를 씁니다. 공식 예시 프롬프트가 "두 라운드 연속 새것이 없으면 멈춰라"로 이 조건을 적습니다. workflows

워크플로로 이 저장소의 간헐 실패 테스트를 찾아라. 스위트를 반복 실행해
간헐적으로 실패하는 테스트를 기록하고, 두 라운드 연속 새것이 없으면 멈춰라

관행이 형태에서 흔한 실수는 중복 판정의 기준을 잘못 잡는 것입니다. 이미 확정된 목록과 비교하면, 판정에서 탈락한 항목이 라운드마다 다시 올라와 영원히 수렴하지 않습니다. 비교 대상은 확정 목록이 아니라 지금까지 본 전부여야 합니다.

재개할 때 무엇이 살아남는가

공식런을 멈췄다가 재개하면 이미 끝난 에이전트는 대개 캐시된 결과를 돌려주고 나머지는 다시 돕니다. 규칙은 두 개입니다. 멈출 때 아직 돌고 있던 에이전트는 저장되지 않아서 재개 시 처음부터 하고, 재생은 에이전트가 시작한 순서를 따라서 캐시된 결과는 끝나지 않은 첫 에이전트에서 멈추며 그 뒤에 시작한 에이전트는 완료했더라도 전부 다시 돕니다. workflows

공식두 번째 규칙이 팬아웃 중간에 멈추는 것을 비싸게 만듭니다. A, B, C, D를 그 순서로 띄웠고 B가 도는 중에 멈췄다면, 재개 시 A는 캐시에서 오고 B는 끝난 적이 없어 다시 돌며, C와 D도 B보다 나중에 시작했으므로 멈추기 전에 완료했더라도 다시 돕니다. 그래서 많은 작은 에이전트로 팬아웃한 워크플로가 긴 에이전트 하나보다 진행을 더 많이 보존합니다. workflows

공식재개는 같은 클로드코드 세션 안에서만 됩니다. 워크플로가 도는 중에 클로드코드를 종료하면 다음 세션은 워크플로를 처음부터 시작합니다. workflows

설계 규칙 하나. 관행위 재생 규칙은 스크립트 설계에 직접 반영됩니다. 단계 하나에 오래 도는 에이전트를 하나 두지 말고, 같은 일을 여러 항목으로 쪼개 팬아웃하면 중단 비용이 낮아집니다. 이것은 중단 가능성에 대한 설계입니다.

28.4비용 통제

공식워크플로는 에이전트를 많이 띄우므로 한 런이 같은 작업을 대화로 처리하는 것보다 의미 있게 많은 토큰을 씁니다. 런은 다른 세션과 똑같이 플랜의 사용량과 속도 제한에 계산됩니다. 큰 작업에 들어가기 전 지출을 가늠하려면 작은 조각으로 먼저 돌려 봅니다(저장소 전체 대신 디렉터리 하나, 넓은 질문 대신 좁은 질문). /workflows 화면이 런 진행 중 에이전트별 토큰 사용량을 보여 주고 거기서 멈출 수 있습니다. workflows

규모 가이드라인

공식규모 가이드라인은 클로드가 워크플로를 쓸 때 목표로 삼을 에이전트 수를 알려 주는 값입니다. 상한이 아니라 조언으로 전달되므로, 다른 규모를 요구하는 프롬프트는 여전히 이깁니다. v2.1.202 이상이 필요합니다. workflows

값클로드가 목표로 하는 에이전트 수
unrestricted가이드라인 없음. 클로드가 작업에 맞게 규모를 정합니다
small5개 미만
medium15개 미만
large50개 미만

공식기본값은 medium입니다. 고르기 전에는 /config 행이 medium (default)로 보이고 워크플로의 백그라운드 실행 줄이 medium size (/config)를 보여 줍니다. v2.1.219 이상이 필요하고 그 전 버전은 unrestricted가 기본입니다. 바꾸려면 /config에서 값을 고르거나 /config workflowSizeGuideline=small을 돌리고, v2.1.219 이상에서는 설정 파일의 workflowSizeGuideline 키로도 둘 수 있습니다(설정 파일 값이 /config보다 우선하고, 설정 파일이 값을 주면 /config 행이 숨습니다). workflows

/config workflowSizeGuideline=small

커진 런을 알려 주는 경고

공식워크플로가 25개를 넘는 에이전트를 예정하거나 예상 토큰 총량이 150만을 넘으면, 입력창 아래 작업 패널의 진행 줄에 Large workflow 경고가 붙습니다. 경고는 /workflows를 가리키고 거기서 멈출 수 있습니다. v2.1.203 이상이 필요합니다. workflows

공식이 경고는 조언이라서 런을 멈추거나 제한하지 않습니다. 두 설정이 경고 시점을 바꿉니다. 규모 가이드라인을 직접 골랐다면 그 에이전트 수가 25개 기준을 대체하고(내장 기본 가이드라인은 25를 그대로 둡니다), ultracode가 켜진 세션은 이미 큰 런에 옵트인한 것이므로 경고가 나오지 않습니다. workflows

모델 비용

공식워크플로의 모든 에이전트는 스크립트가 특정 단계를 다른 모델로 보내거나 CLAUDE_CODE_SUBAGENT_MODEL 환경 변수가 설정된 경우를 빼면 세션의 모델을 씁니다(환경 변수는 둘 다 덮습니다). 통제 방법은 둘입니다. 평소 가벼운 작업에 작은 모델로 바꿔 쓴다면 큰 런 전에 /model을 확인하고, 작업을 설명할 때 가장 강한 모델이 필요하지 않은 단계에는 작은 모델을 쓰라고 함께 말합니다. workflows

공식조직의 availableModels 허용 목록이 스크립트가 요청한 모델을 막으면 그 에이전트는 대체 모델로 돌고, /workflows의 진행 화면이 요청한 모델과 대체된 모델을 함께 표시하는 경고를 냅니다. workflows

끄는 방법

공식워크플로는 CLI, 데스크톱, IDE 확장, claude -p의 비대화 모드, Agent SDK에서 쓸 수 있고 끄는 설정은 모든 표면에 같이 적용됩니다. 나만 끄려면 /config에서 Dynamic workflows를 끄거나, ~/.claude/settings.json에 "disableWorkflows": true를 두거나, CLAUDE_CODE_DISABLE_WORKFLOWS=1을 설정합니다. 조직 전체로 끄려면 관리형 설정에 같은 키를 두거나 관리자 페이지의 토글을 씁니다. 끄면 번들 워크플로 명령이 사라지고 ultracode 키워드가 발동하지 않으며 /effort 메뉴에서 ultracode가 빠집니다. workflows

실전필자의 볼트 설정에는 skipWorkflowUsageWarning: true가 들어 있습니다. 사용량 경고를 끄는 값을 켜 두고 실제 Workflow 호출은 1,864턴에서 2회뿐이라는 조합이 남아 있었습니다. 경고를 끈 것은 그 시점의 판단이었지만, 지금 상태에서는 그 값이 지키는 것이 없습니다. 큰 런을 돌리지 않으면서 큰 런 경고를 끈 설정은 나중에 규모를 키울 때 위험합니다. 자기 설정에서 같은 조합을 확인해 볼 만합니다.

# 워크플로 사용량 경고를 껐는데 실제로 워크플로를 쓰는지 대조한다
grep -o 'skipWorkflowUsageWarning[^,}]*' ~/.claude/settings.json
grep -ho '"name":"Workflow"' ~/.claude/projects/*/*.jsonl | wc -l

29

에이전트 팀

29.1팀 구성

실험 기능이고 기본으로 꺼져 있습니다. 공식CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1을 설정 파일이나 환경에 두어야 켜집니다. 그 변수가 없으면 세션 시작에 팀이 세팅되지 않고, 팀 디렉터리도 쓰이지 않고, 클로드가 동료를 띄우거나 제안하지도 않습니다. 세션 재개, 작업 조율, 종료 동작에 알려진 한계가 있습니다. agent-teams
{
  "env": {
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
  }
}

공식에이전트 팀은 여러 클로드코드 인스턴스를 함께 돌립니다. 한 세션이 팀 리드가 되어 일을 조율하고 배정하고 결과를 종합합니다. 동료는 각자 자기 컨텍스트 윈도우에서 독립적으로 일하고 서로 직접 통신합니다. 한 세션 안에서 돌며 메인 에이전트에게만 보고하는 서브에이전트와 달리, 리드를 거치지 않고 개별 동료와 직접 대화할 수 있습니다. agent-teams

공식서브에이전트와의 차이를 표로 두면 이렇습니다. 고르는 기준은 일꾼끼리 통신해야 하는가입니다. agent-teams

서브에이전트에이전트 팀
맥락자기 컨텍스트 윈도우. 결과가 호출자에게 돌아갑니다자기 컨텍스트 윈도우. 완전히 독립적입니다
통신메인 에이전트에게만 결과 보고동료끼리 직접 메시지
조율메인 에이전트가 모든 일을 관리공유 작업 목록으로 자기 조율
적합결과만 중요한 초점 작업논의와 협업이 필요한 복잡한 일
토큰 비용낮음. 결과가 메인 맥락으로 요약됩니다높음. 동료마다 별도 클로드 인스턴스입니다

공식가장 강한 사용처는 넷입니다. 조사와 리뷰(여러 동료가 문제의 다른 면을 동시에 파고 서로 발견을 공유하며 반박), 새 모듈이나 기능(각자 다른 조각을 소유), 경합 가설로 디버깅(다른 이론을 병렬로 시험해 답으로 수렴), 계층을 가로지르는 조율(프론트엔드, 백엔드, 테스트를 각각 다른 동료가 소유). agent-teams

공식반대로 팀은 조율 부담을 더하고 한 세션보다 상당히 많은 토큰을 씁니다. 동료가 독립적으로 움직일 수 있을 때 가장 잘 동작하고, 순차 작업이나 같은 파일 편집, 의존이 많은 일에는 한 세션이나 서브에이전트가 더 효과적입니다. agent-teams

띄우기

공식켠 뒤에는 작업과 원하는 동료를 자연어로 설명합니다. 클로드가 띄우고 프롬프트에 따라 일을 조율합니다. 세 역할이 독립적이고 서로 기다리지 않아도 되는 예가 잘 동작합니다. agent-teams

코드베이스의 TODO 주석을 추적하는 CLI 도구를 설계하려 한다.
동료 셋을 띄워 다른 각도에서 탐색하게 해라.
하나는 사용 경험, 하나는 기술 구조, 하나는 반대 입장(devil's advocate).

공식클로드가 팀 대신 서브에이전트를 쓰는 경우도 있습니다. 서브에이전트는 동료와 같은 에이전트 패널에 나타나므로 패널만 보고 팀이 만들어졌다고 확인할 수 없습니다. 서브에이전트를 띄운 것이라면 다시 요청하면서 에이전트 팀을 명시합니다. agent-teams

공식리드의 터미널은 프롬프트 입력 아래 에이전트 패널에 동료를 나열합니다. 위아래 화살표로 고르고, Enter로 그 동료의 트랜스크립트를 열어 직접 메시지를 보내고, Esc로 그 동료의 현재 턴을 끊습니다. x는 고른 동료를 멈추고 Ctrl+T는 작업 목록을 켜고 끕니다. agent-teams

표시 방식 두 가지

공식기본값은 "in-process"로 모든 동료가 메인 터미널 안에서 돕니다. 어느 터미널에서나 되고 추가 설정이 없습니다. 다른 하나는 분할 패널로 동료마다 자기 패널을 갖고 모두의 출력을 동시에 보며 클릭해 들어갑니다. tmux 또는 iTerm2가 필요합니다. v2.1.179 전에는 기본이 "auto"였으므로, 업그레이드한 세션은 명시하지 않으면 한 터미널에 머무릅니다. agent-teams

{
  "teammateMode": "auto"
}

공식한 세션만 바꾸려면 플래그로 넘깁니다. 이 플래그는 실험 기능이라 claude --help에 나오지 않습니다. agent-teams

claude --teammate-mode auto

모델과 노력 수준

공식동료는 기본적으로 리드의 /model 선택을 상속하지 않습니다. 프롬프트가 지정하지 않을 때 쓰는 모델을 바꾸려면 /config의 Default teammate model을 설정하고, 리드의 현재 모델을 따르게 하려면 Default (leader's model)을 고릅니다. 동료는 리드의 노력 수준을 상속합니다(분할 패널 모드에서는 v2.1.186부터). agent-teams

공식동료의 모델과 패스트 모드는 띄울 때 고정되므로 /model과 /fast는 리드 설정만 바꿉니다. v2.1.199부터 동료를 보는 중에 그 명령을 입력하면 변경이 리드에 적용된다는 안내가 나옵니다(그 전에는 표시 없이 리드에 적용됐습니다). /effort는 보고 있는 동료의 이후 턴에 적용됩니다. agent-teams

서브에이전트 정의를 동료로 재사용

공식동료를 띄울 때 프로젝트, 사용자, 플러그인, CLI 정의 중 어느 스코프의 서브에이전트 타입이든 참조할 수 있습니다. 역할을 한 번 정의해 위임 서브에이전트로도 쓰고 팀 동료로도 쓸 수 있습니다. 동료는 그 정의의 tools 허용 목록과 model을 지키고, 정의의 본문은 시스템 프롬프트를 대체하는 것이 아니라 추가 지시로 덧붙습니다. SendMessage와 작업 관리 도구 같은 팀 조율 도구는 tools가 다른 도구를 제한해도 항상 쓸 수 있습니다. agent-teams

security-reviewer 에이전트 타입으로 동료를 띄워 auth 모듈을 감사하게 해라

공식다만 서브에이전트 정의의 skills와 mcpServers 프론트매터는 동료로 돌 때 적용되지 않습니다. 동료는 일반 세션과 같이 프로젝트와 사용자 설정에서 스킬과 MCP 서버를 로드합니다. agent-teams

권한

공식동료는 리드의 권한 설정으로 시작합니다. 리드가 --dangerously-skip-permissions로 돌면 모든 동료도 그렇습니다. 띄운 뒤에는 개별 동료의 모드를 바꿀 수 있지만 띄우는 시점에 동료별 모드를 정할 수는 없습니다. 동료의 권한 프롬프트는 리드 세션에 뜨므로 거기서 직접 승인합니다. 계획 승인은 설계된 예외로, 리드 세션이 사람에게 별도로 묻지 않고 동료의 계획 승인을 처리합니다. agent-teams

공식에이전트 간 메시지에는 별도 안전장치가 있습니다. 한 에이전트가 SendMessage로 다른 에이전트에게 메시지를 보내면, 받는 에이전트는 그것이 사람이 아니라 다른 클로드 세션에서 왔다고 안내받습니다. 동료는 권한 프롬프트를 대신 승인하거나 사람의 동의를 공급할 수 없고, 어떤 행동을 거부당한 동료가 그것을 다른 동료에게 중계해 검사를 우회할 수도 없습니다. 자동 모드에서는 분류기가 두 가지를 더 검사합니다. 다른 에이전트가 중계한 승인 주장을 사람의 확인이 아니라 신뢰할 수 없는 입력으로 취급하고, 평문이든 종료 요청·계획 승인 응답 같은 구조화된 프로토콜 메시지든 전달 전에 검토해 차단한 메시지는 수신자에게 도달하지 않습니다. agent-teams

29.2작업 분배와 병합

공식팀은 네 부분으로 이루어집니다. 팀 리드(동료를 띄우고 일을 조율하는 메인 세션), 동료(각자 배정된 일을 하는 별도 인스턴스), 작업 목록(동료가 집어 완료하는 공유 항목), 받은 편지함(에이전트 간 통신). agent-teams

공식공유 작업 목록이 팀의 조율 장치입니다. 리드가 작업을 만들고 동료가 처리하며, 작업 상태는 대기, 진행 중, 완료 셋입니다. 작업은 다른 작업에 의존할 수 있고, 미해결 의존이 있는 대기 작업은 그 의존이 완료되기 전에는 집을 수 없습니다. 배정 방식은 둘로, 리드가 명시적으로 배정하거나 동료가 자기 작업을 끝낸 뒤 배정되지 않고 막히지 않은 다음 작업을 스스로 집습니다. 동시에 같은 작업을 집으려는 경합은 파일 락으로 막습니다. agent-teams

공식의존은 자동으로 풀립니다. 동료가 다른 작업들이 의존하는 작업을 완료하면 사람의 개입 없이 의존 작업들이 풀립니다. agent-teams

파일 충돌은 사람이 나눠야 합니다

공식이것이 팀에서 가장 중요한 제약입니다. 두 동료가 같은 파일을 편집하면 덮어쓰기가 됩니다. 동료마다 다른 파일 집합을 소유하게 일을 쪼개야 합니다. 에이전트 팀은 동료를 워크트리로 격리하지 않기 때문입니다. agent-teams agents

관행그래서 팀을 처음 쓸 때는 파일을 쓰지 않는 일부터 시작하는 편이 안전합니다. PR 리뷰, 라이브러리 조사, 버그 원인 조사가 그렇습니다. 공식 문서도 같은 순서를 권합니다. 경계가 분명하고 코드를 쓰지 않는 작업이 병렬 탐색의 값을 보여 주면서 병렬 구현의 조율 문제를 피하게 해 줍니다.

팀 크기와 작업 크기

공식동료 수에 하드 제한은 없지만 실질 제약이 셋입니다. 토큰 비용이 선형으로 늘고, 조율 부담이 커지고(통신, 작업 조율, 충돌 가능성), 어느 지점을 넘으면 동료를 더해도 비례해 빨라지지 않습니다. 대부분의 흐름에서 3~5명으로 시작하는 것이 권고이고, 독립 작업이 15개 있어도 동료 3명이 좋은 출발점입니다. 셋에 집중한 동료가 다섯이 흩어진 것보다 낫습니다. agent-teams

공식작업 크기는 너무 작으면 조율 부담이 이득을 넘고, 너무 크면 동료가 확인 없이 오래 일해 헛수고 위험이 커집니다. 적정선은 함수 하나, 테스트 파일 하나, 리뷰 하나처럼 분명한 산출물을 내는 자기완결 단위입니다. 리드가 작업을 쪼개 배정하는데 충분히 쪼개지 않으면 더 작게 나누라고 말합니다. 동료당 5~6개 작업이면 모두가 일하고 리드가 막힌 사람의 일을 재배정할 여지가 생깁니다. agent-teams

맥락은 상속되지 않습니다

공식동료는 띄워질 때 일반 세션과 같은 프로젝트 맥락(지침 파일, MCP 서버, 스킬)을 로드하고 리드의 띄우기 프롬프트를 받습니다. 그러나 리드의 대화 이력은 넘어가지 않습니다. 그래서 띄우기 프롬프트에 작업별 세부를 넣어야 합니다. agent-teams

보안 리뷰어 동료를 다음 프롬프트로 띄워라: "src/auth/ 의 인증 모듈을
보안 취약점 관점에서 리뷰하라. 토큰 처리, 세션 관리, 입력 검증에 집중하라.
이 앱은 httpOnly 쿠키에 저장된 JWT 토큰을 쓴다. 발견한 문제를 심각도와
함께 보고하라."

공식정보 공유는 네 경로입니다. 동료가 보낸 메시지는 수신자에게 자동 전달되므로 리드가 폴링하지 않습니다. 동료가 끝나고 멈추면 리드에게 자동으로 알립니다(v2.1.198부터, API 오류로 턴이 끝난 동료는 정상 종료처럼 보이는 대신 실패를 오류 텍스트와 함께 알립니다). 공유 작업 목록으로 모든 에이전트가 상태를 보고 남은 일을 집습니다. 동료끼리는 이름으로 특정 동료에게 보내고, 전체에게 보내려면 수신자마다 한 통씩 보냅니다. agent-teams

품질 게이트를 훅으로

공식동료가 일을 끝내거나 작업이 만들어지고 완료될 때 규칙을 강제하려면 훅을 씁니다. TeammateIdle은 동료가 유휴 상태로 가려 할 때 돌고 종료 코드 2로 피드백을 보내며 계속 일하게 합니다. TaskCreated는 작업 생성 시점에 돌고 코드 2로 생성을 막고 피드백을 보냅니다. TaskCompleted는 완료 표시 시점에 돌고 코드 2로 완료를 막습니다. agent-teams

알려진 한계를 먼저 읽습니다. 공식세션 재개가 in-process 동료를 복원하지 않습니다(/resume과 /rewind 후 리드가 없는 동료에게 메시지를 보내려 할 수 있으니, 그러면 새로 띄우라고 말합니다). 작업 상태가 밀릴 수 있고(동료가 완료 표시를 놓쳐 의존 작업이 막힙니다), 종료가 느릴 수 있고, 세션당 팀은 하나이며, 동료는 자기 동료를 띄울 수 없고, 리드는 그 세션의 수명 동안 고정이라 동료를 리드로 승격할 수 없습니다. agent-teams

공식팀과 작업은 세션에서 파생된 이름으로 로컬에 저장됩니다. 이름은 session- 뒤에 세션 ID 앞 여덟 글자입니다. 팀 설정은 ~/.claude/teams/{팀이름}/config.json, 작업 목록은 ~/.claude/tasks/{팀이름}/입니다. 팀 설정 디렉터리는 세션이 끝날 때 제거되고, 작업 목록 디렉터리는 로컬에 남아 업로드되지 않으므로 재개한 세션이 작업을 유지합니다. 팀 설정은 세션 ID와 tmux 패널 ID 같은 런타임 상태를 담으므로 손으로 고치거나 미리 만들지 않습니다(다음 상태 갱신에 덮어써집니다). agent-teams

실전필자의 볼트에서 ~/.claude/teams는 비어 있습니다. 에이전트 팀을 한 번도 쓰지 않았다는 뜻이고, 이유는 위의 제약 두 개였습니다. 이 볼트의 병렬 작업은 대부분 같은 문서를 여러 각도로 고치는 형태여서 파일 소유를 나누기 어려웠고, 서브에이전트로 위임한 뒤 결과를 한 대화에서 합치는 편이 충돌 위험이 없었습니다. 팀이 맞는 형태는 파일 소유가 자연스럽게 갈리는 코드베이스 작업입니다.

ls ~/.claude/teams ~/.claude/tasks 2>/dev/null

30

격리: 워크트리

30.1왜 격리가 필요한가

공식git 워크트리는 자기 파일과 브랜치를 가진 별도 작업 디렉터리로, 같은 저장소 이력과 원격을 메인 체크아웃과 공유합니다. 각 클로드코드 세션을 자기 워크트리에서 돌리면 한 세션의 편집이 다른 세션의 파일에 닿지 않으므로, 한 세션이 기능을 만들면서 두 번째 세션이 버그를 고칠 수 있습니다. worktrees

공식워크트리는 git 저장소를 요구합니다. 다른 버전 관리 시스템에서는 훅으로 git 로직을 대체합니다. 데스크톱 앱에서는 모든 새 세션이 자동으로 자기 워크트리를 받습니다. worktrees

공식병렬 수단들 사이에서 워크트리의 자리는 분명합니다. 워크트리는 파일 편집을 격리하고, 서브에이전트와 에이전트 팀은 일 자체를 조율합니다. 둘은 대체재가 아니라 다른 층입니다. worktrees

격리가 없을 때 생기는 것

덮어쓰기는 조용하고 나중에 발견됩니다

공식에이전트 팀에서 두 동료가 같은 파일을 편집하면 덮어쓰기가 됩니다. 그래서 공식 문서가 동료마다 다른 파일 집합을 소유하게 일을 쪼개라고 명시합니다. agent-teams

관행병렬에서 가장 비싼 실패가 이것인 이유는 즉시 오류가 나지 않기 때문입니다. 두 세션이 각자 성공했다고 보고하고, 사라진 변경은 나중에 테스트가 깨지거나 사람이 파일을 열었을 때 발견됩니다. 그 시점에는 어느 세션의 무엇이 사라졌는지 되짚기 어렵습니다.

30.2워크트리 운용

공식--worktree 또는 -w에 이름을 주면 격리된 워크트리를 만들고 그 안에서 클로드를 시작합니다. 기본 위치는 저장소 루트의 .claude/worktrees/<이름>/이고 브랜치 이름은 worktree-<이름>입니다. 다른 터미널에서 다른 이름으로 다시 돌리면 두 번째 격리 세션이 시작됩니다. 이름을 생략하면 클로드가 하나 만들어 줍니다. worktrees

claude --worktree feature-auth

공식대화형 실행은 작업 공간 신뢰를 요구합니다. 그 디렉터리에서 클로드를 돌려 본 적이 없으면 먼저 claude를 한 번 돌려 신뢰 대화상자를 수락해야 하고, 그렇지 않으면 --worktree가 오류로 종료합니다. -p 비대화 실행은 신뢰 검사를 건너뜁니다. worktrees

먼저 할 일 하나. 공식.claude/worktrees/를 .gitignore에 넣습니다. 그러지 않으면 워크트리 내용이 메인 체크아웃에서 추적되지 않은 파일로 보입니다. worktrees

공식워크트리는 새 체크아웃이므로 개발 환경을 거기서 초기화해야 합니다. 클로드에게 의존성을 설치하게 하거나 직접 프로젝트 세팅을 돌립니다. .env 같은 gitignore된 파일을 새 워크트리마다 자동으로 가져가려면 프로젝트 루트에 .worktreeinclude 파일을 둡니다. 이 파일은 .gitignore 문법을 쓰고, 패턴에 맞으면서 gitignore된 파일만 복사되므로 추적되는 파일이 중복되지 않습니다. worktrees

.env
.env.local
config/secrets.json

세션 중에 들어가기

공식세션 중에 "워크트리에서 작업해 달라"고 하면 클로드가 EnterWorktree 도구로 하나 만듭니다. 워크트리 안에 들어간 뒤에는 .claude/worktrees/ 아래의 다른 워크트리로 바로 옮길 수 있고, 이전 워크트리는 디스크에 그대로 남습니다. worktrees

공식저장소의 .claude/worktrees/ 밖 경로로 들어갈 때는 클로드코드가 먼저 승인을 받습니다. 그 이동이 세션의 작업 디렉터리와 쓰기 권한, 지침 파일과 설정 같은 프로젝트 구성을 그 위치로 옮기기 때문입니다. EnterWorktree 권한 규칙이나 "다시 묻지 않기"로 이 프롬프트를 없앨 수 없고, bypassPermissions 모드만 건너뜁니다. worktrees

격리가 실제로 강제되는 방식

공식세션이 워크트리에 격리돼 있는 동안(--worktree로 시작했든, 클로드가 들어갔든, 워크트리 세션을 재개했든), 클로드코드가 메인 체크아웃에 닿는 도구 호출을 차단합니다. 같은 강제가 그 세션이 띄운 모든 서브에이전트에도 적용되고, 대화형이든 백그라운드든 마찬가지입니다. 검사는 셋입니다. worktrees

검사막는 것
파일 편집메인 체크아웃 경로를 대상으로 하는 Edit, Write, NotebookEdit
명령 작업 디렉터리작업 디렉터리가 메인 체크아웃으로 풀리는 Bash·PowerShell·Monitor 명령, 그리고 밖에 머무는지 검증할 수 없는 것
git 리다이렉트git -C, --git-dir, GIT_DIR·GIT_WORK_TREE 변수, git 실행 전 메인 체크아웃으로 cd 하는 것. 워크트리 안에 머무는지 검증할 수 없는 명령도 함께

공식클로드는 각 거부를 도구 오류로 보고, 그 오류가 워크트리 이름과 어떻게 진행할지를 알려 줍니다. PowerShell 명령에는 작업 디렉터리 검사만 적용됩니다. worktrees

서브에이전트를 워크트리로 격리

공식서브에이전트도 자기 워크트리에서 돌 수 있습니다. "에이전트에 워크트리를 써 달라"고 하거나, 커스텀 서브에이전트 프론트매터에 isolation: worktree를 넣어 항구적으로 만듭니다. worktrees

---
name: refactorer
description: Applies mechanical refactors across many files
isolation: worktree
---

요청된 리팩토링을 영향받는 모든 파일에 적용한 뒤 테스트를 돌리고 결과를 보고하라.

공식각 서브에이전트는 임시 워크트리를 받고, 변경 없이 끝나면 클로드코드가 자동으로 제거합니다. 변경이 있는 워크트리는 정기 청소가 작업을 잃지 않고 제거할 수 있을 때까지 디스크에 남습니다. 서브에이전트 워크트리는 --worktree와 같은 기준 브랜치를 쓰므로, worktree.baseRef가 "head"가 아니면 저장소 기본 브랜치에서 분기합니다. worktrees

기준 브랜치

공식새 워크트리는 저장소 기본 브랜치에서 분기하므로 대부분의 세션은 이 설정이 필요 없습니다. 지금 작업에서 분기하려면 worktree.baseRef를 설정합니다. 값은 둘입니다. worktrees

값동작
"fresh"(기본)원격의 기본 브랜치(보통 main)에서 분기해 원격과 일치하는 깨끗한 트리로 시작합니다
"head"지금 로컬 HEAD에서 분기해 푸시하지 않은 커밋과 기능 브랜치 상태를 가져갑니다. 진행 중인 작업 위에서 서브에이전트를 격리할 때 씁니다

공식브랜치 이름을 worktree.baseRef에 넣을 수는 없습니다. 특정 기존 브랜치에서 시작하려면 git으로 직접 만듭니다. "fresh"일 때 클로드코드는 origin/HEAD를 최신으로 유지하는데, 24시간 안에 페치하지 않았으면 기본 브랜치를 페치하고(5초 상한) 실패하면 로컬 캐시 ref를 씁니다. 원격이 없거나 캐시도 없고 페치도 안 되면 지금 로컬 HEAD로 물러납니다. worktrees

공식특정 PR에서 분기하려면 --worktree에 #을 붙인 PR 번호나 전체 GitHub PR URL을 넘깁니다. pull/<번호>/head를 origin에서 페치하고 .claude/worktrees/pr-<번호>에 만듭니다. 셸이 #을 주석 시작으로 보지 않게 인자를 인용합니다. worktrees

claude --worktree "#1234"

정리

공식대화형 워크트리 세션을 나갈 때 클로드가 제거하면 사라질 작업(변경·미추적 파일, 새 커밋)이 있는지 확인합니다. 워크트리가 깨끗하면 이름 없는 세션은 워크트리와 브랜치를 자동으로 제거하고, 이름 붙은 세션은 나중을 위해 남길 수 있게 먼저 묻습니다. 작업이 있으면 유지할지 제거할지 묻고, 제거하면 디렉터리와 브랜치와 그 안의 모든 작업이 삭제됩니다. -p 비대화 실행은 종료 프롬프트가 없어 정리하지 않으므로 git worktree remove로 지웁니다. worktrees

공식서브에이전트와 백그라운드 세션용 워크트리는 정기 청소가 cleanupPeriodDays보다 오래된 것을 제거합니다. 청소는 작업이 남은 워크트리(변경·미추적 파일, 푸시하지 않은 커밋)를 건너뛰고, --worktree로 만든 것은 절대 제거하지 않습니다. 에이전트가 도는 동안 클로드가 그 워크트리에 git worktree lock을 걸어 동시 청소가 제거하지 못하게 하고, 끝나면 풉니다. 죽은 백그라운드 세션이 남긴 락도 청소가 풀어 주지만, 사람이 직접 건 락은 풀지 않습니다. worktrees

git worktree list
git worktree remove ../project-feature-a
# 변경이나 미추적 파일이 있으면
git worktree remove --force ../project-feature-a

메인 체크아웃과 공유하는 것

공식워크트리는 자기 파일과 브랜치를 갖지만 셋을 메인 체크아웃과 공유합니다. 저장소의 .git 디렉터리(그래서 샌드박스를 켜도 워크트리 안에서 git commit이 됩니다), 프로젝트 스코프로 설치한 플러그인(워크트리마다 다시 설치할 필요가 없습니다, v2.1.200 이상), 저장된 권한 승인(워크트리 세션에서 "다시 묻지 않기"를 고르면 메인 체크아웃의 .claude/settings.local.json에 저장되므로 모든 워크트리에 적용되고 워크트리가 제거돼도 남습니다, v2.1.211 이상). worktrees

git이 아닌 버전 관리

공식SVN, Perforce, Mercurial 등에서는 WorktreeCreate와 WorktreeRemove 훅으로 생성과 정리 로직을 제공합니다. 훅이 기본 git 동작을 대체하므로 --worktree를 쓸 때 .worktreeinclude는 처리되지 않고, 로컬 설정 파일 복사를 훅 스크립트 안에서 해야 합니다. worktrees

30.3한 레포 여러 에이전트 구조

여기까지가 워크트리 기능입니다. 이 절은 그것을 실제 구조로 조립하는 이야기입니다. 한 저장소에서 여러 에이전트를 돌릴 때 무너지는 지점은 대개 셋인데, 격리는 그중 하나만 해결합니다.

기둥없으면 생기는 일수단
격리 두 에이전트가 같은 파일을 덮어써 작업이 조용히 사라집니다 워크트리(--worktree, isolation: worktree, 백그라운드 세션의 자동 격리)
추적 무엇이 돌고 있고 무엇이 막혀 있는지 몰라 사람이 병목이 됩니다 에이전트 뷰, /tasks, /workflows, claude agents --json
수렴 결과가 각자 다른 물건이 되어 합칠 수 없습니다 공유 픽스처, 돌릴 수 있는 검사, 적대적 검증(27.4, 28.3)

공식추적 기둥에는 스크립트로 쓸 수 있는 출구가 있습니다. 모든 백그라운드 세션은 짧은 ID를 갖고, 그 ID는 ~/.claude/jobs/ 아래 디렉터리 이름입니다. claude agents --json은 세션을 JSON 배열로 출력하고 종료하며, claude agents --cwd <경로>는 그 경로 아래에서 시작된 세션만 봅니다. 에이전트 뷰를 열지 않고 상태를 다루고 싶을 때 씁니다. agent-view

claude agents --json
claude agents --cwd ~/dev/myapp

실전필자의 볼트에서 이 세 기둥의 실제 상태를 재 보면 격리 0, 추적 부분, 수렴 있음입니다. 워크트리와 백그라운드 세션은 0건이고, 추적은 작업 목록으로 했으며(TaskCreate 173회, TaskUpdate 309회, TaskStop 25회), 수렴은 문서 검증기와 빌드 게이트로 했습니다. 격리가 0인데 사고가 없었던 이유는 같은 파일을 동시에 고치는 병렬을 애초에 만들지 않았기 때문이지, 안전해서가 아닙니다.

이 관찰에서 나오는 판단 기준을 남깁니다. 격리는 병렬의 필수 부품이 아니라 특정 조건의 부품입니다. 조건은 하나입니다. 두 에이전트가 같은 파일을 쓸 가능성이 있는가. 답이 예라면 워크트리 없이 병렬을 돌리지 않습니다. 답이 아니오라면 워크트리는 관리 부담만 늘립니다.

병렬 구조 점검
  • 격리: 두 에이전트가 같은 파일을 쓸 수 있는가. 예라면 격리 수단이 정해져 있는가.
  • 추적: 지금 무엇이 돌고 있는지 명령 한 줄로 알 수 있는가.
  • 수렴: 결과의 합격 여부를 사람 눈이 아니라 검사로 판정하는가.
  • 정리: 끝난 워크트리와 브랜치가 자동으로 사라지는가, 아니면 쌓이고 있는가.
  • 비용: 병렬로 얻는 시간이 배수로 늘어난 토큰을 정당화하는가.

31

스케줄과 무인 실행

31.1루틴(클라우드)

공식루틴은 저장된 클로드코드 구성입니다. 프롬프트, 저장소 하나 이상, 커넥터 집합을 한 번 묶어 두고 자동으로 돌립니다. Anthropic이 운영하는 클라우드 인프라(또는 조직의 자체 호스팅 환경)에서 실행되므로 노트북을 닫아도 계속 동작합니다. 연구 프리뷰이며 동작과 한계, API 표면이 바뀔 수 있습니다. routines

공식트리거는 세 종류이고 한 루틴에 여러 개를 붙일 수 있습니다. 일정(매시, 야간, 주간 같은 반복이나 미래 특정 시각 한 번), API(루틴별 엔드포인트에 베어러 토큰으로 HTTP POST), GitHub(PR이나 릴리스 같은 저장소 이벤트). 예를 들어 PR 리뷰 루틴이 야간에 돌고 배포 스크립트에서 호출되며 새 PR마다 반응하게 할 수 있습니다. routines

공식Pro, Max, Team, Enterprise 플랜에서 클로드코드 웹이 켜져 있으면 쓸 수 있습니다. 웹에서 만들고 관리하거나 CLI에서 /schedule로 만듭니다. Team과 Enterprise 소유자는 관리자 설정의 Routines 토글로 전체 멤버에게 끌 수 있고, 끄면 기존 루틴이 멈추고 새로 만들 수 없습니다. routines

/schedule 매일 오전 9시에 PR 리뷰

# 목록·수정·즉시 실행
/schedule list
/schedule update
/schedule run

공식/schedule은 CLI에서 일정 트리거 루틴만 만듭니다. API나 GitHub 트리거를 붙이려면 웹에서 루틴을 편집합니다. 별칭은 /routines입니다. routines

루틴은 승인 없이 자율로 돕니다. 공식루틴은 완전한 클라우드 세션으로 자율 실행되며 권한 모드 선택기도 승인 프롬프트도 없습니다. 셸 명령을 돌리고, 클론된 저장소의 스킬을 쓰고, 포함한 커넥터를 호출할 수 있습니다. 무엇에 닿을 수 있는지는 고른 저장소, 환경의 네트워크 접근과 변수, 포함한 커넥터가 정하므로 그 셋을 실제 필요한 범위로 좁힙니다. routines

공식커넥터는 기본으로 연결된 것 전부가 포함됩니다. 루틴이 필요 없는 것은 지웁니다. 런 중에 클로드가 포함된 커넥터의 모든 도구를 쓰기 포함해 권한을 묻지 않고 쓸 수 있기 때문입니다. routines

공식루틴은 개인 claude.ai 계정에 속하고 팀원과 공유되지 않습니다. 커넥터와 GitHub 신원으로 하는 일은 모두 내 이름으로 나타납니다. 커밋과 PR은 내 GitHub 사용자로, Slack 메시지나 Linear 티켓은 내 연결 계정으로 찍힙니다. routines

프롬프트가 가장 중요한 부분입니다

공식루틴이 자율로 돌기 때문에 프롬프트는 자기완결적이고 무엇을 할지와 성공이 무엇인지 명시적이어야 합니다. 트리거가 발동하면 세션은 저장된 프롬프트를 배정된 작업으로 받아 수행합니다. 대화 중간에 도착한 신뢰할 수 없는 내용으로 취급하지 않습니다. 트리거는 그 프롬프트가 내 계정의 인가된 세션이 미리 저장해 둔 것이라는 사실만 증명하므로, 발동된 프롬프트는 실시간 사용자 입력이 아니고 런 중 행동에 대한 승인이나 동의로 작용할 수 없습니다. 런 중에 세션이 가져온 내용은 평소의 취급을 유지합니다. routines

공식API 트리거의 본문은 text 필드로 런별 맥락(경고 본문, 실패 로그)을 넘길 수 있습니다. 값은 자유 텍스트이고 파싱되지 않으므로 JSON을 보내면 문자 그대로 도착합니다. 중요한 것은 그 값이 맨 메시지로 오지 않는다는 점입니다. <routine-fire-payload> 블록에 감싸여 신뢰할 수 없는 데이터로 표시되고, 루틴 자체의 프롬프트가 그렇게 하라고 하지 않으면 그 안의 지시를 따르지 말라는 안내가 붙습니다. 그래서 루틴 프롬프트가 페이로드를 명시적으로 참조해야 합니다("routine-fire-payload 블록에 기술된 경고를 조사하라"). 베어러 토큰을 가진 누구나 text를 보낼 수 있으므로, 이 감싸기가 유출된 토큰의 텍스트를 지시가 아니라 데이터로 도착하게 만듭니다. routines

curl -X POST https://api.anthropic.com/v1/claude_code/routines/<routine-id>/fire \
  -H "Authorization: Bearer <token>" \
  -H "anthropic-beta: experimental-cc-routine-2026-04-01" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"text": "Sentry alert SEN-4521 fired in prod."}'

공식토큰은 루틴별이고 그 루틴 발동에만 스코프가 잡힙니다. 생성 시 한 번만 표시되고 나중에 다시 볼 수 없으므로 경고 도구의 비밀 저장소 같은 곳에 바로 보관합니다. 회전과 폐기는 같은 모달에서 합니다. routines

공식일정 트리거는 프리셋(매시, 매일, 평일, 주간)을 고르고, 시각은 내 지역 시간대로 입력해 자동 변환되므로 클라우드 인프라 위치와 무관하게 그 벽시계 시각에 돕니다. 스태거 때문에 예정 시각보다 몇 분 뒤에 시작할 수 있고 오프셋은 루틴마다 일정합니다. 프리셋에 없는 간격은 가장 가까운 프리셋을 고른 뒤 CLI의 /schedule update로 cron 식을 지정합니다. 최소 간격은 1시간이고 더 자주 도는 식은 거부됩니다. routines

공식GitHub 트리거는 PR과 릴리스 두 범주를 지원하고, 범주 안에서 특정 액션(예: pull_request.opened)이나 전체 액션을 고릅니다. PR 필터는 작성자, 제목, 본문, 기준 브랜치, 헤드 브랜치, 라벨, 초안 여부, 병합 여부이고 각각 같음·포함·시작·목록 안·목록 밖·정규식 연산자와 짝지어집니다. 모든 조건이 맞아야 발동합니다. 정규식은 필드 전체를 검사하므로 제목에 hotfix가 들어간 것을 잡으려면 .*hotfix.*로 써야 하고, 부분 문자열만 원하면 contains를 씁니다. routines

초록 상태가 성공을 뜻하지 않습니다. 공식런 목록의 초록 상태는 세션이 시작되어 인프라 오류 없이 종료됐다는 뜻이고, 프롬프트의 작업이 성공했다는 뜻이 아닙니다. 런을 열어 트랜스크립트를 읽고 클로드가 실제로 한 것을 확인해야 합니다. 차단된 네트워크 요청, 없는 커넥터 도구, 작업 수준 실패는 상태 표시가 아니라 거기서 드러납니다. routines

공식브랜치 권한에도 규칙이 있습니다. 클로드는 claude/ 접두 브랜치로 푸시하고 이것은 항상 허용됩니다. 프롬프트가 다른 브랜치로 푸시하게 지시하면 클로드코드가 먼저 확인해서, 브랜치가 GitHub에서 보호돼 있거나 다른 사람이 그 브랜치로 PR을 열어 뒀거나 내가 아닌 사람이 작성한 커밋이 있으면 거부합니다. routines

공식사용량은 대화형 세션과 같이 구독을 소진하고, 그에 더해 계정당 하루 시작 가능한 런 수에 상한이 있습니다. 하루 상한이나 구독 한도에 닿으면 사용 크레딧을 켠 조직은 미터링 초과로 계속 돌 수 있고, 크레딧이 없으면 창이 리셋될 때까지 거부됩니다. 한 번만 도는 일회성 런은 하루 루틴 상한에 계산되지 않습니다. routines

31.2데스크톱 예약 작업

공식데스크톱 예약 작업은 정한 시각과 빈도에 새 세션을 자동으로 시작합니다. 매일 코드 리뷰, 의존성 갱신 확인, 캘린더와 받은 편지함을 훑는 아침 브리핑 같은 반복 작업에 씁니다. 데스크톱의 Routines 페이지에서 로컬 작업과 원격 루틴을 모두 만들 수 있고, Local을 고르면 이 로컬 작업, Cloud를 고르면 루틴이 됩니다. desktop-scheduled-tasks

공식로컬 작업의 특징은 내 파일과 도구에 직접 닿는다는 것이고, 대가는 앱이 열려 있고 컴퓨터가 깨어 있을 때만 발동한다는 것입니다. 필드는 이름(소문자 케밥으로 변환돼 디스크 폴더 이름이 되며 유일해야 합니다), 설명, 지시(권한 모드와 모델 선택기, 작업 폴더, 격리 워크트리 사용 여부를 함께 고릅니다), 일정입니다. 폴더는 저장 전에 필수이고 신뢰하지 않은 폴더면 신뢰를 먼저 묻습니다. desktop-scheduled-tasks

공식기본적으로 예약 작업은 작업 디렉터리의 현재 상태에서 돌고 커밋하지 않은 변경도 포함합니다. 작업 생성 시 워크트리 토글을 켜면 매 실행이 자기 격리 git 워크트리를 받습니다. desktop-scheduled-tasks

공식일정 프리셋은 Manual(일정 없이 Run now로만), Hourly, Daily(시각 선택기, 기본 오전 9시), Weekdays(주말 제외), Weekly(시각과 요일)입니다. 프리셋에 없는 간격(15분마다, 매월 1일, 미래 특정 시각 한 번)은 데스크톱 세션에서 평문으로 요청합니다. desktop-scheduled-tasks

공식데스크톱은 앱이 열려 있는 동안 매분 일정을 확인하고 작업이 도래하면 새 세션을 시작합니다. 열어 둔 수동 세션과 독립적입니다. 각 작업은 API 트래픽을 분산하려고 예정 시각 뒤 몇 분의 결정적 지연을 받으므로 같은 작업은 항상 같은 오프셋에 시작합니다. 발동하면 데스크톱 알림이 오고 사이드바의 Scheduled 섹션에 새 세션이 나타납니다. desktop-scheduled-tasks

놓친 실행은 하나만 따라잡습니다

공식앱이 시작하거나 컴퓨터가 깨어날 때, 데스크톱은 각 작업이 지난 7일 안에 놓친 실행이 있는지 확인합니다. 있으면 가장 최근에 놓친 시각에 대해 정확히 한 번 따라잡기 실행을 시작하고 더 오래된 것은 버립니다. 매일 도는 작업이 6일을 놓쳤으면 깨어날 때 한 번 돕니다. desktop-scheduled-tasks

공식이 동작이 프롬프트 작성에 영향을 줍니다. 오전 9시로 예약한 작업이 컴퓨터가 하루 자 있었다면 밤 11시에 돌 수 있습니다. 타이밍이 중요하면 프롬프트 자체에 가드레일을 넣습니다. 예를 들어 "오늘 커밋만 리뷰하라. 오후 5시가 지났으면 리뷰를 건너뛰고 놓친 것의 요약만 올려라"처럼. desktop-scheduled-tasks

공식권한은 작업마다 자기 모드를 갖습니다. ~/.claude/settings.json의 allow 규칙도 예약 작업 세션에 적용됩니다. Manual 모드로 도는 작업이 권한 없는 도구를 써야 하면 승인할 때까지 실행이 멈추고 세션은 사이드바에 열린 채 남아 나중에 답할 수 있습니다. 멈춤을 피하려면 작업을 만든 뒤 Run now를 눌러 권한 프롬프트를 지켜보며 각각 "always allow"를 고릅니다. 이후 실행은 같은 도구를 자동 승인합니다. desktop-scheduled-tasks

공식작업 프롬프트는 디스크의 ~/.claude/scheduled-tasks/<작업이름>/SKILL.md에 있습니다. YAML 프론트매터에 name과 description이 있고 본문이 프롬프트입니다. 변경은 다음 실행에 적용됩니다. 일정, 폴더, 모델, 활성 상태는 이 파일에 없으므로 편집 화면이나 클로드를 통해 바꿉니다. desktop-scheduled-tasks

공식도는 세션 안에서 작업이 update_scheduled_task MCP 도구로 자기 일정이나 프롬프트를 바꿀 수도 있습니다. 발견한 것에 따라 스스로 재예약하게 하는 용도입니다(릴리스 브랜치가 생긴 것을 감지하면 코드 리뷰를 더 이르게 옮기는 식). desktop-scheduled-tasks

실전필자의 볼트에는 데스크톱 예약 작업이 2건 있습니다. 하나는 주간 반복으로, 뉴스 큐레이션 파이프라인의 발행 대기열을 트렌드 스캔으로 보완합니다(발행은 하지 않고 대기열만 갱신하는 것이 프롬프트에 명시돼 있습니다). 다른 하나는 일회성으로, 전날 이미지 생성 일일 한도에 걸려 대기 중이던 작업을 한도가 리셋될 것으로 예상되는 시각에 재개하게 했습니다. 두 프롬프트 모두 자기완결적으로 쓰여 있고 절차 문서 경로를 본문에 담고 있습니다.

ls ~/.claude/scheduled-tasks/
head -5 ~/.claude/scheduled-tasks/*/SKILL.md

실전이 두 사례에서 나온 규칙이 하나 있습니다. 예약 작업의 프롬프트는 "무엇을 하지 말지"를 함께 적어야 합니다. 위 주간 작업의 설명에 "발행은 안 함, 대기열만 갱신"이 들어 있는 이유가 그것입니다. 자율 실행에서는 사람이 중간에 범위를 좁힐 기회가 없으므로, 범위 상한을 프롬프트가 들고 있어야 합니다. 일회성 작업에도 같은 원리가 적용됩니다. "한도가 리셋됐을 것으로 예상되는 시각"이라는 전제가 틀릴 수 있으므로 프롬프트가 먼저 상태를 확인하게 씌어 있어야 합니다.

31.3세션 안에서 반복

공식세션 범위 예약은 지금 대화 안에 살고 새 대화를 시작하면 멈춥니다. --resume이나 --continue로 재개하면 만료되지 않은 작업이 돌아옵니다(지난 7일 안에 만든 반복 작업, 또는 예정 시각이 지나지 않은 일회성). 배포를 폴링하거나 PR을 지켜보거나 오래 도는 빌드를 다시 확인하거나 세션 후반에 무언가를 상기시킬 때 씁니다. scheduled-tasks

공식/loop은 번들 스킬이고, 간격과 프롬프트가 모두 선택 사항이며 무엇을 주는지가 동작을 정합니다. scheduled-tasks

주는 것예일어나는 일
간격과 프롬프트/loop 5m check the deploy고정 일정으로 그 프롬프트가 돕니다
프롬프트만/loop check the deploy매 회전마다 클로드가 고른 간격으로 돕니다
간격만, 또는 아무것도/loop내장 유지보수 프롬프트가 돕니다(loop.md가 있으면 그것)

공식간격을 주면 클로드가 cron 식으로 바꿔 예약하고 주기와 작업 ID를 확인해 줍니다. 간격은 앞에 30m처럼 붙거나 뒤에 every 2 hours처럼 올 수 있고, 단위는 s, m, h, d입니다. 초는 cron 입자도가 1분이라 분 단위로 올림되고, 7m이나 90m처럼 깔끔한 cron 단계로 안 떨어지는 간격은 가장 가까운 것으로 반올림하며 클로드가 무엇을 골랐는지 알려 줍니다. scheduled-tasks

공식간격을 생략하면 클로드가 고정 cron이 아니라 동적으로 고릅니다. 매 회전 뒤 관찰한 것에 따라 1분에서 1시간 사이 지연을 정합니다(빌드가 끝나가거나 PR이 활발하면 짧게, 대기 중인 것이 없으면 길게). 고른 지연과 이유가 회전 끝에 출력됩니다. 이때 클로드가 Monitor 도구를 직접 쓸 수도 있는데, 백그라운드 스크립트를 돌리고 출력 줄을 스트리밍해 폴링 자체를 없애므로 대개 토큰 효율이 좋고 반응이 빠릅니다. scheduled-tasks

공식프롬프트를 생략하면 내장 유지보수 프롬프트가 돕니다. 매 회전마다 순서대로 대화의 미완 작업을 이어 가고, 현재 브랜치의 PR을 돌보고(리뷰 코멘트, 실패한 CI, 병합 충돌), 대기 중인 것이 없으면 버그 사냥이나 단순화 같은 정리 패스를 돕니다. 클로드는 그 범위 밖의 새 이니셔티브를 시작하지 않고, 푸시나 삭제 같은 되돌릴 수 없는 행동은 트랜스크립트가 이미 인가한 것을 이어 갈 때만 진행합니다. scheduled-tasks

공식내장 프롬프트를 내 것으로 바꾸려면 loop.md를 둡니다. 프로젝트 .claude/loop.md가 사용자 ~/.claude/loop.md보다 우선하고, 명령줄에 프롬프트를 주면 무시됩니다. 편집은 다음 회전에 적용되므로 루프가 도는 중에도 지침을 다듬을 수 있고, 25,000바이트를 넘는 내용은 잘립니다. scheduled-tasks

공식일회성 알림은 /loop 대신 평문으로 요청합니다. 클로드가 한 번 발동하고 스스로 삭제되는 작업을 예약하고, cron 식으로 분과 시를 고정해 언제 발동할지 확인해 줍니다. scheduled-tasks

45분 뒤에 통합 테스트가 통과했는지 확인해 줘

공식배후 도구는 셋입니다. CronCreate(5필드 cron 식, 돌릴 프롬프트, 반복 여부), CronList(ID·일정·프롬프트), CronDelete(ID로 취소). 각 작업은 8글자 ID를 갖고 한 세션이 동시에 최대 50개를 보유합니다. scheduled-tasks

지터와 7일 만료

공식모든 세션이 같은 벽시계 순간에 API를 치지 않도록 스케줄러가 결정적 오프셋을 더합니다. 반복 작업은 예정 시각 뒤 최대 30분(시간당보다 자주 도는 작업은 간격의 절반까지) 안에 발동하므로 :00으로 예약한 매시 작업이 :30까지 어디서나 발동할 수 있습니다. 일회성 작업은 정시나 반시로 예약하면 최대 90초 일찍 발동합니다. 오프셋은 작업 ID에서 유도되므로 같은 작업은 항상 같은 오프셋을 받습니다. 정확한 타이밍이 중요하면 :00이나 :30이 아닌 분을 고릅니다(0 9 * * * 대신 3 9 * * *). scheduled-tasks

공식반복 작업은 생성 7일 뒤 자동 만료됩니다. 마지막으로 한 번 발동한 다음 스스로 삭제되어, 잊힌 루프가 얼마나 오래 돌 수 있는지를 묶습니다. 더 오래가야 하면 만료 전에 취소하고 다시 만들거나 루틴이나 데스크톱 예약 작업을 씁니다. scheduled-tasks

공식스케줄러는 매초 도래한 작업을 확인해 낮은 우선순위로 큐에 넣습니다. 예약 프롬프트는 턴 사이에 발동하고 클로드가 응답 중일 때는 발동하지 않습니다. 시각은 모두 로컬 시간대로 해석되므로 0 9 * * *는 UTC가 아니라 클로드코드를 돌리는 곳의 오전 9시입니다. scheduled-tasks

공식한계도 분명합니다. 작업은 클로드코드가 돌고 유휴일 때만 발동하므로 터미널을 닫거나 세션이 종료되면 멈춥니다(세션을 백그라운드로 보내면 /loop 작업이 백그라운드 세션으로 이어져 터미널 없이 계속 돕니다). 놓친 발동을 따라잡지 않으므로, 긴 요청 중에 예정 시각이 지나면 유휴가 될 때 한 번만 발동하고 놓친 간격마다 발동하지 않습니다. 새 대화를 시작하면 세션 범위 작업이 모두 지워집니다. scheduled-tasks

실전필자의 볼트 로그에서 CronCreate는 1회, ScheduleWakeup은 2회, Monitor는 8회 호출됐고 loop.md는 프로젝트에도 사용자 위치에도 없습니다. 세션 안 반복을 거의 쓰지 않았다는 뜻이고, 대신 데스크톱 예약 작업 2건으로 반복을 처리했습니다. 세션 범위 반복이 7일에 만료되고 세션이 살아 있어야 하는 제약이, 며칠 단위로 도는 일에는 맞지 않았기 때문입니다.

31.4셋 중 무엇을

공식공식 문서가 세 방식을 한 표로 비교합니다. 이 표 하나가 대부분의 판단을 끝냅니다. scheduled-tasks desktop-scheduled-tasks

클라우드(루틴)데스크톱/loop
도는 곳클라우드, 기본은 Anthropic 관리내 기기내 기기
기기가 켜져 있어야아니오예예
세션이 열려 있어야아니오아니오예
재시작 후 유지예예만료되지 않았으면 --resume에서 복원
로컬 파일 접근아니오(새 클론)예예
MCP 서버작업별 커넥터 설정설정 파일과 커넥터세션에서 상속
권한 프롬프트없음(자율 실행)작업별 설정 가능세션에서 상속
최소 간격1시간1분1분

공식공식 권고는 세 줄입니다. 내 기기 없이 안정적으로 돌아야 하는 일에는 클라우드, 로컬 파일과 도구가 필요하면 데스크톱, 세션 중 빠른 폴링에는 /loop. scheduled-tasks

한 줄 판정

로컬 파일이 필요한가, 기기가 꺼져 있어도 돌아야 하는가

관행두 질문이 셋을 가릅니다. 로컬 파일이 필요하면 클라우드는 탈락합니다(새 클론이라 커밋되지 않은 것에 닿지 못합니다). 기기가 꺼져 있어도 돌아야 하면 로컬 둘이 탈락합니다. 둘 다 필요하다면 일을 쪼개는 것이 답입니다. 클라우드가 저장소 안에서 할 수 있는 부분을 하고, 로컬 파일이 필요한 부분만 데스크톱 작업으로 남깁니다.

공식넷째 선택지도 있습니다. cron 기반 무인 자동화가 필요하면 GitHub Actions의 schedule 트리거를 씁니다. scheduled-tasks

31.5클라우드 환경 구성

공식모든 클라우드 세션은 클라우드 환경에서 돕니다. 환경은 네트워크 접근, 환경 변수, 클로드가 일하기 전에 도는 설정 스크립트를 담은 저장된 구성입니다. 같은 환경이 클라우드 세션을 시작하는 모든 자리에 적용됩니다. 웹, claude --cloud의 터미널, Claude Tag, 루틴, 모바일 앱, 데스크톱 앱입니다. cloud-environments

공식온보딩이 Default 환경을 만들어 주고, 그것은 자기 구성이 없습니다. 네트워크는 Trusted로 패키지 레지스트리 등 허용 목록 도메인만 닿고, 환경 변수와 설정 스크립트가 없어 미리 설치된 도구만으로 시작합니다. 환경이 하나뿐이면 모든 세션이 그것을 쓰고, 여러 개면 표면마다 고릅니다(웹·데스크톱·모바일은 선택기의 환경, CLI는 /remote-env로 고른 것 또는 첫 환경, --environment <id>가 그 호출에서는 둘 다 덮습니다). cloud-environments

네트워크 접근 4단계

공식환경 대화상자의 Network access 필드는 네 값을 받습니다. cloud-environments

단계나가는 연결
None세션 네트워크로 나가는 접근이 없습니다
Trusted허용 목록 도메인만(패키지 레지스트리, GitHub, 클라우드 SDK)
Full모든 도메인
Custom내 허용 목록. 기본 목록을 함께 포함할 수 있습니다

공식GitHub 작업은 이 설정과 무관한 별도 프록시를 쓰고, None에서도 클로드코드의 Anthropic API 연결은 동작합니다. 허용 목록 밖 호스트로 가는 요청은 403과 x-deny-reason: host_not_allowed로 실패합니다. MCP 커넥터 트래픽은 Anthropic 서버를 거치므로 커넥터 호스트를 허용 목록에 넣지 않아도 동작합니다. cloud-environments routines

환경 변수에 비밀을 넣지 않습니다

공식환경 변수는 .env 형식으로 줄마다 KEY=value 하나입니다. 각 세션이 시작 시 값을 한 번 복사하므로, 편집이나 추가는 이후에 시작하는 세션에만 적용되고 이미 도는 세션은 시작할 때의 값을 유지합니다. 중요한 것은 그 환경을 쓰는 누구나 값을 읽을 수 있고 클라우드 환경에는 전용 비밀 저장소가 없다는 점입니다. API 키나 자격 증명을 넣지 않습니다. cloud-environments

설정 스크립트와 캐시

공식설정 스크립트는 새 클라우드 세션이 시작될 때 클로드코드가 뜨기 전에 도는 Bash 스크립트입니다. Ubuntu 24.04에서 root로 돌므로 apt install과 대부분의 언어 패키지 관리자가 동작합니다. cloud-environments

#!/bin/bash
apt update && apt install -y gh

공식스크립트는 그 환경에서 처음 세션을 시작할 때 돕니다. 끝나면 Anthropic이 파일 시스템을 스냅샷하고 이후 세션의 시작점으로 재사용하므로, 새 세션은 의존성과 도구, Docker 이미지가 이미 디스크에 있는 상태로 시작하며 설정 스크립트 단계를 건너뜁니다. 캐시는 파일 시스템 스냅샷이라 스크립트가 디스크에 쓴 것은 남고 돌고 있던 것만인 것은 사라집니다. 설치한 패키지, 가져온 Docker 이미지, 쓴 파일은 넘어오고, 스크립트가 띄운 데이터베이스나 docker compose up 스택은 넘어오지 않으므로 세션마다 클로드에게 시키거나 SessionStart 훅으로 띄웁니다. cloud-environments

공식캐시를 다시 만들려고 설정 스크립트가 재실행되는 경우는 셋입니다. 환경의 설정 스크립트를 바꿀 때, 허용 네트워크 호스트를 바꿀 때, 그리고 캐시가 약 7일 만료에 닿을 때입니다. 기존 세션을 재개하는 것은 설정 스크립트를 다시 돌리지 않습니다. cloud-environments

이미 들어 있는 것

공식클라우드 세션에는 흔한 런타임과 빌드 도구, 데이터베이스가 미리 설치돼 있습니다. Python 3.x(pip·poetry·uv·black·mypy·pytest·ruff), Node.js 20·21·22(npm·yarn·pnpm·bun·eslint·prettier·chromedriver), Ruby 3.1~3.3, PHP 8.4와 Composer, OpenJDK 21과 Maven·Gradle, Go 최신 안정판, Rust, C/C++(GCC·Clang·cmake·ninja·conan), Docker와 compose, PostgreSQL 16과 Redis 7.0, 그리고 git·jq·yq·ripgrep·tmux·vim·nano입니다. cloud-environments

공식반면 클라우드 세션은 저장소의 새 클론에서 시작합니다. 저장소에 커밋한 것은 쓸 수 있고, 내 기기에만 설치하거나 설정한 것은 쓸 수 없습니다. 조직 정책은 서버 관리형 설정으로 별도로 도착합니다. cloud-environments

공식Team과 Enterprise의 소유자와 관리자는 조직 전체가 공유하는 환경을 만들 수 있습니다. 공유 환경은 각 멤버의 선택기에 개인 환경과 함께 나타나므로, 팀이 각자 같은 구성을 다시 만들지 않고 하나로 표준화할 수 있습니다. 공유 환경의 값은 그 환경을 쓰는 모든 멤버의 세션에 도달하고, 개인 환경과 마찬가지로 전용 비밀 저장소가 없으므로 비밀을 넣지 않습니다. cloud-environments

환경이 만료되면 세션도 멈춥니다. 공식클라우드 세션은 일정 시간 활동이 없으면 멈추고 VM이 회수됩니다. 웹에서는 세션 목록에 만료로 표시되고, 다시 열면 대화 이력이 복원된 새 VM이 준비됩니다. claude-code-on-the-web

32

원격과 입구 확장

32.1리모트 컨트롤

공식리모트 컨트롤은 claude.ai/code나 iOS·안드로이드 Claude 앱을 내 기기에서 도는 클로드코드 세션에 연결합니다. 책상에서 작업을 시작하고 소파에서 폰으로, 또는 다른 컴퓨터의 브라우저로 이어 갑니다. 세션이 시작되는 동안 클로드는 계속 로컬에서 돌기 때문에 코드 실행과 파일 시스템 접근이 내 기기에 남습니다. 연구 프리뷰이며 모든 플랜에서 쓸 수 있고, Team과 Enterprise에서는 소유자가 토글을 켤 때까지 기본으로 꺼져 있습니다. remote-control

공식얻는 것 넷입니다. 로컬 환경 전체를 원격에서 쓰고(파일 시스템, MCP 서버, 도구, 프로젝트 구성이 그대로 살아 있고 @가 로컬 프로젝트의 파일 경로를 자동완성합니다), 두 표면에서 동시에 작업하고(대화와 서브에이전트·워크플로 진행이 연결된 모든 기기에서 동기화되므로 터미널·브라우저·폰에서 번갈아 메시지를 보냅니다), 폰이나 브라우저에서 이미지와 파일을 보내고(클로드코드가 내 기기로 내려받아 @ 파일 참조로 넘깁니다), 끊김을 견딥니다(노트북이 자거나 네트워크가 끊기면 기기가 돌아올 때 자동으로 재연결하고 그동안의 상태 갱신을 큐에 담아 복구 후 전달합니다). remote-control

시작하는 세 방식

방식명령성격
서버 모드claude remote-control프로세스가 터미널에 남아 원격 연결을 기다립니다. 세션 URL을 표시하고 스페이스바로 QR 코드를 띄웁니다
대화형 세션claude --remote-control(--rc)터미널에서 직접 입력하면서 동시에 원격에서도 쓸 수 있는 완전한 대화형 세션입니다
진행 중인 세션에서/remote-control(/rc)지금 대화 이력을 가져가는 리모트 컨트롤 세션을 시작합니다

공식VS Code 확장에서는 프롬프트 박스에 /remote-control 또는 /rc를 입력합니다. 연결되면 배너의 claude.ai/code 링크로 바로 갈 수 있고, CLI와 달리 이름 인자와 QR 코드는 지원하지 않습니다. remote-control

공식서버 모드에는 병렬 관련 플래그가 있습니다. --spawn이 서버가 세션을 만드는 방식을 정하는데, same-dir(기본)은 모든 세션이 현재 작업 디렉터리를 공유하므로 같은 파일을 고치면 충돌할 수 있고, worktree는 요청마다 만들어지는 세션이 각자 git 워크트리를 받고(git 저장소가 필요합니다), session은 단일 세션 모드로 정확히 하나만 제공하고 추가 연결을 거부합니다. 런타임에 w로 same-dir과 worktree를 전환합니다. --capacity는 동시 세션 최대 수로 기본 32입니다. remote-control

# 서버 모드에서 요청마다 워크트리로 격리된 세션을 만든다
claude remote-control --spawn worktree

공식모든 대화형 세션에 자동 연결하려면 /config에서 Enable Remote Control for all sessions를 켜거나 설정 파일의 remoteControlAtStartup을 true로 둡니다. 프로젝트나 로컬 설정에서는 false가 존중되지만 true는 무시되므로, 체크인된 파일이 저장소를 여는 모두에게 리모트 컨트롤을 켤 수 없습니다. 자동 연결은 내 claude.ai 계정으로 로그인하므로 그 세션은 내 계정의 앱에만 나타나고 다른 누구에게도 접근을 주지 않습니다. remote-control

연결과 보안

공식로컬 세션은 나가는 HTTPS 요청만 하고 내 기기에 들어오는 포트를 열지 않습니다. 리모트 컨트롤을 시작하면 Anthropic API에 등록하고 작업을 폴링합니다. 다른 기기에서 연결하면 서버가 웹·모바일 클라이언트와 로컬 세션 사이의 메시지를 스트리밍 연결로 중계합니다. 모든 트래픽은 TLS로 Anthropic API를 지나고, 여러 개의 짧은 수명 자격 증명을 쓰며 각각 한 목적에 스코프가 잡혀 독립적으로 만료됩니다. remote-control

연결 중에는 트랜스크립트가 서버에 저장됩니다. 공식리모트 컨트롤이 연결된 동안 세션 트랜스크립트(내 메시지, 클로드의 응답, 도구 활동)가 Anthropic 서버에 저장됩니다. 여러 기기 사이에서 대화를 동기화하고 네트워크가 끊긴 뒤 재연결하기 위한 것입니다. 실행과 파일 시스템 접근은 내 기기에 남고, 저장된 트랜스크립트는 데이터 사용 정책에 따라 보관됩니다. 완전히 끄려면 disableRemoteControl 설정을 씁니다. 제로 데이터 보존 같은 컴플라이언스 요건이 있는 조직은 리모트 컨트롤을 켤 수 없습니다. remote-control

공식한계가 넷 있습니다. 서버 모드가 아니면 인스턴스마다 원격 세션 하나이고, 로컬 프로세스가 계속 돌아야 하므로 터미널을 닫거나 VS Code를 종료하면 세션이 끝납니다(SSH를 끊고도 유지하려면 tmux나 screen 안에서 시작합니다). 기기는 깨어 있는데 네트워크에 약 10분 이상 닿지 못하면 세션이 시간 초과로 프로세스가 종료됩니다. 그리고 터미널 인터페이스에서만 도는 명령(/plugin, /resume 등)은 로컬 CLI에서만 동작합니다. remote-control

공식모바일과 웹에서 되는 것도 정리돼 있습니다. 텍스트 출력 명령(/compact, /clear, /context, /usage, /recap 등), 값을 인자로 넘기는 /model·/effort·/fast·/color·/rename, v2.1.166부터의 /mcp(모바일에서는 서버 상태 텍스트 요약, 웹에서는 커넥터 디렉터리), v2.1.181부터의 /config입니다. remote-control

푸시 알림

공식리모트 컨트롤이 활성이면 클로드가 폰으로 푸시 알림을 보낼 수 있습니다. 언제 보낼지는 클로드가 정하는데, 대개 오래 도는 작업이 끝났을 때나 계속하려면 결정이 필요할 때입니다. 프롬프트에서 요청할 수도 있습니다("테스트 끝나면 알려 줘"). /config에서 Push when Claude decides(선제 알림)와 Push when actions required(권한 프롬프트와 질문)를 각각 켭니다. 그 두 토글 외의 이벤트별 설정은 없습니다. remote-control

공식클로드코드는 연결된 터미널에 입력 중이거나 포커스가 있으면 푸시를 건너뜁니다. v2.1.181부터 CLAUDE_CLIENT_PRESENCE_FILE에 마커 파일 경로를 두면 다른 창에 있더라도 기기 앞에 있는 동안 전체로 확장됩니다. 파일이 있으면 알림을 건너뛰므로, 화면 잠금 해제 시 파일을 만들고 잠금 시 지우는 도구를 붙입니다. remote-control

공식세션 URL 알림도 있습니다. 긴 턴이 서버가 정한 임계값을 넘으면 Still working 알림과 Check in from your phone 링크가 프롬프트 위에 뜨고, 권한 프롬프트를 여러 번 답한 뒤에는 Approve tool calls from your phone 알림이 세션 URL을 보여 줍니다. 매번 나오지는 않고 세션을 가로질러 총 몇 번만 나오며, 설정하거나 끌 수 없고 각각 스스로 사라집니다. v2.1.208 이상이 필요합니다. remote-control

32.2채널

공식채널은 도는 클로드코드 세션에 이벤트를 밀어 넣는 MCP 서버입니다. 터미널에 없는 동안 일어난 일에 클로드가 반응할 수 있게 합니다. 양방향이 될 수 있어서, 클로드가 이벤트를 읽고 같은 채널로 답을 보내는 채팅 브리지처럼 동작합니다. 이벤트는 세션이 열려 있을 때만 도착하므로 항상 켜 두는 구성에는 백그라운드 프로세스나 지속 터미널에서 클로드를 돌립니다. channels

공식다른 연동과 갈리는 지점이 이것입니다. 새 클라우드 세션을 띄우거나 폴링을 기다리는 방식과 달리, 이벤트가 내가 이미 열어 둔 세션에 도착합니다. 그래서 클로드가 내 파일을 열어 둔 상태이고 무엇을 디버깅하고 있었는지 기억하는 자리에서 웹훅이 도착합니다. channels

공식연구 프리뷰이며 claude.ai나 콘솔 API 키를 통한 Anthropic 인증이 필요하고 Amazon Bedrock, Google Cloud, Microsoft Foundry에서는 쓸 수 없습니다. Team과 Enterprise 조직은 명시적으로 켜야 합니다. 연구 프리뷰에는 텔레그램, 디스코드, iMessage가 들어 있습니다. 플러그인으로 설치하고 내 자격 증명으로 설정합니다. channels

먼저 데모로 확인합니다

공식fakechat은 공식 지원 데모 채널로 localhost에서 채팅 UI를 돌리고 인증할 것도 설정할 외부 서비스도 없습니다. 브라우저에서 입력하면 세션에 도착하고, 클로드가 답하면 브라우저로 돌아옵니다. 사전 조건은 클로드코드 설치와 인증, 그리고 Bun입니다(미리 만들어진 채널 플러그인이 Bun 스크립트입니다). channels

# 1) 플러그인 설치
/plugin install fakechat@claude-plugins-official

# 2) 채널을 켜서 재시작(여러 플러그인은 공백으로 구분)
claude --channels plugin:fakechat@claude-plugins-official

공식메시지가 도착하면 터미널에 ← fakechat · web: ... 같은 인바운드 줄로 보이고, 모델은 그것을 <channel source="plugin:fakechat:fakechat"> 이벤트로 받습니다. 클로드가 읽고 일을 하고 채널의 reply 도구를 호출합니다. 첫 답장은 터미널에 권한 프롬프트를 띄우고, 승인하면 답이 채팅 UI에 나타납니다. channels

공식클로드가 답할 때 터미널에서는 인바운드 메시지는 보이지만 답장 텍스트는 보이지 않습니다. 터미널은 도구 호출과 확인만 보여 주고 실제 답은 상대 플랫폼에 나타납니다. channels

보안: 발신자 허용 목록과 세션 옵트인

공식승인된 모든 채널 플러그인은 발신자 허용 목록을 유지합니다. 내가 추가한 ID만 메시지를 밀어 넣을 수 있고 나머지는 조용히 버려집니다. 텔레그램과 디스코드는 페어링으로 목록을 만듭니다(봇에 아무 메시지를 보내면 봇이 페어링 코드를 답하고, 세션에서 그 코드를 승인하면 발신자 ID가 목록에 추가됩니다). iMessage는 다르게 동작해서 자기 자신에게 문자를 보내는 것은 자동으로 통과하고 다른 연락처는 핸들로 추가합니다. channels

공식그 위에 두 층이 더 있습니다. 세션마다 --channels로 어느 서버를 켤지 내가 정하고, 조직은 channelsEnabled로 가용성을 통제합니다. .mcp.json에 있는 것만으로는 메시지를 밀어 넣지 못하고 --channels에 이름이 있어야 합니다. channels

허용 목록이 권한 승인 권한까지 겁니다. 공식채널이 권한 프롬프트 중계 기능을 선언한 경우, 허용 목록이 그것도 통제합니다. 채널로 답할 수 있는 사람은 내 세션의 도구 사용을 승인하거나 거부할 수 있으므로, 그 권한을 맡길 만한 발신자만 허용 목록에 넣습니다. channels

공식내가 터미널을 떠나 있는 동안 클로드가 권한 프롬프트를 만나면 세션은 답할 때까지 멈춥니다. 권한 중계 기능을 선언한 채널 서버는 그 프롬프트를 전달해 원격에서 승인하거나 거부하게 할 수 있습니다. 무인 사용에는 --dangerously-skip-permissions가 대부분의 프롬프트를 우회하지만 신뢰하는 환경에서만 씁니다. 그마저도 명시적 ask 규칙, 조직이 ask로 설정한 커넥터 도구, requiresUserInteraction으로 표시된 MCP 도구, 루트나 홈 디렉터리를 대상으로 하는 삭제, 세션 간 메시지 안전장치는 계속 묻습니다. channels

공식-p 비대화 모드에서 채널을 돌리면 터미널 입력이 필요한 도구(선다형 질문, 계획 모드 승인)가 비활성화되어 세션이 입력을 기다리며 멈추지 않습니다. channels

조직 통제

공식관리형 설정 두 개로 통제하고 사용자는 덮어쓸 수 없습니다. channelsEnabled가 마스터 스위치로 어떤 채널이든 메시지를 전달하려면 true여야 하고, 끄면 개발 플래그를 포함해 모든 채널을 막습니다. allowedChannelPlugins는 채널이 켜진 뒤 어느 플러그인이 등록할 수 있는지 정하고, 설정하면 Anthropic이 관리하는 기본 목록을 완전히 대체합니다. 기본값은 인증 방식에 달립니다. claude.ai Team과 Enterprise는 소유자가 켤 때까지 차단이고, API 키 인증의 콘솔 조직은 기본 허용입니다(관리형 설정을 배포하는 경우에만 이 키가 필요합니다). channels

{
  "channelsEnabled": true,
  "allowedChannelPlugins": [
    { "marketplace": "claude-plugins-official", "plugin": "telegram" },
    { "marketplace": "acme-corp-plugins", "plugin": "internal-alerts" }
  ]
}

공식연구 프리뷰 중에는 --channels가 Anthropic 관리 허용 목록의 플러그인이나 조직 허용 목록의 것만 받습니다. 목록에 없는 것을 넘기면 클로드코드는 정상 시작하지만 채널이 등록되지 않고 시작 안내가 이유를 알려 줍니다. --channels와 --dangerously-load-development-channels는 프리뷰 동안 claude --help에 나오지 않지만 동작합니다. channels

관행채널이 다른 수단과 갈리는 자리를 한 줄로 잡으면 이렇습니다. 이벤트가 밖에서 들어와야 하면 채널, 내가 밖에서 세션을 조종하려면 리모트 컨트롤, 일정에 맞춰 새 세션이 시작돼야 하면 루틴이나 예약 작업입니다. 셋을 섞어 쓰는 것도 가능하지만 하나로 될 일을 셋으로 하지 않는 편이 낫습니다.

32.3Slack

두 버전이 있습니다. 공식slack 문서가 다루는 것은 각 세션을 개별 사용자 계정으로 돌리는 이전 버전입니다. Team과 Enterprise 플랜에서는 Anthropic이 이 버전을 Claude Tag로 대체하고 있는데, Claude Tag는 @Claude를 조직의 공용 신원으로 관리자가 설정한 접근 권한으로 돌립니다. 기존 Slack 앱과 @Claude 핸들은 그대로 유지되고 전환 날짜는 계정 담당팀이 알려 줍니다. Pro와 Max 플랜에는 Claude Tag가 없으므로 이 문서가 여전히 설정 경로입니다. slack claude-tag

공식Slack에서 @Claude를 코딩 작업과 함께 멘션하면 클로드가 의도를 자동으로 감지해 클로드코드 웹 세션을 만듭니다. 팀 대화를 떠나지 않고 개발 작업을 위임하는 것이 목적입니다. 기존 Claude for Slack 앱 위에 코딩 요청을 웹으로 라우팅하는 지능형 분기를 더한 형태이고, 각 세션은 내 계정으로 돌면서 내가 연결한 저장소와 내 플랜 한도를 씁니다. slack

공식전제 조건은 넷입니다. Pro·Max·Team·Enterprise 플랜의 클로드코드 접근, 클로드코드 웹 활성화, 저장소 하나 이상이 인증된 GitHub 계정 연결, 그리고 Claude 앱을 통한 Slack 계정과 Claude 계정 연결. slack

공식라우팅 모드는 둘입니다. Code only는 모든 멘션을 클로드코드 세션으로 보내고, Code + Chat은 메시지를 분석해 코딩 작업은 클로드코드로 그 외(작성, 분석, 일반 질문)는 Claude Chat으로 나눕니다. Chat으로 갔는데 코딩 세션을 원했으면 Retry as Code를 눌러 다시 만들 수 있고 반대도 됩니다. slack

공식맥락 수집 방식이 이 연동의 핵심입니다. 스레드에서 멘션하면 그 스레드의 모든 메시지에서 맥락을 모으고, 채널에서 직접 멘션하면 최근 채널 메시지를 봅니다. 이것이 문제를 이해하고 적절한 저장소를 고르고 접근 방식을 정하는 데 쓰입니다. slack

대화 맥락은 지시가 될 수 있습니다. 공식Slack에서 @Claude를 부르면 클로드는 요청을 더 잘 이해하기 위해 대화 맥락에 접근합니다. 클로드가 그 맥락의 다른 메시지에 있는 지시를 따를 수 있으므로, 신뢰하는 Slack 대화에서만 클로드를 씁니다. slack

공식접근 통제는 세 층입니다. 사용자 수준에서 각 사용자는 자기 계정으로 세션을 돌리고 자기 플랜 한도를 쓰며 자기가 연결한 저장소만 접근합니다. 작업 공간 수준에서 관리자가 앱 설치 여부를 정하고, Enterprise Grid에서는 조직 관리자가 어느 작업 공간이 접근할지 통제하며, 앱을 제거하면 그 작업 공간의 모든 사용자 접근이 즉시 회수됩니다. 채널 수준에서 클로드는 설치 후 어떤 채널에도 자동으로 추가되지 않으므로 /invite @Claude로 초대해야 하고, 추가된 채널에서만 멘션에 응답합니다. 그래서 어느 채널에 초대하고 누가 그 채널에 접근하는지를 관리해 사용을 통제할 수 있습니다. slack

공식제약도 분명합니다. 채널(공개·비공개)에서만 동작하고 DM에서는 동작하지 않습니다. GitHub 저장소만 지원하고, 세션당 PR 하나이며, 세션은 개별 플랜의 속도 제한을 씁니다. 웹 접근이 없는 사용자는 표준 Claude 채팅 응답만 받습니다. slack

공식Enterprise와 Team 계정에서는 Slack에서 만든 세션이 조직에 자동으로 보입니다(Team 가시성). slack claude-code-on-the-web

관행Slack이 맞는 경우와 아닌 경우가 공식 문서에도 정리돼 있습니다. 맥락이 이미 Slack 논의에 있거나 비동기로 작업을 던지고 싶거나 팀원이 가시성을 필요로 할 때는 Slack이 맞고, 파일을 올려야 하거나 개발 중 실시간 상호작용이 필요하거나 더 길고 복잡한 작업이면 웹을 직접 쓰는 편이 낫습니다.

32.4웹과 모바일 병행

공식클로드코드 웹은 Anthropic이 관리하는 클라우드 인프라(또는 조직의 자체 호스팅 환경)에서 작업을 돌립니다. 브라우저를 닫아도 세션이 유지되고 Claude 모바일 앱에서 지켜볼 수 있습니다. 연구 프리뷰이며 Pro·Max·Team, 그리고 프리미엄 좌석이나 Chat + Claude Code 좌석을 가진 Enterprise 사용자에게 제공됩니다. claude-code-on-the-web

터미널에서 클라우드로 던지기

공식--cloud 플래그로 명령줄에서 클라우드 세션을 시작합니다. 지금 디렉터리의 GitHub 원격을 현재 브랜치로 클론하므로 로컬 커밋이 있으면 먼저 푸시해야 합니다(VM이 내 기기가 아니라 GitHub에서 클론합니다). 한 번에 저장소 하나를 다룹니다. 작업이 클라우드에서 도는 동안 로컬 작업을 계속합니다. claude-code-on-the-web

claude --cloud "src/auth/login.ts 의 인증 버그를 고쳐라"

공식여기서 병렬이 자연스럽게 나옵니다. --cloud 명령마다 독립적으로 도는 자기 클라우드 세션이 만들어지므로, 여러 작업을 시작하면 별도 세션에서 동시에 돕니다. /tasks로 모두 지켜보고, 끝나면 웹에서 PR을 만들거나 세션을 터미널로 텔레포트해 이어 갑니다. claude-code-on-the-web

claude --cloud "auth.spec.ts 의 간헐 실패 테스트를 고쳐라"
claude --cloud "API 문서를 갱신해라"
claude --cloud "로거를 구조화 출력으로 리팩토링해라"

공식공식 문서가 권하는 조합이 하나 있습니다. 로컬에서 계획하고 원격에서 실행하는 것입니다. 복잡한 작업은 계획 모드로 시작해 접근을 함께 만들고, 만족하면 계획을 저장소에 커밋해 푸시한 다음 클라우드 세션으로 자율 실행합니다. 전략은 내가 통제하고 실행은 클로드가 자율로 하는 형태입니다. claude-code-on-the-web

claude --permission-mode plan
# (계획을 만들고 커밋·푸시한 뒤)
claude --cloud "docs/migration-plan.md 의 마이그레이션 계획을 실행해라"

공식GitHub에 연결되지 않은 저장소에서 claude --cloud를 돌리면 로컬 저장소를 묶어 클라우드 세션에 직접 올립니다. 번들에는 모든 브랜치의 전체 이력과 추적되는 파일의 커밋하지 않은 변경이 들어갑니다. GitHub 접근이 없을 때 자동으로 발동하고, 연결돼 있어도 CCR_FORCE_BUNDLE=1로 강제할 수 있습니다. 제약은 셋입니다. 커밋이 하나 이상 있는 git 저장소여야 하고, 번들이 100MB 미만이어야 하며(더 크면 현재 브랜치만, 그다음 작업 트리 단일 스냅샷으로 물러납니다), 추적되지 않은 파일은 포함되지 않으므로 클라우드 세션이 봐야 하는 파일은 git add합니다. 번들로 만든 세션은 GitHub 인증이 함께 설정돼 있지 않으면 원격으로 푸시할 수 없습니다. claude-code-on-the-web

도는 세션에 후속 메시지 보내기

공식클라우드 세션이 돌기 시작한 뒤에는 claude auth login으로 로그인한 어느 기기에서든 후속 메시지를 보낼 수 있습니다. CLI가 Anthropic 계정 자격 증명으로 인증하고 로컬 세션 상태를 보내지 않으므로, 세션을 시작한 기기에서 돌릴 필요가 없습니다. 기본형은 메시지 하나를 넣고 종료합니다. claude-code-on-the-web

claude -p "테스트가 통과했으면 PR을 열어 줘" --cloud <session-id>

# 표준 입력으로도 됩니다
echo "타입 검사도 돌려 줘" | claude -p --cloud <session-id>

공식CLI가 메시지를 세션 큐에 넣고 답을 기다리지 않고 종료합니다. 오래 도는 세션을 조종하거나, 지금 단계가 끝나기 전에 다음 단계를 큐에 넣거나, CI 스크립트에서 후속을 보낼 때 씁니다. -p 없이 claude --cloud <session-id>를 쓰면 터미널을 세션에 붙여 직접 대화합니다(대화형 붙기는 점진 출시 중입니다). --output-format json으로 기계 판독 결과를 받습니다. claude-code-on-the-web

클라우드에서 터미널로 회수하기

공식회수 경로는 다섯입니다. claude --teleport(대화형 선택기) 또는 claude --teleport <session-id>, 세션 안에서 /teleport(/tp), /tasks에서 t, 웹 인터페이스의 Open in > Terminal, 그리고 클라우드 세션 안에서 /teleport를 입력하면 그 세션용 정확한 명령을 답해 줍니다(v2.1.223 이상). claude-code-on-the-web

공식텔레포트하면 클로드가 올바른 저장소에 있는지 확인하고 클라우드 세션의 브랜치를 페치해 체크아웃하고 전체 대화 이력을 터미널에 로드합니다. 터미널은 세션의 자기 사본을 받으므로 거기서의 새 작업은 로컬에 남고 claude.ai나 모바일 앱의 클라우드 세션에는 나타나지 않습니다. 텔레포트 뒤에도 폰에서 계속 조종하려면 로컬 세션에서 /remote-control을 시작합니다. claude-code-on-the-web

요건내용
깨끗한 git 상태작업 디렉터리에 커밋하지 않은 변경이 없어야 합니다. 필요하면 스태시하라고 묻습니다
올바른 저장소같은 저장소의 체크아웃에서 돌려야 하고 포크는 안 됩니다
브랜치 존재클라우드 세션의 브랜치가 원격에 푸시돼 있어야 합니다. 페치와 체크아웃은 자동입니다
같은 계정클라우드 세션에 쓴 것과 같은 claude.ai 계정으로 인증돼 있어야 합니다

공식--teleport와 --resume은 다릅니다. --resume은 이 기기의 로컬 이력에서 대화를 다시 열고 클라우드 세션을 나열하지 않으며, --teleport는 클라우드 세션과 그 브랜치를 가져옵니다. 그리고 CLI에서 세션 이동은 한 방향입니다. 클라우드를 터미널로 당길 수 있지만 기존 터미널 세션을 웹으로 밀 수는 없습니다(데스크톱 앱에는 로컬 세션을 웹으로 보내는 Continue in 메뉴가 있습니다). claude-code-on-the-web

모바일은 클라이언트입니다

공식iOS·안드로이드 Claude 앱은 코드가 도는 곳이 아니라 클로드코드 세션의 클라이언트입니다. 폰에서 클라우드 세션에 닿거나, 리모트 컨트롤로 내 기기의 세션에 닿거나, 디스패치로 데스크톱 앱에 닿습니다. 별도 클로드코드 모바일 앱은 없고 클라우드 세션과 리모트 컨트롤이 모두 Claude 앱의 Code 탭에 있습니다. mobile

기능무엇에 연결되나이럴 때
클로드코드 웹클라우드 인프라의 클라우드 세션저장소가 GitHub에 있고 폰을 내려놔도 계속 돌아야 할 때
리모트 컨트롤내 컴퓨터에서 도는 세션로컬 파일 시스템, 도구, MCP 서버가 필요할 때
디스패치내 컴퓨터의 데스크톱 앱작업을 메시지로 던지고 디스패치가 실행 방법을 정하게 할 때(Pro·Max 필요)

공식고르는 기준은 하나입니다. 컴퓨터가 꺼져 있을 것이면 클라우드 세션을 씁니다. 리모트 컨트롤과 디스패치는 내 기기를 조종하므로 클로드코드나 데스크톱 앱이 도는 상태로 켜져 있어야 합니다. 리모트 컨트롤 중에 기기가 자면 돌아올 때 재연결합니다. mobile

공식모바일의 한계 셋도 알아 둡니다. 터미널 전용 명령(/plugin, /resume)은 앱에서 동작하지 않습니다. 권한 모드는 클라우드 세션이 Accept edits·Plan·Auto를, 리모트 컨트롤 세션이 Manual·Accept edits·Plan을 제공하며, 어느 쪽도 앱에서 Bypass permissions를 고를 수 없고 리모트 컨트롤 세션에는 Auto를 고를 수 없습니다. 디스패치는 Pro나 Max가 필요하고 Team·Enterprise에는 없습니다. mobile

PR 자동 수정

공식클로드가 PR을 지켜보며 CI 실패와 리뷰 코멘트에 자동으로 대응할 수 있습니다. GitHub 활동을 구독해서 검사가 실패하거나 리뷰어가 코멘트를 남기면 조사하고 분명한 수정이 있으면 푸시합니다. Claude GitHub App이 저장소에 설치돼 있어야 합니다. 켜는 방법은 넷입니다. 웹에서 만든 PR은 CI 상태 표시에서 Auto-fix를 고르고, 터미널에서는 PR 브랜치에서 /autofix-pr을 돌리고(gh로 열린 PR을 찾아 웹 세션을 띄우고 한 번에 켭니다), 모바일에서는 클로드에게 말하고, 기존 PR은 URL을 세션에 붙여 넣고 자동 수정을 지시합니다. claude-code-on-the-web

공식이벤트마다 클로드가 조사한 뒤 셋으로 나눕니다. 확신하는 수정이고 앞선 지시와 충돌하지 않으면 변경해 푸시하고 세션에 무엇을 했는지 설명합니다. 리뷰어 코멘트가 여러 해석이 가능하거나 구조적으로 중요하면 먼저 묻습니다. 중복이거나 조치가 필요 없는 이벤트는 세션에 기록하고 넘어갑니다. 기준 브랜치가 앞서가 병합 충돌이 생기는 경우에는 GitHub이 웹훅을 내지 않으므로 자동 수정이 스스로 반응할 수 없습니다. 세션을 열어 리베이스를 요청합니다. claude-code-on-the-web

코멘트 기반 자동화가 있는 저장소는 주의합니다. 공식클로드가 리뷰 코멘트 스레드에 답할 수 있고, 그 답은 내 GitHub 계정으로 게시되어 내 사용자 이름으로 나타납니다(각 답에는 클로드코드가 썼다는 표시가 붙습니다). Atlantis, Terraform Cloud, issue_comment 이벤트로 도는 커스텀 액션처럼 코멘트로 발동하는 자동화를 쓰는 저장소에서는 클로드가 내 이름으로 답하는 것이 그 워크플로를 발동시킬 수 있습니다. PR 코멘트가 인프라를 배포하거나 특권 작업을 돌릴 수 있는 저장소에서는 자동 수정을 끄는 것을 고려합니다. claude-code-on-the-web

공식격리는 네 층입니다. 세션마다 격리된 Anthropic 관리 VM, 기본으로 제한되고 끌 수도 있는 네트워크 접근, 자격 증명 보호(git 자격 증명이나 서명 키 같은 민감한 것이 샌드박스 안에 들어가지 않고 스코프가 잡힌 자격 증명을 쓰는 보안 프록시로 처리됩니다), 그리고 PR 생성 전 격리 환경 안에서의 분석과 수정입니다. 자체 호스팅 환경으로 라우팅된 세션은 내 인프라에서 돌고 격리는 그 배포의 책임입니다. claude-code-on-the-web

공식플랫폼 제약도 있습니다. 저장소 클론과 PR 생성은 GitHub을 요구합니다. 자체 호스팅 GitHub Enterprise Server는 Team과 Enterprise 플랜에서 지원됩니다. GitLab, Bitbucket 등 비 GitHub 저장소는 로컬 번들로 클라우드 세션에 보낼 수 있지만 세션이 결과를 원격으로 푸시할 수 없습니다. 조직에 IP 허용 목록이 있으면 Anthropic 호스팅 클라우드 세션은 인증 오류로 전부 실패합니다(클라우드 세션이 내 네트워크가 아니라 Anthropic 인프라에서 API를 호출하기 때문입니다). claude-code-on-the-web

실전이 절의 기능들은 필자의 볼트에서 대부분 쓰이지 않았습니다. 리모트 컨트롤 연결 기록이 없고, 채널 플러그인도 설치돼 있지 않고(활성 플러그인은 2개인데 채널이 아닙니다), 클라우드 세션도 없습니다. 이유는 표면 하나입니다. 이 볼트의 산출물이 구글 드라이브 동기화 폴더 안의 문서라서 클라우드의 새 클론이 접근할 수 없습니다. 앞선 장들과 달리 이것은 판단이 아니라 구조적 제약입니다. 저장소가 GitHub에 있는 작업이라면 같은 계측이 전혀 다르게 나올 것입니다.

이 관찰에서 나오는 실용 규칙을 남깁니다. 32장의 수단들은 저장소가 어디 있는가에 먼저 좌우됩니다. 코드가 GitHub에 있으면 클라우드와 Slack, PR 자동 수정이 전부 열립니다. 코드나 문서가 로컬에만 있으면 리모트 컨트롤과 채널만 남습니다. 자기 작업이 어느 쪽인지 먼저 확인하면 이 장에서 읽을 절이 절반으로 줄어듭니다.


이 편을 마치며

하나가 아니라 함대로 돌립니다

병렬의 네 갈래를 구분하고, 워크트리로 격리하고, 워크플로로 팬아웃을 결정론적으로 만들고, 스케줄로 사람 없는 시간까지 썼습니다.

완료 체크리스트

  • 26.1의 네 갈래를 "누가 계획을 들고 있는가"로 구분할 수 있습니다.
  • 지금 하려는 병렬 작업이 같은 파일을 만지는지 먼저 확인했습니다.
  • 큰 탐색이나 리뷰를 서브에이전트로 위임해 메인 맥락을 지켜 봤습니다.
  • 병렬로 나누기 전에 공유 픽스처와 돌릴 수 있는 수렴 검사를 먼저 정했습니다.
  • 같은 파일을 만질 가능성이 있는 병렬에는 워크트리를 붙였습니다.
  • 워크플로를 쓸지 판단할 때 "같은 오케스트레이션을 다시 돌릴 것인가"를 물었습니다.
  • 워크플로를 돌리기 전에 규모 가이드라인과 모델을 확인했습니다.
  • 예약이 필요한 일에 로컬 파일 접근과 기기 전원 조건으로 셋 중 하나를 골랐습니다.
  • 자율 실행 프롬프트에 하지 말 것과 타이밍 가드레일을 함께 적었습니다.
  • 지금 무엇이 돌고 있는지 명령 한 줄로 확인할 수 있습니다.

여기까지가 사람이 옆에 있는 상태의 병렬입니다. 다음 편 L5 프로그래밍 자동화는 사람이 없는 쪽입니다. 비대화 실행으로 파이프라인의 부품이 되고, CI에서 돌고, Agent SDK로 자기 에이전트를 만드는 것입니다. 이 편에서 만든 병렬 구조가 그 파이프라인의 내부가 됩니다.

자주 막히는 곳

병렬로 돌렸는데 오히려 느려졌습니다

세 가지를 봅니다. 작업이 실제로 독립인지(앞 단계 결과를 기다리는 일은 병렬로 나눠도 줄지 않습니다), 동시 실행 상한에 걸렸는지(워크플로는 최대 16개이고 코어가 적으면 더 적습니다), 그리고 조율 부담이 이득을 넘었는지입니다. 공식 문서도 에이전트 팀에서 어느 지점을 넘으면 동료를 더해도 비례해 빨라지지 않는다고 적고 있습니다. 3~5명에서 시작하라는 권고가 그 이유입니다.

두 세션이 같은 파일을 고쳐 작업이 사라졌습니다

격리가 없었던 것입니다. 지금 할 일은 두 가지입니다. 사라진 작업은 워크트리나 브랜치에 남아 있을 수 있으니 git worktree list와 git reflog로 먼저 찾습니다. 재발 방지로는 --worktree나 서브에이전트 프론트매터의 isolation: worktree를 붙입니다. 에이전트 팀을 쓰고 있었다면 팀은 동료를 격리하지 않으므로 파일 소유를 사람이 나눠야 합니다.

워크플로를 멈췄다가 재개했는데 처음부터 돕니다

재개는 에이전트가 시작한 순서를 따르고, 끝나지 않은 첫 에이전트부터 그 뒤의 모든 에이전트가 다시 돕니다. 완료했더라도 그 뒤에 시작했으면 다시 돕니다. 그리고 재개는 같은 클로드코드 세션 안에서만 되므로, 워크플로가 도는 중에 클로드코드를 종료했다면 다음 세션은 처음부터 시작합니다. 중단 비용을 줄이려면 긴 에이전트 하나 대신 작은 에이전트로 팬아웃하게 만듭니다.

에이전트 뷰에 세션이 하나도 없습니다

claude daemon status로 슈퍼바이저가 닿는지 먼저 봅니다. 그리고 disableAgentView 설정이나 CLAUDE_CODE_DISABLE_AGENT_VIEW 환경 변수로 꺼져 있는지 확인합니다(관리형 설정으로 조직이 끌 수도 있습니다). ~/.claude/jobs가 비어 있으면 애초에 백그라운드 세션을 만든 적이 없는 것입니다.

동료를 띄웠는데 패널에 안 보입니다

먼저 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1이 설정돼 있는지 봅니다. 없으면 클로드는 동료를 띄우지도 제안하지도 않습니다. 설정돼 있는데 안 보이면 유휴 행이 숨은 것일 수 있습니다(패널 전체가 유휴가 된 뒤 30초에 숨고 다음 턴에 다시 나타납니다, 넷 이상 유휴면 남는 행이 하나로 접힙니다). 그리고 클로드가 팀 대신 서브에이전트를 띄웠을 수도 있는데, 둘이 같은 패널에 나오므로 패널만으로는 구분되지 않습니다. 다시 요청하면서 에이전트 팀을 명시합니다.

예약 작업이 예정 시각에 안 돌았습니다

어느 방식이냐에 따라 원인이 다릅니다. /loop은 클로드코드가 돌고 유휴일 때만 발동하고 7일에 만료되며 새 대화를 시작하면 지워집니다. 데스크톱 작업은 앱이 열려 있고 컴퓨터가 깨어 있어야 하고, 놓친 실행은 가장 최근 하나만 따라잡습니다. 셋 모두 API 트래픽 분산을 위한 결정적 지연이 있으므로 정확한 시각에 돌지 않습니다(반복 작업은 최대 30분 뒤까지). 정확한 타이밍이 필요하면 :00이나 :30이 아닌 분을 고릅니다.

루틴이 초록인데 일이 안 됐습니다

초록은 세션이 시작해 인프라 오류 없이 종료했다는 뜻일 뿐, 프롬프트의 작업이 성공했다는 뜻이 아닙니다. 런을 열어 트랜스크립트를 읽습니다. 차단된 네트워크 요청(허용 목록 밖 호스트는 403과 x-deny-reason: host_not_allowed), 없는 커넥터 도구, 작업 수준 실패가 거기서 드러납니다.

다른 세션에 메시지를 보냈는데 도착하지 않았습니다

/list-agents가 인식되는지 먼저 봅니다. 인식되지 않으면 그 세션에 기능이 없는 것이니 버전(v2.1.224 이상), 운영체제(macOS·리눅스), 공급자를 확인합니다. 인식되는데 안 갔으면 더 좁은 원인입니다. SendMessage·ListAgents 거부 규칙, 받는 쪽의 crossSessionInbound 보류나 거부, 그리고 다른 기기의 세션은 답장만 가능하다는 제약입니다. 컨테이너 안과 밖은 파일을 공유하지 않아 서로 닿지 않습니다.

워크트리가 계속 쌓입니다

--worktree로 만든 것은 정기 청소가 절대 제거하지 않습니다. 직접 git worktree remove로 지우고, 변경이나 미추적 파일이 있으면 --force를 붙입니다. 서브에이전트와 백그라운드 세션 워크트리는 cleanupPeriodDays보다 오래되면 청소되지만 작업이 남아 있으면 건너뜁니다. git worktree list로 현황을 보고 .claude/worktrees/가 .gitignore에 있는지 확인합니다.

병렬을 돌렸더니 사용량이 훨씬 빨리 줍니다

정상입니다. 여러 세션이나 서브에이전트를 동시에 돌리면 토큰이 곱해지고, 백그라운드 세션도 대화형과 같이 사용량을 먹으므로 열 개를 병렬로 돌리면 쿼터가 열 배 빠르게 줍니다. 통제 수단은 셋입니다. 워크플로의 규모 가이드라인을 small로 두고, 큰 작업은 작은 조각으로 먼저 돌려 지출을 가늠하고, 가장 강한 모델이 필요하지 않은 단계에 작은 모델을 쓰게 합니다.


6부 · L5

프로그래밍 자동화

사람 없이 돌린다

먼저 필요한 것
L3 확장 (L4 권장)
마치면
클로드코드를 파이프라인 부품으로 호출하고 SDK로 자기 에이전트를 만든다
범위
33~35장

지금까지의 다섯 편은 모두 사람이 앞에 앉아 있다는 전제로 쓰였습니다. 프롬프트를 치고, 권한 프롬프트에 답하고, 결과를 보고 다음을 정합니다. 이 편은 그 전제를 뺍니다. 아무도 보고 있지 않을 때 클로드코드가 돌아야 하고, 결과는 사람이 읽는 화면이 아니라 다음 프로그램이 읽는 값으로 나와야 합니다.

그러면 세 가지가 새로 필요해집니다. 첫째 출력이 구조화돼야 하고(사람이 읽는 문장은 프로그램이 파싱하기 어렵습니다), 둘째 실패가 종료 코드로 드러나야 하고(화면에 빨간 글씨가 떠도 아무도 못 봅니다), 셋째 권한을 미리 정해 둬야 합니다(물어볼 사람이 없으니 프롬프트가 뜨면 그대로 멈춥니다). 33장이 이 셋을 다룹니다.

34장은 그 실행을 CI에 얹고, 35장은 CLI 대신 라이브러리로 같은 엔진을 부릅니다. 세 장은 같은 축의 세 단계입니다. 명령으로 부르기, 파이프라인에서 부르기, 코드에서 부르기입니다.

이 편의 33장과 34장은 L3 확장까지 마쳤으면 바로 읽을 수 있습니다. 35장은 파이썬이나 타입스크립트로 코드를 쓸 수 있어야 합니다. 코드를 안 쓴다면 35장은 건너뛰고 34장까지만 써도 이 편의 완료 기준을 절반은 채웁니다.

33

비대화 실행

클로드코드를 명령 한 줄로 부르고 결과만 받는 방식입니다. 셸 스크립트, package.json 스크립트, 크론, CI 러너가 모두 이 방식으로 클로드코드를 씁니다.

33.1비대화 모드 기본

공식어떤 claude 명령에든 -p(또는 --print)를 붙이면 비대화로 돕니다. 프롬프트를 인자로 주고, 필요한 CLI 옵션을 함께 붙입니다. headless

가장 짧은 형태

claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"

공식성공하면 종료 코드 0, 실패하면 0이 아닌 값으로 끝나므로 스크립트가 종료 상태로 분기할 수 있습니다. 다만 실패가 드러나는 자리가 두 곳으로 갈립니다. 잘못된 플래그를 넘기면 런이 시작되기도 전에 stderr로 오류를 알리고, 인증 누락처럼 런 안에서 생긴 실패는 stdout의 결과로 출력합니다. headless

이 두 갈래가 스크립트에서 가장 자주 사고를 냅니다. stdout만 보고 성공을 판정하면 런 안 실패를 정상 결과로 착각합니다. 종료 코드와 stdout을 둘 다 확인하는 것이 기본입니다.

bare 모드: CI가 실제로 써야 하는 형태

공식--bare를 붙이면 훅, 스킬, 플러그인, MCP 서버, 자동 메모리, CLAUDE.md의 자동 발견을 건너뛰어 시작 시간을 줄입니다. 이것을 붙이지 않은 claude -p는 대화형 세션과 같은 맥락을 읽습니다. 작업 디렉터리와 ~/.claude에 설정된 것이 전부 들어옵니다. headless

공식그래서 bare 모드는 CI와 스크립트처럼 어느 기계에서 돌려도 같은 결과가 필요한 곳에 쓰입니다. 동료의 ~/.claude에 있는 훅이나 프로젝트 .mcp.json의 MCP 서버는 bare 모드가 아예 읽지 않으므로 돌지 않습니다. 공식 문서는 bare를 스크립트·SDK 호출의 권장 모드로 적고, 앞으로 -p의 기본값이 될 예정이라고 밝히고 있습니다. headless

공식대가가 하나 있습니다. bare 모드에서 클로드코드는 OAuth 자격증명도 시스템 키체인도 읽지 않습니다. 클로드 API를 쓸 거면 환경에 ANTHROPIC_API_KEY를 넣거나 --settings JSON에 apiKeyHelper를 주어야 합니다. Amazon Bedrock, Google Cloud의 Agent Platform, Microsoft Foundry는 각자의 제공자 자격증명을 그대로 읽습니다. headless

bare 모드 + 도구 사전 승인

# ANTHROPIC_API_KEY 를 먼저 환경에 넣습니다(bare 는 구독 로그인을 쓰지 않습니다)
claude --bare -p "Summarize README.md" --allowedTools "Read"

공식bare 모드에서 클로드가 가진 도구는 Bash, 파일 읽기, 파일 편집입니다. 그 밖의 맥락은 플래그로 직접 넣습니다. headless

넣을 것플래그
시스템 프롬프트 추가--append-system-prompt, --append-system-prompt-file
설정--settings <파일 또는 JSON>
MCP 서버--mcp-config <파일 또는 JSON>
커스텀 에이전트--agents <json>
플러그인--plugin-dir <경로>, --plugin-url <url>
개념

재현성이 곧 기능이다

대화형 세션에서 개인 설정이 따라오는 것은 편의입니다. 무인 실행에서는 그것이 비결정성입니다. 같은 명령이 내 기계에서는 통과하고 CI에서는 실패하는 원인 대부분이 여기입니다. bare 모드의 값은 속도가 아니라, 실행에 들어가는 입력을 명령줄에 전부 적게 만드는 데 있습니다.

플래그 조합 제약

공식모든 CLI 옵션이 -p와 조합되지는 않습니다. 클로드코드는 --bg를 거부하고, 작업 설명을 붙인 --cloud도 거부하면서 무엇이 충돌하는지 오류로 알립니다. 세션 ID를 붙인 --cloud에 -p를 함께 주면 그 클라우드 세션에 메시지를 큐에 넣고 종료합니다. headless

공식--bg와의 충돌은 이유가 분명합니다. --bg는 나중에 claude agents로 붙는 백그라운드 세션을 만들고, --print는 붙을 대화형 세션을 아예 만들지 않아 붙을 수 없는 작업이 생깁니다. v2.1.198 이전에는 이 조합이 조용히 붙을 수 없는 작업을 만들었습니다. errors

런이 끝날 때 남는 것

공식claude -p 도중에 클로드가 백그라운드 Bash 작업을 띄웠다면(개발 서버나 watch 빌드 같은 것) 그 셸은 클로드가 최종 결과를 반환하고 stdin이 닫힌 뒤 약 5초 뒤에 종료됩니다. 결과 직후에 끝나는 작업이 출력을 전달할 여유를 주는 유예입니다. v2.1.163 이전에는 끝나지 않는 백그라운드 프로세스가 claude -p 호출을 무한히 붙잡았습니다. headless

공식백그라운드 서브에이전트와 워크플로는 결과가 최종 출력의 일부이므로 이 5초 유예에서 빠지고, claude -p가 완료를 기다립니다. v2.1.182부터 그 대기가 기본 10분으로 제한돼 멈춘 백그라운드 에이전트가 프로세스를 무한히 붙잡지 못합니다. 상한은 CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS로 조절하고 0으로 두면 제한 없이 기다립니다. headless

공식SIGTERM으로 런을 멈추면(kill, 프로세스 감시자, 세션을 닫는 SDK 호스트 등) 진행 중인 턴을 중단하고, 돌고 있던 Bash 명령의 프로세스 트리를 종료하고, SessionEnd 훅을 실행한 뒤 종료 코드 143으로 끝납니다. headless

143은 정상적인 취소 신호입니다. CI에서 타임아웃으로 죽인 잡을 "클로드코드 오류"로 집계하면 실패율이 부풀려집니다. 143은 따로 분류하는 것이 맞습니다.

실전이 편을 쓰는 작업 공간에서 claude -p 호출은 0건입니다. 볼트 전체의 .py·.sh·.mjs·.js·.bat·.md를 grep -rlE "claude -p |claude --print|claude-agent-sdk"로 훑어 일치가 하나도 없었고, find . -name .github -type d로 찾은 결과도 전부 node_modules 안 서드파티 패키지의 것이라 직접 만든 워크플로는 0개입니다. 이유는 안 좋아서가 아니라 붙을 파이프라인이 없어서입니다. 이 작업 공간은 깃 저장소가 아니고 문서를 다루는 드라이브 동기화 폴더이며, 자동화는 훅과 데스크톱 예약 작업으로 이미 붙어 있습니다.

실전그래서 34장을 읽기 전에 자기 환경을 먼저 확인하는 편이 낫습니다. CI가 없으면 34장은 지금 쓸 데가 없고 33장만 쓰입니다. 반대로 33장이 쓸 데가 없는 경우는 드뭅니다. 로컬 스크립트 한 줄에 넣는 것만으로도 값이 나오기 때문입니다.

33.2파이프 조립

공식비대화 모드는 stdin을 읽으므로 다른 명령줄 도구처럼 데이터를 밀어 넣고 응답을 리다이렉트할 수 있습니다. headless

빌드 로그를 넣어 원인 설명을 파일로 받기

cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt

공식파이프로 넣는 stdin은 10MB가 상한입니다. 넘으면 명확한 오류와 0이 아닌 상태로 종료합니다. 더 큰 입력은 파일로 쓰고 프롬프트에서 그 경로를 가리키게 합니다. headless

공식클로드코드가 stdin을 읽을 수 없으면(예를 들어 자기를 띄운 프로세스가 자기 쪽을 끊은 경우) stderr로 경고를 내고 명령줄의 프롬프트로 계속 진행합니다. v2.1.211 이전에는 윈도우에서 읽을 수 없는 stdin이 세션을 죽이거나 출력 없이 조용히 끝냈습니다. headless

빌드 스크립트에 넣기

공식비대화 호출을 스크립트로 감싸면 프로젝트 전용 린터나 리뷰어로 쓸 수 있습니다. 아래 package.json 스크립트는 main 대비 diff를 넣어 오타를 보고하게 합니다. diff를 파이프로 넣으므로 클로드가 그것을 읽을 Bash 권한이 필요 없고, 이스케이프한 큰따옴표가 윈도우에서도 그대로 돕니다. headless

{
  "scripts": {
    "lint:claude": "git diff main | claude -p \"you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.\""
  }
}
개념

권한을 파이프로 줄인다

클로드가 diff를 스스로 읽게 하면 Bash(git diff *) 권한을 줘야 합니다. 파이프로 밀어 넣으면 그 권한이 필요 없습니다. 무인 실행에서 권한 표면을 줄이는 가장 값싼 방법이 필요한 데이터를 미리 넣어 주는 것입니다. 이것은 L2의 권한 설계가 무인 실행에서 되돌아오는 지점입니다.

구조화 출력

공식--output-format으로 응답 형식을 고릅니다. headless

값내용
text기본값. 평문 출력
json결과, 세션 ID, 메타데이터가 담긴 구조화 JSON
stream-json실시간 스트리밍용 줄 단위 JSON

공식특정 스키마에 맞는 출력이 필요하면 --output-format json에 --json-schema와 JSON Schema 정의를 함께 줍니다. 응답에 요청 메타데이터(세션 ID, 사용량 등)가 담기고 구조화 출력은 structured_output 필드에 들어갑니다. headless

함수 이름을 문자열 배열로 받기

claude -p "Extract the main function names from auth.py" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'

공식스키마가 유효한 JSON Schema가 아니면 Error: --json-schema is not a valid JSON Schema와 검증기 진단을 출력하고 코드 1로 종료합니다. format 키워드(예: "format": "email")를 쓴 스키마는 받아들이지만 주석으로 취급하고 강제하지 않습니다. v2.1.205 이전에는 잘못된 스키마를 조용히 무시하고 비구조화 텍스트를 반환했고, format이 든 스키마는 전부 무효로 취급했습니다. headless

공식스키마 컴파일 전에 두 가지 검사가 먼저 돕니다. 파싱되지 않는 값은 is not valid JSON, 파싱은 되지만 객체가 아닌 값은 must be a JSON object로 거부합니다. 진단이 schema too large이면 중첩과 $ref 재사용을 줄입니다. errors

jq로 필요한 필드만 꺼내기

# 텍스트 결과
claude -p "Summarize this project" --output-format json | jq -r '.result'

# 구조화 출력
claude -p "Extract function names from auth.py" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
  | jq '.structured_output'

공식--output-format json의 응답에는 total_cost_usd와 모델별 비용 내역이 들어 있어 호출 단위 지출을 대시보드 없이 추적할 수 있습니다. 다만 둘 다 클라이언트 측 추정이라 실제 청구와 다를 수 있습니다. headless

스트리밍과 이벤트

공식토큰이 생성되는 대로 받으려면 --output-format stream-json에 --verbose와 --include-partial-messages를 함께 줍니다. 각 줄이 이벤트를 나타내는 JSON 객체이고, 스트림의 마지막 줄은 최종 응답 텍스트와 비용, 세션 메타데이터가 담긴 result 메시지입니다. headless

claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \
  jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

공식소비자가 스트림을 느리게 읽으면 클로드코드는 큐에 남은 출력이 빠질 때까지 기다린 뒤 종료하며, 남은 양에 따라 대기를 늘리되 30초가 상한입니다. v2.1.214 이전에는 종료 대기가 약 2초여서 큰 응답의 끝이 잘릴 수 있었습니다. headless

공식서브에이전트의 메시지는 parent_tool_use_id 필드에 자기를 띄운 도구 호출의 ID를 담고 스트림에 나타납니다. 메인 대화의 메시지는 그 필드가 null입니다. 기본적으로는 서브에이전트의 tool_use·tool_result 블록만 내보내므로, 텍스트와 사고 블록까지 받으려면 --forward-subagent-text를 주거나 CLAUDE_CODE_FORWARD_SUBAGENT_TEXT를 설정합니다(v2.1.211 이상). 켜면 중첩된 모든 깊이의 서브에이전트 메시지가 전달되므로 ID를 따라 중첩 트리를 복원할 수 있습니다. headless

CI 게이트로 쓰는 두 이벤트

공식system/init 이벤트는 모델, 도구, MCP 서버, 로드된 플러그인을 포함한 세션 메타데이터를 보고합니다. 여기 담긴 plugin_errors와 mcp_server_errors 배열이 CI 게이트의 재료입니다. 둘 다 오류가 없으면 키 자체가 빠지므로, 배열이 비어 있지 않은지로 실패를 판정할 수 있습니다. headless

필드내용
plugins정상 로드된 플러그인. 각각 name과 path
plugin_errors로드 시점 오류. 각각 plugin·type·message. 해당 플러그인은 plugins에서 빠집니다
mcp_servers세션의 MCP 서버. 각각 name과 status
mcp_server_errors설정 검증에서 건너뛴 --mcp-config 항목. type은 unknown_type·url_missing_type·invalid_config·reserved_name 같은 건너뛴 이유 범주입니다(v2.1.219 이상)

공식이것을 확인해야 하는 이유가 여기 있습니다. 클로드코드는 검증에 실패한 --mcp-config 항목을 건너뛰고 런을 계속해 정상 종료합니다. 터미널에서 손으로 돌리면 stderr에 경고가 뜨지만, CI 러너나 SDK 호스트가 stderr를 캡처하면 경고가 출력되지 않고 mcp_server_errors 필드에만 남습니다. 종료 코드만 보는 파이프라인은 MCP 서버가 하나도 안 붙은 채로 통과합니다. headless

공식-p와 함께 --mcp-config를 주면 클로드코드는 첫 턴 전에 아직 연결 중인 서버를 MCP_TIMEOUT 시작 타임아웃(기본 30초)까지 기다립니다. 도구 목록이 캐시된 원격 서버는 이 대기를 건너뛰고 pending으로 표시된 뒤 첫 도구 호출에서 연결합니다(v2.1.221 이상). headless

공식재시도 진행을 알고 싶으면 system/api_retry 이벤트를 씁니다. 재시도 가능한 오류로 API 요청이 실패할 때마다 재시도 전에 나옵니다. attempt·max_retries·retry_delay_ms·error_status·error 필드가 담기고, error는 authentication_failed·rate_limit·overloaded·server_error 같은 범주 문자열입니다. headless

도구 사전 승인과 권한 모드

공식--allowedTools는 프롬프트 없이 쓸 도구를 지정합니다. 세션 전체의 기준선을 정하려면 개별 도구를 열거하는 대신 권한 모드를 넘깁니다. dontAsk는 permissions.allow 규칙이나 읽기 전용 명령 집합에 없는 것을 전부 거부하므로 잠긴 CI 런에 맞습니다. AskUserQuestion, 조직이 ask로 설정한 커넥터 도구, requiresUserInteraction이 붙은 MCP 도구는 허용 규칙이 맞아도 거부됩니다. headless

공식acceptEdits는 파일 쓰기를 프롬프트 없이 허용하고 mkdir·touch·mv·cp 같은 흔한 파일 시스템 명령까지 자동 승인합니다. 다른 셸 명령과 네트워크 요청은 여전히 --allowedTools 항목이나 permissions.allow 규칙이 필요하고, 없으면 시도하는 순간 런이 중단됩니다. headless

공식--allowedTools는 권한 규칙 문법을 씁니다. 뒤에 붙는 *가 접두 일치를 켜므로 Bash(git diff *)는 git diff로 시작하는 모든 명령을 허용합니다. * 앞의 공백이 중요합니다. 없으면 Bash(git diff*)가 git diff-index까지 함께 허용합니다. headless

스테이징된 변경을 보고 커밋까지

claude -p "Look at my staged changes and create an appropriate commit" \
  --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

대화 이어 가기

공식--continue는 가장 최근 대화를 잇고, --resume은 세션 ID로 특정 대화를 잇습니다. 여러 대화를 돌린다면 세션 ID를 잡아 두고 그것으로 재개합니다. headless

session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"

공식두 명령을 서로 다른 디렉터리에서 돌려도 됩니다. 클로드코드가 이 기계의 어느 프로젝트에서든 ID로 세션을 찾습니다. v2.1.223 이전에는 현재 프로젝트 디렉터리와 그 워크트리에서만 찾았으므로 같은 디렉터리에서 돌려야 했습니다. headless

공식사용자가 부르는 스킬과 커스텀 명령은 -p 모드에서도 동작합니다. 프롬프트 문자열에 /skill-name을 넣으면 실행 전에 펼쳐집니다. /login처럼 터미널 인터페이스에서만 도는 내장 명령은 쓸 수 없습니다. /model·/effort·/fast는 값을 인자로 받고(예: /model sonnet), 설정을 바꾸려면 /config에 key=value를 넘깁니다(v2.1.205 이상). headless

33.3CLI 플래그 전량

공식공식 CLI 레퍼런스에는 명령 32개와 롱 플래그 79개가 실려 있습니다. cli-reference

실전이 두 숫자는 문서를 직접 세어 얻은 값입니다. 2026-08-11 기준이고, 다음 명령으로 언제든 다시 셀 수 있습니다. 플래그가 늘어나는 문서라 인용한 숫자를 신뢰하기보다 이 명령을 돌리는 편이 낫습니다.

curl -sS https://code.claude.com/docs/en/cli-reference.md \
  | python3 -c "
import sys,re
t=sys.stdin.read()
i=t.index('## CLI flags'); k=t.index('### System prompt flags'); j=t.index('## CLI commands')
print('롱 플래그:', len(set(re.findall(r'\`(--[a-z0-9-]+)', t[i:k]))))
print('명령:', len(re.findall(r'^\|\s*\`(claude[^\`]*)\`', t[j:i], re.M)))
"

관행79개를 다 외우는 사람은 없습니다. 무인 실행에서 실제로 손이 가는 것은 열 개 남짓이고, 나머지는 필요할 때 레퍼런스를 여는 대상입니다. 아래 표는 그 열 개 남짓을 목적별로 묶은 것입니다. 전량은 위 레퍼런스가 정본이니 여기서 다시 옮기지 않습니다.

목적플래그비대화에서의 쓸모
비대화로 실행--print, -p이 장의 전제
맥락 자동 로드 끄기--bare재현성. CI 권장
출력 형식--output-format, --json-schema, --include-partial-messages다음 프로그램이 읽을 값 만들기
권한--allowedTools, --permission-mode, --permission-prompt-tool물어볼 사람이 없을 때의 대체
상한--max-turns, --max-budget-usd폭주 방지
맥락 주입--settings, --mcp-config, --agents, --add-dirbare 모드에서 필요한 것만 넣기
시스템 프롬프트--system-prompt, --append-system-prompt, 각 -file 변형역할 고정
설정 출처 제한--setting-sources, --strict-mcp-config로컬 설정 유입 차단
세션--continue, --resume, --session-id, --fork-session여러 호출을 한 맥락으로
모델과 노력--model, --fallback-model, --effort단계별 비용 조절
진단--debug, --debug-file, --verboseCI 로그에서 원인 찾기

--max-budget-usd와 --max-turns는 무인 실행에서 성격이 다릅니다. 턴 상한은 "몇 번 왕복할지"를 막고, 예산 상한은 "얼마까지 쓸지"를 막습니다. 한 턴이 큰 파일을 여러 개 읽으면 턴은 적어도 비용은 큽니다. 예약이나 CI로 반복해 도는 것에는 둘 다 붙이는 편이 안전합니다.

공식명령 쪽에서 비대화와 함께 자주 쓰이는 것은 claude update, claude doctor, claude setup-token, claude auth status입니다. claude setup-token은 구독으로 인증하는 장수명 토큰을 만들어 CI에 넣을 때 쓰고, claude doctor는 설치 상태를 점검합니다. cli-reference

33.4에러와 재시도

공식클로드코드는 일시적 실패를 지수 백오프로 최대 10번 재시도한 뒤에 오류를 보여 줍니다. 클로드의 응답이 진행되던 중에 도착한 실패는 항상 재시도하지는 않습니다. 즉 이 문서의 오류 메시지를 보고 있다면 해당 실패에 적용되는 재시도는 이미 끝난 상태입니다. errors

재시도하는 실패재시도하지 않는 실패
응답이 스트리밍되기 전에 도착한 서버 오류, 과부하 응답, 요청 타임아웃 TLS 인증서 검증 실패(검사 프록시, 누락된 NODE_EXTRA_CA_CERTS, 만료 인증서)
끊긴 연결. 응답의 어느 부분도 완료되기 전이면 같은 백오프로 재요청 클로드가 텍스트 블록이나 도구 호출을 완료한 뒤에 온 서버 오류·연결 끊김·스톨
멈춘 응답 스트림. 10회 예산과 별개로 최대 한 번 재요청 응답이 끝난 뒤 도착한 실패(재시도할 것이 없습니다)
일시적 429 스로틀. 구독 로그인의 쿼터 헤더 없는 429 포함 Bedrock 스트리밍 응답의 예상 밖 content-type(v2.1.208 이상)

공식도구 호출을 완료한 뒤의 실패를 재시도하지 않는 이유는 분명합니다. 재요청하면 같은 도구 호출을 두 번 실행할 수 있기 때문입니다. 그래서 완료된 것은 남기고 불완전 응답 안내를 보여 준 뒤, 완료된 도구 호출의 결과에서 턴을 이어 갑니다. v2.1.199 이전에는 부분 출력을 버리고 턴 전체를 오류로 보고했습니다. errors

무인 실행에서 바꿔야 하는 환경 변수 세 개

공식재시도 동작은 환경 변수로 조절합니다. errors

변수기본효과
CLAUDE_CODE_MAX_RETRIES10 재시도 횟수. v2.1.186부터 15가 상한이고, v2.1.199부터 CLAUDE_CODE_RETRY_WATCHDOG가 기본을 올리고 상한을 없앱니다. 스크립트에서는 낮춰서 실패를 빨리 드러내는 쪽이 낫습니다
CLAUDE_CODE_RETRY_WATCHDOG미설정 CI 잡 같은 무인 세션에서 1로 두면 429·529 용량 오류를 무한히 재시도합니다. v2.1.199부터 다른 일시적 오류의 기본 재시도 횟수도 300(백오프 약 3시간)으로 올립니다
API_TIMEOUT_MS600000 요청당 타임아웃(밀리초). 느린 네트워크나 프록시에서 올립니다

이 표의 두 줄이 서로 반대 방향입니다. MAX_RETRIES를 낮추는 것은 빨리 실패해서 사람이 알게 하려는 것이고, RETRY_WATCHDOG를 켜는 것은 사람이 없으니 끝까지 기다리게 하려는 것입니다. 어느 쪽인지는 그 잡의 목적이 정합니다. 리뷰 봇처럼 결과가 늦어도 되는 것은 워치독, 배포 게이트처럼 붙잡고 있으면 안 되는 것은 낮은 재시도입니다.

공식재시도 중에는 스피너에 Retrying in Ns · attempt x/y 카운트다운이 오류 라벨과 함께 나옵니다. 요청이 아직 처리 중인데 20초 동안 응답 스트림에 데이터가 오지 않으면, 재시도가 시작되기 전에 Waiting for API response 배너가 먼저 나옵니다. 아직 실패한 것이 아니고, 클로드코드가 멈춘 연결을 끊는 지점까지 카운트다운이 도는 것입니다. errors

종료 코드로 갈라지는 실패

공식비대화 실행에서 스크립트가 분기할 수 있는 종료 지점은 이렇습니다. errors

상황종료어디에 나오나
정상 완료0결과가 stdout
잘못된 플래그0 아님런 시작 전 stderr
런 안 실패(인증 누락 등)0 아님stdout의 결과로
잘못된 --json-schema1stderr, 검증기 진단 포함
--settings 파일이 2MiB 초과1시작 시 stderr
SIGTERM으로 중단143SessionEnd 훅 실행 후 종료

공식오류 문서는 메시지를 그대로 키로 삼아 원인과 대처를 적는 구조입니다. 무인 실행과 관계가 깊은 절은 명령줄 오류, 네트워크와 연결 오류, 사용량 한도, 인증 오류 네 곳입니다. errors

실전이 편을 쓰는 기계의 클로드코드는 claude --version으로 2.1.193입니다. 그런데 이 절에 인용한 동작 중 상당수가 그보다 뒤 버전을 요구합니다. --bg와 -p 충돌 오류는 v2.1.198 이상, --json-schema 검증은 v2.1.205 이상, mcp_server_errors는 v2.1.219 이상입니다. 즉 지금 이 기계에서는 잘못된 스키마를 넘겨도 오류가 아니라 비구조화 텍스트가 나옵니다. 무인 실행을 설계할 때 문서의 버전 조건과 자기 설치 버전을 먼저 대조하는 것이 이 절의 실질적 첫 단계입니다. 문서가 "v2.1.219 이상"이라고 적어 둔 곳은 그 아래 버전에서 조용히 다르게 동작한다는 뜻이고, CI는 조용한 차이를 사람에게 알려 주지 않습니다.

실습

비대화 호출 하나를 게이트로 만들기

  1. claude --version을 실행해 자기 버전을 적어 둡니다.
  2. 아무 프로젝트에서 claude --bare -p "이 저장소의 목적을 한 문장으로" --allowedTools "Read,Glob" --output-format json을 돌립니다.
  3. 출력을 jq -r '.result'로 통과시켜 문장만 꺼냅니다.
  4. echo $?로 종료 코드를 확인합니다.
  5. 이번에는 일부러 --json-schema '{"type":"nope"}'를 붙여 다시 돌리고, 오류가 나는지 아니면 그냥 텍스트가 나오는지 봅니다. 후자라면 1단계의 버전이 v2.1.205 아래입니다.

여기까지 되면 구조화 출력, 권한 사전 승인, 종료 코드 분기, 버전 조건 확인이라는 무인 실행의 네 재료를 한 번에 만져 본 것입니다.

34장으로 넘어가기 전에
  • -p 호출 하나를 --output-format json으로 돌려 jq로 필드를 꺼내 봤습니다.
  • --bare를 붙였을 때와 안 붙였을 때 무엇이 달라지는지 말할 수 있습니다.
  • 런 안 실패가 stdout으로 나온다는 것을 알고, 종료 코드와 함께 확인하고 있습니다.

34

CI/CD 통합

33장의 호출을 파이프라인 안에 넣습니다. 여기서 달라지는 것은 두 가지입니다. 자격증명을 시크릿으로 넣어야 하고, 누가 이 실행을 촉발할 수 있는지를 정해야 합니다.

이름이 비슷한 제품이 여럿 있어 먼저 갈라 둡니다. Claude Code GitHub Actions는 워크플로 파일로 직접 구성하는 것이고, Code Review는 워크플로 없이 PR마다 자동 리뷰가 도는 별개 제품입니다. Agent SDK는 그 GitHub Action의 내부이기도 합니다. 34.1과 34.5가 앞의 둘, 35장이 마지막입니다.

34.1GitHub Actions

공식Claude Code GitHub Action은 저장소의 워크플로 안에서 클로드코드를 돌리는 GitHub Action입니다. PR이나 이슈 코멘트에 @claude를 언급하면 코드를 분석하고 변경을 구현하고 커밋을 푸시합니다. 프롬프트를 주면 어떤 GitHub 이벤트에서도 자동으로 돌 수 있습니다. github-actions

설치 두 갈래

공식설치 경로는 둘입니다. 어느 쪽이든 저장소 관리자 권한이 필요합니다. github-actions

경로방법고르는 기준
빠른 설치 클로드코드에서 /install-github-app 실행 GitHub App 설치, 인증 시크릿 추가, 워크플로 PR 준비를 클로드코드가 대신합니다
수동 설치 앱 설치, 시크릿 추가, 워크플로 파일 복사를 직접 로컬에서 클로드코드를 안 쓸 때, 명령이 실패할 때, 워크플로 파일을 완전히 통제하고 싶을 때

공식빠른 설치는 GitHub CLI(gh)를 먼저 설치해 gh auth login으로 인증해 둬야 합니다. 클로드코드가 그것을 확인하고 없으면 경고합니다. 그다음 자격증명을 저장소 시크릿으로 저장하는데, API 키는 ANTHROPIC_API_KEY, 구독 토큰은 CLAUDE_CODE_OAUTH_TOKEN이라는 이름을 씁니다. github-actions

공식구독 토큰은 로컬에서 claude setup-token으로 만듭니다. Pro, Max, Team, Enterprise 플랜에서 쓸 수 있습니다. 워크플로 파일에서는 API 키는 anthropic_api_key, OAuth 토큰은 claude_code_oauth_token 입력으로 넘깁니다. github-actions

공식조직 전체에 깔 때는 API 키를 쓰는 편이 맞습니다. OAuth 토큰은 claude setup-token을 돌린 사람의 구독에 묶여 있어서 여러 저장소가 공유하는 시크릿으로는 적절하지 않습니다. 장수명 시크릿을 아예 두지 않으려면 워크로드 아이덴티티 페더레이션을 씁니다. 워크플로의 GitHub OIDC 토큰을 콘솔 서비스 계정을 통해 클로드 API 접근으로 교환하는 방식이고, id-token: write 권한이 필요합니다. github-actions

대화 모드와 자동화 모드

공식이 액션은 워크플로 구성을 보고 어느 모드로 돌지 스스로 판단합니다. 기준은 prompt 입력 하나입니다. github-actions

모드조건발동결과가 나오는 곳
대화 모드prompt 없음 이슈·PR 코멘트, PR 리뷰, 새로 열린 이슈의 본문이나 제목에서 트리거 문구(기본 @claude)를 기다립니다 촉발한 이슈나 PR의 코멘트
자동화 모드prompt 있음 언급을 기다리지 않고 바로 돕니다(접근 검사만 통과하면) 워크플로 실행 로그

공식두 모드 모두 클로드가 시작하기 전에 촉발한 주체를 두 번 검사하고, 어느 검사든 거부하면 실행이 실패합니다. 첫째는 쓰기 권한입니다. 이슈와 PR 이벤트에서는 촉발한 사용자가 저장소 쓰기 권한을 가져야 합니다. schedule 트리거처럼 작성자가 없는 이벤트는 이 검사를 건너뜁니다. 둘째는 사람 여부입니다. 모든 이벤트에서 봇 주체를 거부하며, allowed_bots에 열거한 것만 허용합니다. 클로드가 봇에 촉발돼 무한 반복하는 것을 막는 장치입니다. github-actions

공식예약 실행에서 이 두 번째 검사가 함정이 됩니다. GitHub은 예약 실행을 저장소 사용자에게 귀속시키는데, 보통 워크플로의 cron 일정을 마지막으로 바꾼 사람입니다. 그 사용자가 봇이면 allowed_bots에 넣어야 실행됩니다. github-actions

가장 흔한 워크플로: 언급에 응답

공식아래는 대화 모드 워크플로입니다. 보일러플레이트가 아닌 부분만 짚으면 id-token: write는 기본 GitHub App 인증에 필요하고, actions: read는 클로드가 PR의 CI 결과를 읽게 하며, if는 @claude가 없는 코멘트에서 러너가 켜지지 않게 합니다. github-actions

name: Claude Code
on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
jobs:
  claude:
    if: contains(github.event.comment.body, '@claude')
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
      issues: write
      id-token: write
      actions: read
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 1
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

예약 실행: 프롬프트에 도구를 함께 준다

공식prompt 입력이 있으면 크론을 포함한 어떤 GitHub 이벤트에서도 자동화 모드로 돕니다. 다만 평문 프롬프트에서는 클로드가 셸도 GitHub API 접근도 없는 상태로 시작합니다. claude_args의 --allowedTools나 settings 입력의 permissions.allow 규칙으로 필요한 도구를 직접 줘야 합니다. 스킬을 부르면 그 스킬의 allowed-tools 프론트매터가 주는 도구를 쓸 수 있습니다. github-actions

name: Daily Report
on:
  schedule:
    - cron: "0 9 * * *"
jobs:
  report:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: read
      id-token: write
    steps:
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: "Generate a summary of yesterday's commits and open issues"
          claude_args: |
            --model claude-opus-4-8
            --allowedTools "mcp__github__list_commits,mcp__github__list_issues"

공식이 예시는 GitHub API로 커밋과 이슈를 읽으므로 체크아웃 단계를 생략할 수 있습니다. GitHub은 예약 워크플로를 기본 브랜치에서만 돌리고, 공개 저장소에서는 저장소 활동이 60일 없으면 일정을 비활성화합니다. github-actions

스킬과 플러그인을 CI에서 부르기

공식prompt는 평문뿐 아니라 스킬 호출도 받습니다. 저장소 .claude/skills/의 스킬은 anthropics/claude-code-action 단계 전에 actions/checkout을 돌려 파일이 러너에 있게 한 뒤 /skill-name을 프롬프트로 넘깁니다. 플러그인에 담긴 스킬은 plugin_marketplaces와 plugins 입력으로 설치한 뒤 /plugin-name:skill-name을 넘깁니다. plugins 입력은 plugin-name@marketplace-name 형식이고, 마켓플레이스 이름은 저장소 URL이 아니라 그 마켓플레이스의 매니페스트에 적힌 이름입니다. github-actions

공식공개 저장소에서는 GitHub이 포크 PR로 촉발된 실행에 시크릿을 주지 않습니다. 그래서 포크에서 온 PR에는 리뷰가 돌지 않고, 같은 저장소의 브랜치에서 온 PR에만 돕니다. github-actions

주요 입력

공식자주 쓰는 입력만 옮깁니다. 전량은 액션 저장소의 구성 레퍼런스가 정본입니다. github-actions

입력내용
prompt클로드에게 줄 지시. 평문 또는 스킬 호출. 생략하면 트리거 문구를 기다립니다
claude_args클로드코드에 넘길 CLI 인자
anthropic_api_key클로드 API 키. Bedrock·Agent Platform·Foundry에서는 쓰지 않습니다
claude_code_oauth_token구독 인증 OAuth 토큰
github_tokenGitHub 작업용 토큰. 생략하면 클로드 GitHub App으로 인증합니다
plugin_marketplaces, plugins줄바꿈으로 구분한 마켓플레이스 Git URL과 설치할 플러그인 이름
settings클로드코드 설정. JSON 문자열이나 설정 파일 경로
trigger_phrase응답할 트리거 문구. 기본 @claude
use_bedrock, use_vertex, use_foundry클라우드 제공자로 추론을 돌립니다

공식claude_args는 CLI 인자를 그대로 받으므로 33.3의 플래그가 여기서 다시 쓰입니다. 자주 쓰는 것은 --max-turns, --model, --mcp-config, --allowedTools, --debug입니다. --model을 주지 않으면 클로드코드 기본 모델을 씁니다. github-actions

비용이 두 갈래로 나간다

공식실행마다 두 종류의 자원이 듭니다. GitHub 호스티드 러너가 쓰는 Actions 분과, 프롬프트·응답 길이·작업 복잡도·코드베이스 크기에 따라 붙는 API 토큰입니다. OAuth 토큰으로 인증하면 API 청구 대신 구독을 씁니다. github-actions

공식둘 다 줄이는 방법으로 공식 문서가 적는 것은 여섯입니다. 구체적인 @claude 요청을 써서 턴 수를 줄이기, 이슈 템플릿으로 맥락을 앞에 주기, CLAUDE.md를 짧게 유지하기(매 실행마다 읽습니다), claude_args에 --max-turns를 넣기, 워크플로 수준 타임아웃을 걸기, GitHub 동시성 제어로 병렬 실행을 제한하기입니다. github-actions

개념

CLAUDE.md가 CI에서는 고정 비용이 된다

대화형에서 CLAUDE.md는 세션당 한 번 읽는 비용입니다. CI에서는 실행마다 읽는 비용이고, 하루 수십 번 도는 워크플로에서는 그 길이가 그대로 청구서에 곱해집니다. L2에서 배운 "CLAUDE.md를 짧게"라는 규칙이 여기서 경제적 이유를 얻습니다.

안 되는 세 가지

공식클로드가 @claude에 응답하지 않으면 앱 설치 여부, 저장소의 워크플로 활성화, 시크릿 설정, @claude가 온전한 단어로 들어갔는지(/claude나 @claude-bot은 아닙니다), 코멘트 작성자의 쓰기 권한을 차례로 봅니다. github-actions

공식클로드의 커밋에 CI가 안 도는 것은 GitHub의 규칙 때문입니다. 기본 GITHUB_TOKEN으로 만든 커밋에는 워크플로가 촉발되지 않습니다. github_token: ${{ secrets.GITHUB_TOKEN }}를 넘기고 있다면 그것을 지워 클로드 GitHub App으로 인증하게 하거나, 커스텀 앱 토큰을 넘깁니다. github-actions

공식베타에서 올라오는 경우 네 단계입니다. uses 줄의 @beta를 @v1로 바꾸고, 모드를 자동 판단하므로 mode 입력을 지우고, direct_prompt를 prompt로 바꾸고, max_turns·model 같은 CLI 옵션을 claude_args로 옮깁니다. custom_instructions는 같은 이름의 플래그가 없어 --append-system-prompt가 됩니다. github-actions

34.2클라우드 제공자로 돌리기

공식기본적으로 이 액션은 API 키나 OAuth 토큰으로 클로드 API를 직접 부릅니다. 추론을 자기 클라우드 계정으로 보내려면 제공자 입력 하나를 켭니다. 셋 다 클로드 API 키 대신 OIDC 아이덴티티 페더레이션으로 인증하므로 정적 클라우드 자격증명을 저장소에 두지 않습니다. github-actions-cloud-providers

제공자입력클라우드 쪽에 필요한 것
Amazon Bedrockuse_bedrock: "true"IAM 역할과 OIDC 아이덴티티 공급자. 클로드 모델 접근 승인
Google Cloud의 Agent Platformuse_vertex: "true"Workload Identity Federation 자원과 서비스 계정. Agent Platform API 활성화
Microsoft Foundryuse_foundry: "true"Microsoft Entra 애플리케이션. 클로드 모델 배포가 있는 Foundry 자원

공식셋의 설치 절차는 클라우드 쪽 구성만 다르고 나머지는 같습니다. 조직이 이미 클로드 모델 접근을 가진 쪽을 고르면 됩니다. 저장소 관리자 권한과 클라우드 계정에서 아이덴티티 자원을 만들 권한이 함께 필요합니다. github-actions-cloud-providers

공식Bedrock에서 교차 리전 추론 프로파일(예시의 us. 접두 모델 ID 같은 것)을 쓰면 그 리전 그룹의 모든 리전에서 접근이 승인돼 있어야 합니다. 한 리전만 열어 두고 실패하는 경우가 여기서 나옵니다. github-actions-cloud-providers

제공자별 배포 형태 전체(게이트웨이, 자체 호스팅, 리전 선택)는 이 편의 범위가 아니고 L6 조직 도입의 38장에서 다룹니다. 34.2는 "CI 잡 하나를 우리 클라우드로 돌리는" 최소 경로만 봅니다.

34.3GitLab CI/CD

공식GitLab에서는 전용 액션 없이 .gitlab-ci.yml 잡 안에서 클로드코드를 설치해 claude -p로 부릅니다. 즉 33장의 호출이 그대로 쓰이는 형태입니다. gitlab-ci-cd

공식동작 구조는 셋으로 정리됩니다. 첫째 이벤트 기반 조율로, GitLab이 고른 트리거(예를 들어 이슈·MR·리뷰 스레드에서 @claude를 언급한 코멘트)를 듣고 잡이 스레드와 저장소에서 맥락을 모아 프롬프트를 만듭니다. 둘째 제공자 추상화로, 클로드 API·Amazon Bedrock·Google Cloud의 Agent Platform 중 환경에 맞는 것을 씁니다. 셋째 샌드박스 실행으로, 각 상호작용이 네트워크와 파일 시스템 규칙이 엄격한 컨테이너에서 돌고 모든 변경이 MR을 통과합니다. gitlab-ci-cd

기본 .gitlab-ci.yml(클로드 API)

stages:
  - ai

claude:
  stage: ai
  image: node:24-alpine3.21
  rules:
    - if: '$CI_PIPELINE_SOURCE == "web"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  variables:
    GIT_STRATEGY: fetch
  before_script:
    - apk update
    - apk add --no-cache git curl bash
    - curl -fsSL https://claude.ai/install.sh | bash
  script:
    - /bin/gitlab-mcp-server || true
    - >
      claude
      -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"
      --permission-mode acceptEdits
      --allowedTools "Bash Read Edit Write mcp__gitlab"
      --debug
  # 클로드코드가 CI/CD 변수의 ANTHROPIC_API_KEY 를 씁니다

공식설치는 두 단계입니다. Settings → CI/CD → Variables에서 ANTHROPIC_API_KEY를 마스킹 변수로 추가하고(필요하면 protected로), 위 잡을 .gitlab-ci.yml에 넣습니다. 그다음 CI/CD → Pipelines에서 손으로 돌려 확인하거나 MR에서 촉발합니다. gitlab-ci-cd

공식프로덕션에는 수동 설치를 권합니다. 제공자 접근을 먼저 구성하고(Bedrock은 AWS OIDC와 IAM 역할, Agent Platform은 Workload Identity Federation), GitLab API 작업용 자격증명을 더하고(기본은 CI_JOB_TOKEN, 또는 api 범위 프로젝트 액세스 토큰을 GITLAB_ACCESS_TOKEN으로 마스킹 저장), 언급 기반 트리거가 필요하면 "Comments (notes)" 프로젝트 웹훅을 이벤트 리스너에 붙여 AI_FLOW_INPUT·AI_FLOW_CONTEXT 같은 변수로 파이프라인 트리거 API를 부르게 합니다. gitlab-ci-cd

개념

GitHub과 GitLab의 차이는 조립 지점이다

GitHub 쪽은 액션이 트리거 감지, 권한 검사, 코멘트 게시까지 맡습니다. GitLab 쪽은 그 자리를 직접 조립합니다. 웹훅 리스너를 두고, 트리거 API를 부르고, 변수로 맥락을 넘깁니다. 자유도가 크고 손이 더 갑니다. 이 차이가 34.1의 표(입력 목록)와 34.3의 코드(잡 정의)가 다르게 생긴 이유입니다.

공식거버넌스 면에서 공식 문서가 적는 것은 다섯입니다. 각 잡이 네트워크 접근이 제한된 격리 컨테이너에서 돌고, 변경이 MR로 흘러 리뷰어가 모든 diff를 보고, 브랜치 보호와 승인 규칙이 AI 생성 코드에도 적용되고, 워크스페이스 범위 권한으로 쓰기를 제약하고, 자기 제공자 자격증명을 쓰므로 비용이 자기 통제 아래 남습니다. gitlab-ci-cd

34.4엔터프라이즈 서버

공식자체 호스팅 GitHub Enterprise Server(GHES)에서도 대부분 동작하지만 몇 가지가 다릅니다. 지원 여부를 먼저 봅니다. github-enterprise-server

기능GHES차이
웹 클로드코드지원Owner가 GHES 인스턴스를 한 번 연결하면 개발자는 claude --cloud나 claude.ai/code를 평소처럼 씁니다
Code Review지원github.com과 같은 자동 PR 리뷰
텔레포트 세션지원--teleport로 웹과 터미널 사이 이동
플러그인 마켓플레이스지원표면에 따라 자격증명 요구가 다릅니다
기여 지표지원웹훅으로 분석 대시보드에 전달
GitHub Actions지원워크플로를 수동으로 설치해야 합니다. /install-github-app은 github.com 전용입니다
GitHub MCP 서버미지원대신 GHES 호스트로 구성한 gh CLI를 씁니다

공식제약 둘의 우회는 각각 이렇습니다. /install-github-app 대신 claude.ai의 관리자 설치 흐름을 따르고, GitHub Actions 워크플로가 필요하면 예시 워크플로를 손으로 맞춥니다. GitHub MCP 서버 대신에는 gh auth login --hostname github.example.com으로 인증한 gh CLI를 쓰면 세션에서 클로드가 gh 명령을 쓸 수 있습니다. github-enterprise-server

GHES의 관리자 쪽 절차(네트워크 요건, 관리형 설정으로 마켓플레이스 사전 등록·허용)는 조직 관리의 일이라 L6에서 다시 다룹니다.

34.5PR 자동 리뷰

공식Code Review는 워크플로 파일 없이 PR마다 자동 리뷰를 돌리는 별개 제품입니다. Owner가 조직 단위로 한 번 켜고 어느 저장소에 적용할지 고릅니다. code-review

공식리뷰가 도는 방식이 이 제품의 성격을 정합니다. 여러 에이전트가 Anthropic 인프라에서 diff와 주변 코드를 병렬로 분석하고, 각 에이전트가 서로 다른 종류의 문제를 찾은 뒤, 검증 단계가 후보를 실제 코드 동작과 대조해 오탐을 걸러 냅니다. 결과는 중복 제거와 심각도 순위를 거쳐 문제가 있는 줄에 인라인 코멘트로 붙고 리뷰 본문에 요약이 남습니다. 평균 20분에 끝나고 비용은 PR 크기와 복잡도에 비례합니다. code-review

개념

이것이 L4의 팬아웃과 같은 구조다

여러 관점으로 팬아웃한 뒤 적대적으로 검증해 살아남은 것만 보고하는 구조는 L4 오케스트레이션의 워크플로 품질 패턴과 같습니다. 다른 점은 그 하네스를 내가 짜지 않고 제품이 들고 있다는 것뿐입니다. 자기 리뷰 하네스를 짜기 전에 이 제품을 먼저 켜 보는 편이 값싼 순서입니다.

심각도 세 단계

공식모든 발견에 심각도가 붙습니다. code-review

단계뜻
Important머지 전에 고쳐야 하는 버그
Nit고치면 좋지만 막지는 않는 사소한 문제
Pre-existing코드베이스에 이미 있었고 이 PR이 만든 것이 아닌 버그

공식각 발견에는 접히는 확장 추론 섹션이 있어 왜 플래그했고 어떻게 검증했는지 펼쳐 볼 수 있습니다. 코멘트에는 좋아요와 싫어요 반응이 미리 붙어 나오고, Anthropic이 PR 머지 후 반응 수를 모아 리뷰어를 조정합니다. 반응은 재리뷰를 촉발하지 않고 PR을 바꾸지도 않습니다. code-review

공식인라인 코멘트에 답글을 달아도 클로드는 응답하지 않고 PR을 갱신하지도 않습니다. 발견에 대응하는 방법은 코드를 고쳐 푸시하는 것입니다. 푸시 기반 리뷰를 구독한 PR이면 다음 실행이 해결된 스레드를 닫습니다. 푸시 없이 새 리뷰를 받으려면 최상위 PR 코멘트로 @claude review를 답니다. code-review

트리거를 저장소마다 고른다

공식설치 후 관리자 설정의 저장소 표에서 Review Behavior를 고릅니다. code-review

설정언제 도는가고르는 기준
Once after PR creationPR이 열리거나 리뷰 준비 상태가 될 때 한 번기본값으로 삼기 좋습니다
After every pushPR 브랜치에 푸시할 때마다PR이 커지며 생기는 문제를 잡고 고친 스레드를 자동으로 닫습니다. 가장 많이 돌고 가장 비쌉니다
Manual@claude review 코멘트가 있을 때만트래픽 많은 저장소에서 특정 PR만 넣거나, 준비된 뒤에만 리뷰하고 싶을 때

공식수동 트리거 명령은 셋이고 저장소 설정과 무관하게 동작합니다. @claude review는 구독 없이 한 번, @claude review always는 리뷰를 시작하고 이후 푸시에도 돌게 구독, @claude review once는 첫 번째와 같습니다. 최상위 PR 코멘트여야 하고, 명령이 코멘트 맨 앞에 있어야 하고, owner·member·collaborator 접근이 있어야 하고, PR이 열려 있어야 합니다. 자동 트리거와 달리 수동 트리거는 draft PR에서도 돕니다. code-review

공식2026년 7월 갱신 전에는 @claude review가 PR을 푸시 기반 리뷰에 구독시켰습니다. 그 동작에 의존했다면 이제 @claude review always를 써야 합니다. code-review

머지 게이트로 쓰려면 체크런을 파싱한다

공식리뷰는 인라인 코멘트 외에 Claude Code Review 체크런을 채웁니다. Details를 펼치면 심각도순 요약이 나오고, 각 발견은 Files changed 탭의 해당 diff 줄에 어노테이션으로도 붙습니다. 어노테이션과 심각도 표는 인라인 코멘트와 독립적으로 기록되므로, GitHub이 옮겨진 줄의 인라인 코멘트를 거부해도 남아 있습니다. code-review

공식체크런은 항상 neutral로 끝나므로 브랜치 보호 규칙으로 머지를 막지 않습니다. 발견으로 머지를 막고 싶으면 체크런 출력의 심각도 내역을 자기 CI에서 읽습니다. Details 텍스트의 마지막 줄이 기계가 읽는 주석이고, gh와 jq로 파싱할 수 있습니다. code-review

심각도별 개수 꺼내기

# 먼저 체크런 ID 를 찾습니다
gh api repos/OWNER/REPO/commits/<commit-sha>/check-runs --jq '.check_runs[] | {id, name}'

# Claude Code Review 의 id 를 넣어 심각도 내역을 꺼냅니다
gh api repos/OWNER/REPO/check-runs/CHECK_RUN_ID \
  --jq '.output.text | split("bughunter-severity: ")[1] | split(" -->")[0] | fromjson'

공식결과는 {"normal": 2, "nit": 1, "pre_existing": 0} 같은 JSON 객체입니다. normal 키가 Important 개수이고, 0이 아니면 머지 전에 고칠 버그를 최소 하나 찾은 것입니다. code-review

이것이 34장에서 가장 실용적인 조각입니다. "AI 리뷰가 막지 못한다"는 제약을 세 줄로 우회할 수 있고, 그 우회가 이 장의 다른 모든 내용보다 도입 결정에 크게 작용합니다. 다만 게이트를 normal > 0으로 두면 오탐 하나가 머지를 막으므로, 처음에는 게이트 없이 숫자만 기록해 오탐률을 보고 나서 켜는 순서가 낫습니다.

리뷰 기준을 저장소가 정한다

공식기본적으로 Code Review는 정확성에 집중합니다. 프로덕션을 깨뜨릴 버그를 보고, 포매팅 취향이나 테스트 커버리지 누락은 보지 않습니다. 무엇을 볼지 넓히려면 저장소에 안내 파일을 둡니다. code-review

공식저장소 루트의 REVIEW.md는 리뷰 파이프라인 모든 에이전트의 시스템 프롬프트에 최우선 지시 블록으로 주입되어 기본 리뷰 지침보다 앞섭니다. 그대로 붙여지므로 평문 지시로 씁니다. @ 임포트 문법은 펼쳐지지 않고 참조한 파일은 프롬프트로 읽히지 않으므로, 강제할 규칙을 파일에 직접 적습니다. code-review

공식공식 문서가 실효가 크다고 적는 조정 항목은 일곱입니다. 심각도 재정의, Nit 개수 상한, 스킵 규칙(생성 코드·락파일·벤더 의존성·기계가 만든 브랜치, CI가 이미 강제하는 것), 저장소 전용 검사, 검증 기준(예를 들어 동작 주장에 file:line 인용을 요구), 재리뷰 수렴(첫 리뷰 뒤에는 Nit을 억제), 요약 형태입니다. 길이에는 대가가 있어서 긴 REVIEW.md는 가장 중요한 규칙을 희석합니다. code-review

백엔드 서비스용 REVIEW.md 예시(공식 문서의 예시를 옮긴 것)

# Review instructions

## What Important means here

Reserve Important for findings that would break behavior, leak data,
or block a rollback: incorrect logic, unscoped database queries, PII
in logs or error messages, and migrations that aren't backward
compatible. Style, naming, and refactoring suggestions are Nit at
most.

## Cap the nits

Report at most five Nits per review. If you found more, say "plus N
similar items" in the summary instead of posting them inline.

## Do not report

- Anything CI already enforces: lint, formatting, type errors
- Generated files under `src/gen/` and any `*.lock` file
- Test-only code that intentionally violates production rules

## Always check

- New API routes have an integration test
- Log lines don't include email addresses, user IDs, or request bodies
- Database queries are scoped to the caller's tenant

로컬에서 같은 리뷰를 돌리기

공식/code-review 명령은 GitHub App 설치 없이 터미널에서 diff를 리뷰합니다. 정확성 버그와 함께 재사용·단순화·효율 정리 항목을 보고합니다. /review는 그 별칭입니다. 기본 대상은 브랜치의 업스트림 대비 커밋과 커밋되지 않은 변경이고, 파일 경로·PR 번호·브랜치 이름·main...my-feature 같은 ref 범위를 대상으로 줄 수 있습니다. code-review

플래그·인자효과
--fix리뷰 후 발견을 작업 트리에 적용합니다
--comment발견을 PR 인라인 코멘트로 게시합니다
노력 수준(low~max)low·medium은 확신하는 것만 보고해 오탐이 적고, high 이상은 커버리지를 넓히되 덜 확실한 것도 포함합니다

공식기본적으로 자기 맥락 창을 가진 백그라운드 서브에이전트로 돌아 대화를 채우지 않고, 완료되면 발견이 대화에 도착합니다. 다만 세 경우에는 앞단에서 돕니다. 앞선 리뷰가 진행 중인데 다시 부를 때, 비대화 모드(-p 플래그나 Agent SDK)에서 부를 때가 그렇습니다. code-review

공식두 가지가 직관과 다릅니다. 첫째 /code-review는 세션의 CLAUDE.md는 따르지만 REVIEW.md는 읽지 않습니다. 둘째 백그라운드 리뷰의 --fix 편집은 세션 체크포인트 밖에서 적용되므로 /rewind로 되돌려지지 않고 git으로 되돌려야 합니다(앞단에서 돌 때는 /rewind가 복원합니다). code-review

실전이 시리즈 여덟 편은 저장소가 없으므로 Code Review 제품을 쓸 수 없습니다. 대신 로컬 /code-review와 자체 검증기(픽스처_적용.py --검증)로 대체했고, 후자가 잡는 것은 마커·금지 문자·끊긴 앵커·라벨 규율처럼 이 문서에 고유한 규칙입니다. 여기서 배운 것은 안내 파일의 값입니다. REVIEW.md가 하는 일과 자체 검증기가 하는 일이 같은 성격이고, 둘 다 "일반 리뷰어가 모르는 우리 규칙"을 코드로 내리는 장치입니다. 기계로 검사할 수 있는 규칙을 REVIEW.md에 문장으로 적는 것은 낭비이고, 그 반대도 마찬가지입니다.

35장으로 넘어가기 전에
  • 내 저장소가 GitHub Actions·GitLab·GHES 중 어디인지, 그래서 34장의 어느 절이 내 것인지 알고 있습니다.
  • 자동화 모드에서 평문 프롬프트는 도구가 없는 상태로 시작한다는 것을 알고 있습니다.
  • Code Review 체크런이 머지를 막지 않으며, 막으려면 심각도 내역을 파싱해야 한다는 것을 알고 있습니다.

35

Agent SDK

여기서 방향이 바뀝니다. 33장과 34장은 클로드코드를 명령으로 불렀습니다. 35장은 같은 엔진을 라이브러리로 부릅니다. 내 프로그램이 주인이 되고 클로드코드가 그 안의 부품이 됩니다.

이 장은 공식 문서 32편을 아홉 절로 압축한 것입니다. API 시그니처 전량은 파이썬 레퍼런스와 타입스크립트 레퍼런스가 정본이고, 이 장은 무엇이 있고 언제 쓰는지까지만 다룹니다. 옵션 이름이나 타입이 필요하면 각 절의 각주 링크로 바로 넘어가는 것이 맞습니다. 여기서 옵션을 기억으로 채워 적지 않았습니다.

35.1SDK가 무엇인가

공식에이전트는 스스로 단계를 계획하고 파일을 읽거나 명령을 돌리거나 코드를 고치는 도구를 부르며 작업을 끝내는 애플리케이션입니다. Agent SDK는 클로드코드를 움직이는 같은 도구, 같은 에이전트 루프, 같은 맥락 관리를 파이썬과 타입스크립트로 프로그래밍할 수 있게 내놓은 것입니다. agent-sdk/overview

공식비슷한 이름의 선택지가 넷이라 먼저 갈라 둡니다. agent-sdk/overview

하려는 것쓸 것이유
도구 루프를 직접 구현하지 않고 에이전트를 만든다Agent SDK내 프로세스 안에서 에이전트 루프를 돌리는 라이브러리(파이썬·타입스크립트)
터미널에서 대화형 개발이나 일회성 작업클로드코드 CLI매일 쓰는 터미널 인터페이스
API를 직접 부르고 도구 루프를 내가 구현한다Client SDK클로드코드가 아니라 Anthropic API에 직접 접근합니다
샌드박스와 세션 인프라를 직접 관리하지 않고 장기 실행 에이전트를 돌린다Managed Agents호스티드 REST API. Agent SDK와 별개 제품이고 Anthropic이 에이전트와 샌드박스를 운영합니다

공식SDK는 파이썬과 타입스크립트 라이브러리로만 나옵니다. 다른 언어에서 같은 에이전트 루프를 돌리려면 -p와 --output-format json으로 CLI를 서브프로세스로 돌립니다. 즉 33장이 다른 언어의 SDK 역할을 합니다. agent-sdk/overview

공식클로드코드를 강하게 만드는 것은 전부 SDK에서 쓸 수 있습니다. 내장 도구, 훅, 서브에이전트, MCP, 권한, 세션, 스킬·명령·메모리, 플러그인입니다. 스킬·명령·메모리는 클로드코드와 같은 방식으로 프로젝트 .claude/와 ~/.claude/에서 자동 로드됩니다. agent-sdk/overview

에이전트 루프의 골격

공식루프는 턴과 메시지로 돕니다. 클로드가 계획하고, 도구를 부르고, 결과를 관찰하고, 다음을 정하는 왕복을 반복하며, 각 반복이 메시지를 하나 내놓습니다. 클로드의 추론, 도구 호출, 도구 결과, 그리고 최종 결과입니다. SDK가 조율·도구 실행·맥락 관리·재시도를 맡습니다. agent-sdk/agent-loop

개념

SDK를 쓰는 이유는 도구가 아니라 루프다

도구 몇 개를 붙이는 것은 API를 직접 불러도 됩니다. SDK가 대신하는 것은 루프의 지겨운 부분입니다. 맥락 창이 찼을 때 무엇을 압축할지, 도구가 실패했을 때 어떻게 이어 갈지, 재시도를 어디까지 할지, 서브에이전트 결과를 어떻게 합칠지입니다. 이 판단들이 클로드코드에 이미 들어 있고 SDK는 그것을 그대로 물려줍니다.

공식사전 승인을 받지 않은 서드파티 개발자는 자기 제품에서 claude.ai 로그인이나 그 사용량 한도를 제공할 수 없습니다. Agent SDK로 만든 에이전트도 여기 포함되므로 API 키 인증을 씁니다. agent-sdk/overview

공식브랜딩에도 제약이 있습니다. 파트너가 클로드를 참조할 때 "Claude Agent", 이미 Agents로 라벨된 메뉴 안의 "Claude", 기존 이름이 있으면 "{내 에이전트 이름} Powered by Claude"는 허용됩니다. "Claude Code"나 "Claude Code Agent"는 허용되지 않고, 클로드코드를 흉내 내는 ASCII 아트나 시각 요소도 안 됩니다. Agent SDK 사용은 Anthropic 상용 서비스 약관을 따릅니다. agent-sdk/overview

35.2시작하기

공식설치는 언어별로 한 줄입니다. 타입스크립트는 npm install @anthropic-ai/claude-agent-sdk, 파이썬은 pip install claude-agent-sdk 또는 uv add claude-agent-sdk입니다. 타입스크립트 새 프로젝트에서는 npm pkg set type=module로 최상위 await를 쓸 수 있게 하고 tsx를 개발 의존성으로 넣어 .ts를 바로 돌립니다. 기존 프로젝트가 CommonJS면 에이전트 스크립트를 agent.mts로 이름 붙여 그 파일만 ES 모듈로 취급하게 합니다. agent-sdk/quickstart

공식두 SDK 모두 네이티브 클로드코드 바이너리를 함께 담고 있어 대부분은 별도 설치가 필요 없습니다. 다만 두 경우에 바이너리가 없습니다. pip가 플랫폼 휠 대신 소스 배포판을 설치한 경우(예를 들어 ARM64 윈도우)와, 타입스크립트 SDK를 npm ci --omit=optional처럼 옵셔널 의존성을 건너뛰고 설치한 경우입니다. 후자는 옵셔널을 포함해 다시 설치하거나 네이티브 설치 후 pathToClaudeCodeExecutable로 경로를 줍니다. agent-sdk/quickstart

공식API 키는 ANTHROPIC_API_KEY 환경 변수로 줍니다. SDK는 에이전트를 돌리는 프로세스의 환경에서 키를 읽고 .env 파일을 자동으로 로드하지 않으므로, .env에 두었다면 dotenv 같은 것으로 직접 읽어 SDK 호출 전에 넣습니다. agent-sdk/quickstart

제공자환경 변수
Amazon BedrockCLAUDE_CODE_USE_BEDROCK=1 + AWS 자격증명
Claude Platform on AWSCLAUDE_CODE_USE_ANTHROPIC_AWS=1, ANTHROPIC_AWS_WORKSPACE_ID + AWS 자격증명
Google Cloud의 Agent PlatformCLAUDE_CODE_USE_VERTEX=1 + Google Cloud 자격증명
Microsoft FoundryCLAUDE_CODE_USE_FOUNDRY=1 + Azure 자격증명

공식가장 작은 에이전트는 이렇게 생겼습니다. 공식 퀵스타트는 일부러 버그를 넣은 utils.py를 만들고 그것을 찾아 고치게 합니다. agent-sdk/quickstart

파이썬

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage


async def main():
    async for message in query(
        prompt="Review utils.py for bugs that would cause crashes. Fix any issues you find.",
        options=ClaudeAgentOptions(
            allowed_tools=["Read", "Edit", "Glob"],
            permission_mode="acceptEdits",
        ),
    ):
        if isinstance(message, AssistantMessage):
            for block in message.content:
                if hasattr(block, "text"):
                    print(block.text)
                elif hasattr(block, "name"):
                    print(f"Tool: {block.name}")
        elif isinstance(message, ResultMessage):
            print(f"Done: {message.subtype}")


asyncio.run(main())

타입스크립트

import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Review utils.py for bugs that would cause crashes. Fix any issues you find.",
  options: {
    allowedTools: ["Read", "Edit", "Glob"],
    permissionMode: "acceptEdits"
  }
})) {
  if (message.type === "assistant" && message.message?.content) {
    for (const block of message.message.content) {
      if ("text" in block) console.log(block.text);
      else if ("name" in block) console.log(`Tool: ${block.name}`);
    }
  } else if (message.type === "result") {
    console.log(`Done: ${message.subtype}`);
  }
}

공식이 코드에 부분이 셋 있습니다. query는 에이전트 루프를 만드는 진입점이고 비동기 이터레이터를 반환하므로 메시지를 스트림으로 받습니다. prompt는 하려는 일이고 어떤 도구를 쓸지는 클로드가 판단합니다. options는 에이전트 구성입니다. agent-sdk/quickstart

공식실행 가능한 예제는 세 갈래로 갈립니다. 최소 프로젝트는 claude-agent-sdk-demos의 Hello World, 타입스크립트 애플리케이션은 같은 저장소의 데모들(이메일 클라이언트부터 다중 에이전트 리서치 시스템까지), 파이썬은 Claude Cookbook의 Agent SDK 레시피 연작입니다. 후자는 노트북마다 앞 것을 확장하는 순서로 되어 있습니다. agent-sdk/examples

35.3도구와 MCP

공식내 함수를 클로드가 부르게 하려면 커스텀 도구를 정의합니다. 도구는 네 부분입니다. 이름(클로드가 부를 식별자), 설명(언제 부를지 판단하는 근거), 입력 스키마, 핸들러(클로드가 부르면 도는 비동기 함수)입니다. 타입스크립트에서 스키마는 항상 Zod 스키마이고 핸들러의 인자 타입이 거기서 자동으로 잡힙니다. 파이썬에서는 이름과 타입의 딕셔너리(예: {"latitude": float})를 주면 SDK가 JSON Schema로 변환하고, enum·범위·선택 필드·중첩이 필요하면 완전한 JSON Schema 딕셔너리를 직접 줄 수도 있습니다. agent-sdk/custom-tools

공식핸들러 반환값은 content(필수, text·image·audio·resource·resource_link 타입의 결과 블록 배열), structuredContent(선택, 기계가 읽는 JSON), isError(선택, 도구 실패 신호)입니다. 정의한 도구는 createSdkMcpServer나 create_sdk_mcp_server로 감싸는데, 이 서버는 별도 프로세스가 아니라 내 애플리케이션 안에서 돕니다. agent-sdk/custom-tools

하려는 것방법
도구 정의파이썬 @tool, 타입스크립트 tool()
클로드에 등록SDK MCP 서버로 감싸 query()의 mcpServers에 넘김
사전 승인허용 도구 목록에 추가
내장 도구를 맥락에서 빼기tools 배열에 원하는 내장만 열거
병렬 호출 허용부작용 없는 도구에 readOnlyHint: true
클로드가 읽는 오류 메시지 통제isError: true로 메시지를 직접 구성
이미지·파일 반환image나 resource 블록
기계가 읽는 JSON 반환결과에 structuredContent
도구가 아주 많을 때도구 검색으로 필요할 때만 로드

공식readOnlyHint: true는 성능에 직접 영향을 줍니다. 부작용 없는 도구에 이것을 붙이면 클로드가 병렬로 부를 수 있습니다. 조회만 하는 도구에 이 힌트를 빼먹으면 직렬로 돌아 느려집니다. agent-sdk/custom-tools

외부 MCP 서버 연결

공식전송 방식은 서버 문서를 보고 고릅니다. 실행할 명령을 주면(예: npx @modelcontextprotocol/server-filesystem) stdio, URL을 주면 HTTP나 SSE, 코드로 직접 도구를 만든다면 SDK MCP 서버입니다. agent-sdk/mcp

stdio 서버 등록(파이썬)

options = ClaudeAgentOptions(
    mcp_servers={
        "filesystem": {
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "/Users/me/projects",
            ],
        }
    },
    allowed_tools=["mcp__filesystem__read_file", "mcp__filesystem__list_directory"],
)

도구가 수천 개일 때

공식도구 검색은 필요한 것만 온디맨드로 발견해 로드하는 방식으로 카탈로그를 수천 개까지 키웁니다. 상한은 셋입니다. 카탈로그 최대 10,000개, 검색당 기본 최대 5개의 관련 도구 반환, 그리고 모델 지원(Claude Sonnet 4.5, Haiku 4.5, Opus 4.5 이후 모델)입니다. agent-sdk/tool-search

개념

도구 목록도 맥락이다

도구를 붙이는 것은 무료가 아닙니다. 도구 정의가 모두 맥락 창에 들어가므로, 백 개를 붙이면 백 개의 설명이 매 요청마다 실립니다. 도구 검색은 그 비용을 검색 한 번으로 바꿉니다. L2의 맥락 예산 이야기가 SDK에서 도구 목록으로 다시 나타나는 지점입니다.

35.4제어면

같은 엔진을 쓰면서 행동을 내 쪽으로 끌어오는 네 가지 손잡이입니다. 시스템 프롬프트, 권한, 훅, 사용자 입력입니다.

시스템 프롬프트

공식SDK는 기본적으로 클로드코드의 시스템 프롬프트를 쓰지 않습니다. 최소 프롬프트로 시작하므로, 클로드코드처럼 동작하게 하려면 프리셋을 명시적으로 요청합니다(systemPrompt: { type: "preset", preset: "claude_code" }). 아니면 문자열을 그대로 넘겨 완전히 다른 역할을 줍니다. 이것이 v0.1.0의 파괴적 변경 중 하나이고, 이유는 SDK 애플리케이션에 더 나은 통제와 격리를 주기 위한 것입니다. agent-sdk/migration-guide

공식커스터마이즈 방법이 넷이고 공식 문서가 그 넷을 비교하는 표를 두고 있습니다. 프리셋, 커스텀 프롬프트, CLAUDE.md, append 방식입니다. 셋을 조합할 수도 있습니다. agent-sdk/modifying-system-prompts

권한 평가 순서

공식클로드가 도구를 요청하면 SDK가 여섯 단계로 검사합니다. 이 순서를 아는 것이 SDK 권한 설계의 핵심입니다. agent-sdk/permissions

  1. 훅이 먼저 돕니다. 훅은 호출을 즉시 거부하거나 통과시킬 수 있습니다. 다만 훅이 allow를 반환해도 아래의 deny·ask 규칙은 건너뛰지 않습니다.
  2. deny 규칙을 봅니다. 맞으면 bypassPermissions 모드에서도 차단됩니다. Bash처럼 이름만 쓴 거부 규칙은 이 평가가 시작되기 전에 도구를 맥락에서 아예 제거하므로, 여기서 검사되는 것은 Bash(rm *) 같은 범위 규칙뿐입니다.
  3. ask 규칙을 봅니다. 맞으면 bypassPermissions에서도 canUseTool 콜백으로 떨어집니다. AskUserQuestion과 requiresUserInteraction이 붙은 MCP 도구는 허용 규칙이 맞아도 항상 콜백으로 갑니다.
  4. 권한 모드를 적용합니다. bypassPermissions는 여기 도달한 것을 승인하고, acceptEdits는 파일 작업을 승인하고, plan은 파일 편집과 셸 쓰기 도구를 허용 규칙과 무관하게 콜백으로 보냅니다.
  5. allow 규칙을 봅니다. 맞으면 승인합니다.
  6. 어디서도 해결되지 않으면 canUseTool 콜백을 부릅니다. dontAsk 모드에서는 이 단계를 건너뛰고 거부합니다.

순서의 실제 함의는 2번과 3번입니다. bypassPermissions를 켜도 deny와 ask는 여전히 산다는 것이고, 이것이 무인 실행에서 마지막 안전선이 됩니다. 프로덕션 에이전트에 bypassPermissions를 쓸 때 위험한 명령을 deny 규칙으로 못 박아 두면 그 규칙은 우회되지 않습니다.

공식모드는 default, dontAsk, acceptEdits, bypassPermissions, plan입니다. dontAsk는 사전 승인되지 않은 것을 전부 거부하고 canUseTool을 아예 부르지 않으므로, 사람이 없는 실행에 가장 잘 맞습니다. agent-sdk/permissions

훅

공식SDK의 훅은 에이전트 실행 단계마다 내 코드를 끼워 넣습니다. 두 SDK 공통인 것과 타입스크립트 전용인 것이 갈립니다. PreToolUse(도구 호출 요청, 차단·수정 가능), PostToolUse(도구 실행 결과), PostToolUseFailure(도구 실행 실패)는 양쪽에 있고, PostToolBatch(도구 호출 배치 전체가 해결될 때 배치당 한 번)는 타입스크립트 전용입니다. agent-sdk/hooks

SDK 훅과 클로드코드 훅은 같은 이벤트 이름, 다른 등록 방법입니다. 클로드코드는 settings.json에 셸 명령을 적고, SDK는 옵션에 함수를 넘깁니다. 그래서 L3에서 만든 훅 로직은 SDK로 옮길 때 셸 스크립트를 함수로 바꾸는 작업이 됩니다.

승인과 되물음을 사용자에게 넘기기

공식클로드가 승인이나 확인이 필요할 때 그것을 사용자에게 보여 주고 결정을 SDK로 되돌려 주는 경로가 있습니다. 도구 승인 요청과 클로드의 되묻는 질문 둘을 다룹니다. 한 query() 호출 안에서 권한 프롬프트와 AskUserQuestion은 루프 안에서 처리되고 호출을 끝내지 않습니다. agent-sdk/user-input

35.5클로드코드 기능 재사용

공식프로젝트 지시, 스킬, 훅, 명령 같은 클로드코드 기능을 SDK 에이전트에 로드할 수 있습니다. 무엇을 로드할지는 settingSources(파이썬 setting_sources)로 정합니다. agent-sdk/claude-code-features

출처로드하는 것위치
"project"프로젝트 CLAUDE.md, .claude/rules/*.md, 프로젝트 스킬·훅·settings.json<cwd>/.claude/와 상위 디렉터리
"user"사용자 CLAUDE.md, ~/.claude/rules/*.md, 사용자 스킬·설정~/.claude/
"local"CLAUDE.local.md, .claude/settings.local.json<cwd>/.claude/와 상위 디렉터리

공식settingSources를 생략하면 ["user", "project", "local"]과 같습니다. 즉 CLI와 같은 맥락이 들어옵니다. 파일 시스템 설정과 격리해 돌리려면 빈 배열을 넘깁니다. 이 격리가 특히 중요한 곳은 CI/CD 파이프라인, 배포된 애플리케이션, 테스트 환경, 멀티테넌트 시스템입니다. 로컬 커스터마이징이 새어 들어가면 안 되는 곳입니다. agent-sdk/claude-code-features

공식이 기본값은 v0.1.0에서 잠깐 바뀌었다가 되돌려졌습니다. 그리고 파이썬 SDK 0.1.59 이하는 빈 리스트를 생략과 같게 취급했으므로, setting_sources=[]에 의존하려면 그보다 올려야 합니다. 격리를 믿고 있는데 실제로는 로컬 설정이 들어오는 상태가 여기서 생깁니다. agent-sdk/migration-guide

공식스킬은 SDK에서도 같은 방식으로 동작하고 위치·생성·도구 제한·발견·테스트 절차가 각각 정리돼 있습니다. 명령은 목록을 조회해 보내고 커스텀 명령을 만들 수 있습니다. 서브에이전트는 정의해 두고 불러 맥락을 격리하거나 병렬로 돌리거나 전문 지시를 적용합니다. 플러그인은 스킬·에이전트·훅·MCP 서버를 묶어 로컬 경로로 로드합니다. agent-sdk/skills slash-commands subagents plugins

공식서브에이전트는 턴당 몇 개를 위임하는 데 맞고, 수십에서 수백 개를 조율하는 실행에는 Workflow 도구를 씁니다. 오케스트레이션을 대화 맥락 밖에서 런타임이 실행하는 스크립트로 옮기는 방식입니다. 이 도구는 타입스크립트 Agent SDK v0.3.149 이상에서 쓸 수 있고, 자동 승인하려면 allowedTools에 Workflow를 넣습니다. agent-sdk/subagents

공식투두 추적은 TodoWrite 하나가 전체 배열을 다시 쓰던 방식에서 Task 도구들로 갈라졌습니다. 새 항목마다 TaskCreate, 상태 변경마다 TaskUpdate이고 TaskList·TaskGet으로 현재 목록을 읽습니다. 모니터링 코드는 여전히 어시스턴트 스트림의 tool_use 블록을 보지만, 전체 목록을 매번 교체하는 대신 작업 ID로 키를 잡은 맵을 유지합니다. 타입스크립트 Agent SDK 0.3.142와 클로드코드 v2.1.142부터 Task 도구가 기본입니다. agent-sdk/todo-tracking

35.6세션과 상태

공식세션 처리가 얼마나 필요한지는 애플리케이션 모양이 정합니다. 한 query() 호출 안에서는 에이전트가 필요한 만큼 턴을 돌고 권한 프롬프트도 루프 안에서 처리되므로, 세션 관리는 맥락을 공유해야 하는 프롬프트를 여러 번 보낼 때 비로소 문제가 됩니다. agent-sdk/sessions

만드는 것쓸 것
단발 작업(프롬프트 하나, 후속 없음)추가 조치 없음. query() 한 번
한 프로세스 안의 여러 턴 대화파이썬 ClaudeSDKClient, 타입스크립트 continue: true. SDK가 ID 없이 세션을 추적합니다
프로세스 재시작 후 이어 가기세션 ID로 재개

호스트가 바뀌어도 살아남게

공식기본적으로 세션 트랜스크립트는 컨테이너의 로컬 디스크에 있습니다. 다른 호스트에서 재개하려면 SessionStore 어댑터를 붙여 S3·Redis·자체 백엔드로 미러링합니다. SessionStore는 필수 메서드 둘(append로 트랜스크립트 항목을 쓰고 load로 재개할 때 읽습니다)과 선택 메서드 넷을 가진 객체입니다. agent-sdk/session-storage

type SessionStore = {
  // 필수
  append(key: SessionKey, entries: SessionStoreEntry[]): Promise<void>;
  load(key: SessionKey): Promise<SessionStoreEntry[] | null>;

  // 선택
  listSessions?(projectKey: string): Promise<Array<{ sessionId: string; mtime: number }>>;
  listSessionSummaries?(projectKey: string): Promise<SessionSummaryEntry[]>;
  delete?(key: SessionKey): Promise<void>;
  listSubkeys?(key: { projectKey: string; sessionId: string }): Promise<string[]>;
};

파일 되돌리기

공식체크포인팅은 세션 중 파일 변경을 추적해 이전 상태로 복원합니다. 다만 제약 다섯을 먼저 알아야 씁니다. agent-sdk/file-checkpointing

제약내용
도구 범위Write·Edit·NotebookEdit만. Bash 명령으로 만든 변경은 추적되지 않습니다
서브에이전트서브에이전트가 적용한 편집은 추적·복원되지 않습니다(앞단에서 도는 context: fork 스킬은 예외). git으로 되돌려야 합니다
같은 세션체크포인트는 그것을 만든 세션에 묶입니다
파일 내용만디렉터리 생성·이동·삭제는 되돌려지지 않습니다

첫 두 줄이 실제 사고를 만드는 지점입니다. rm이나 mv를 Bash로 돌린 변경, 그리고 서브에이전트가 만든 편집은 되돌아오지 않습니다. 되돌릴 수 있다고 믿고 위험한 작업을 맡기면 그 믿음이 틀린 경우가 정확히 이 두 경우입니다.

35.7출력

공식입력 모드가 둘입니다. 스트리밍 입력 모드가 권장이고, 단일 메시지 입력이 다른 하나입니다. 각각 언제 쓰는지는 공식 문서가 비교해 둡니다. agent-sdk/streaming-vs-single-mode

공식출력 쪽에서는 텍스트와 도구 호출이 생성되는 대로 받는 실시간 스트리밍을 켤 수 있고, StreamEvent 레퍼런스와 메시지 흐름, 스트리밍 UI를 만드는 절차가 정리돼 있습니다. agent-sdk/streaming-output

구조화 출력이 SDK에서 값을 하는 이유

공식에이전트는 기본적으로 자유 형식 텍스트를 반환합니다. 채팅에는 맞지만 결과를 프로그램으로 쓸 때는 맞지 않습니다. JSON Schema로 원하는 모양을 정의해 outputFormat(파이썬 output_format)으로 넘기면, 에이전트가 끝났을 때 결과 메시지의 structured_output 필드에 검증된 데이터가 들어옵니다. Zod와 Pydantic으로 타입 안전하게 쓸 수도 있습니다. agent-sdk/structured-outputs

공식여기에 조용한 실패 경로가 하나 있습니다. 결과 메시지가 subtype: "success"로 끝나면서 structured_output이 파이썬에서 None, 타입스크립트에서 undefined일 수 있습니다. 어떤 출력도 만족할 수 없는 스키마(예를 들어 모순되는 길이 제약)가 한 가지 원인이고, 검증 오류 없이 런이 끝나므로 유일한 신호가 필드가 없다는 것뿐입니다. 애플리케이션 코드에서는 subtype이 성공인지와 structured_output이 있는지를 둘 다 확인해야 합니다. agent-sdk/troubleshooting

35.8운영

서브프로세스 모델이 모든 배포 결정을 정한다

공식query()를 부르면 SDK가 별도 claude CLI 프로세스를 띄우고 stdio로 대화합니다. 그 서브프로세스가 셸, 작업 디렉터리, 로컬 디스크의 JSONL 세션 트랜스크립트를 소유합니다. 에이전트 세션 하나가 서브프로세스 하나이므로 동시 세션 N개는 서브프로세스 N개이고 각자 프로세스 트리와 트랜스크립트 파일을 갖습니다. 기본적으로 전부 애플리케이션의 작업 디렉터리를 물려받으므로, 세션마다 파일 시스템을 나눠야 하면 query()마다 cwd를 넘깁니다. agent-sdk/hosting

공식기본 설정에서 컨테이너 파일 시스템에 사는 상태가 셋이고, 어느 것도 컨테이너 재시작·스케일 다운·다른 노드 이동을 견디지 못합니다. 세션 트랜스크립트(~/.claude/projects/, CLAUDE_CONFIG_DIR이 있으면 그 아래 projects/), CLAUDE.md 메모리 파일(사용자 층은 ~/.claude/CLAUDE.md, 프로젝트 층은 세션의 작업 디렉터리), 작업 디렉터리 산출물입니다. 트랜스크립트는 SessionStore로 옮기고, 나머지는 마운트 볼륨이나 오브젝트 스토어 동기화 같은 자체 전략이 필요합니다. agent-sdk/hosting

세션 수명 패턴

공식컨테이너가 세션에 비해 얼마나 오래 사는지로 패턴이 갈립니다. 일시적 세션은 사용자 작업마다 컨테이너를 만들고 작업이 끝나면 파괴합니다. 버그 조사와 수정, 청구서·영수증 추출, 문서 번역, 미디어 변환 같은 일회성 작업에 맞습니다. 장기 세션은 지속 컨테이너 인스턴스를 돌리며 종종 컨테이너당 여러 SDK 프로세스를 띄웁니다. 자율적으로 행동하거나 콘텐츠를 서비스하거나 대량 메시지 스트림을 처리하는 에이전트에 맞습니다(메일을 분류·응답하는 에이전트, 사용자별 편집 가능 사이트를 포트로 호스팅하는 빌더, 슬랙 같은 플랫폼의 연속 트래픽을 받는 봇). agent-sdk/hosting

설계에 미리 반영해야 하는 한계 넷

공식공식 문서가 "배포 설계에 미리 넣으라"고 적은 한계입니다. agent-sdk/hosting

한계대응
최상위 세션 타임아웃이 없다세션은 스스로 타임아웃되지 않습니다. maxTurns로 도구 왕복 횟수를 묶습니다
긴 세션에서 메모리가 자란다세션 길이를 제한하거나 서브프로세스를 주기적으로 재활용합니다
큰 병렬 서브에이전트 팬아웃이 레이트 리밋에 닿을 수 있다한 번에 넓게 던지지 말고 작은 배치로 쪼갭니다
서브에이전트별 벽시계 마감이 없다AgentDefinition의 maxTurns로 각각을 제한합니다. 백그라운드 서브에이전트에만 CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS가 정지 감시로 붙지만 총 실행 시간 마감은 아닙니다

첫 줄이 가장 비싼 함정입니다. "세션이 스스로 끝나지 않는다"는 것은 잘못된 프롬프트 하나가 무한히 돌 수 있다는 뜻입니다. maxTurns는 선택 옵션처럼 생겼지만 프로덕션에서는 필수에 가깝습니다.

관측과 비용

공식텔레메트리는 CLAUDE_CODE_ENABLE_TELEMETRY=1을 설정하고 익스포터를 최소 하나 고를 때까지 꺼져 있습니다. 가장 흔한 구성은 세 신호(트레이스·메트릭·이벤트)를 OTLP HTTP로 컬렉터에 보내는 것입니다. 트레이스는 베타라 CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1이 함께 필요하고, 메트릭과 로그 이벤트에는 필요하지 않습니다. 애플리케이션 트레이스와 연결하고, 자체 태그를 붙이고, 최종 사용자에게 행동을 귀속시키고, 내보내는 민감 데이터를 통제하는 방법이 각각 정리돼 있습니다. agent-sdk/observability

공식비용은 결과 메시지의 total_cost_usd가 그 query() 호출 전체의 누적 추정 비용입니다. 세션으로 여러 번 부르면 각 결과는 그 호출의 비용만 반영합니다. 서브에이전트가 있을 때 세 필드가 세는 범위가 다릅니다. agent-sdk/cost-tracking

필드서브에이전트 활동
usage제외. 최상위 에이전트 루프만 세므로 서브에이전트가 쓴 토큰이 빠집니다
total_cost_usd포함. 서브에이전트 요청을 함께 셉니다
modelUsage / model_usage포함. 모델별로 나눠 셉니다

공식트리 전체의 토큰 회계에는 modelUsage를 씁니다. usage는 중첩이 생기는 순간부터 과소 집계합니다. 서브에이전트를 쓰는 에이전트의 사용량을 usage로 대시보드에 올리면 실제보다 적게 보입니다. agent-sdk/cost-tracking

안전한 배포

공식위협 모델은 간단합니다. 에이전트는 프롬프트 인젝션(처리하는 콘텐츠에 심긴 지시)이나 모델 오류로 의도하지 않은 행동을 할 수 있습니다. 클로드 모델은 이에 저항하도록 설계돼 있지만 다층 방어가 여전히 좋은 관행입니다. 예를 들어 에이전트가 고객 데이터를 외부 서버로 보내라는 악성 파일을 처리해도 네트워크 통제가 그 요청을 아예 막을 수 있습니다. agent-sdk/secure-deployment

공식격리 기술은 강도·성능·복잡도의 교환입니다. agent-sdk/secure-deployment

기술격리 강도성능 부담복잡도
샌드박스 런타임양호(안전한 기본값)아주 낮음낮음
컨테이너(도커)설정에 따라낮음중간
gVisor우수(올바른 설정 시)중간~높음중간
VM(Firecracker, QEMU)우수(올바른 설정 시)높음중간~높음

공식샌드박스 런타임은 도커 없이 OS 수준에서 파일 시스템과 네트워크를 제한합니다. 리눅스는 bubblewrap, macOS는 sandbox-exec를 쓰고, 네트워크는 네임스페이스를 제거하거나 Seatbelt 프로파일로 내장 프록시를 통과시킵니다. 다만 두 가지 한계가 있습니다. 샌드박스 프로세스가 호스트 커널을 공유하므로 커널 취약점이 이론적으로 탈출을 가능하게 하고, 프록시가 TLS를 검사하지 않으므로 안쪽 코드가 도메인 프론팅 같은 기법으로 허용 목록 밖 호스트에 닿을 수 있습니다. 더 강한 보장이 필요하면 gVisor나 별도 VM, 또는 TLS 종료 프록시를 씁니다. agent-sdk/secure-deployment

35.9이관과 문제 해결

공식이전 Claude Code SDK에서 올라오는 경우 이름이 바뀌었습니다. 타입스크립트 패키지는 @anthropic-ai/claude-code에서 @anthropic-ai/claude-agent-sdk로, 파이썬 패키지는 claude-code-sdk에서 claude-agent-sdk로, 파이썬 임포트는 claude_code_sdk에서 claude_agent_sdk로, 타입 이름은 ClaudeCodeOptions에서 ClaudeAgentOptions로 바뀝니다. agent-sdk/migration-guide

공식이름 변경보다 중요한 것은 파괴적 변경 둘입니다. 시스템 프롬프트가 기본이 아니게 됐고(35.4 참조), 설정 출처의 취급이 바뀌었습니다(35.5 참조). 전자를 모르고 올리면 에이전트가 갑자기 클로드코드처럼 행동하지 않고, 후자를 모르고 올리면 격리했다고 믿은 곳에 로컬 설정이 들어옵니다. agent-sdk/migration-guide

공식타입스크립트 V2 세션 API는 제거됐습니다. Agent SDK 0.3.142가 unstable_v2_createSession, unstable_v2_resumeSession, unstable_v2_prompt와 SDKSession·SDKSessionOptions 타입을 없앴습니다. query() API와 그것이 받는 세션 옵션으로 옮기고, 여러 턴 대화에는 AsyncIterable<SDKUserMessage>를 넘기거나 options.resume으로 저장된 세션을 잇습니다. agent-sdk/typescript-v2-preview

메시지로 찾는 오류 세 개

공식트러블슈팅 문서는 보이는 오류 메시지를 키로 원인과 대처를 적습니다. 파이썬 SDK가 CLI를 서브프로세스로 띄우다 실패하면 CLINotFoundError입니다. cli_path를 설정했고 그 경로에 파일이 없으면 메시지에 그 경로가 담기고, 설정하지 않았으면 PATH와 흔한 설치 위치를 찾아본 뒤 플랫폼별 설치 안내를 담습니다. agent-sdk/troubleshooting

공식이 오류에서 자주 놓치는 원인이 하나 있습니다. 셸 밖에서 띄운 프로세스(IDE나 서비스 관리자에서 시작한 것)는 다른 PATH로 도는 경우가 많습니다. claude --version이 내 터미널에서 되는 것으로는 부족하고, 애플리케이션이 실제로 도는 환경에서 되는지 확인해야 합니다. agent-sdk/troubleshooting

공식윈도우에서는 CLIConnectionError: Refusing to execute batch script가 나올 수 있습니다. 파이썬 SDK가 쓰려는 CLI 경로가 .bat이나 .cmd 배치 스크립트일 때이고, npm 설치가 만드는 claude.cmd 심도 포함됩니다. 이것은 깨진 설치가 아니라 의도된 보안 강화입니다. 윈도우는 배치 스크립트를 cmd.exe /c 호출로 바꿔 돌리고 cmd.exe가 실행 시점에 명령줄 전체를 다시 파싱하므로, 인자 값이 주입된 명령을 실행할 수 있습니다. 해결은 네이티브 실행 파일을 주는 것입니다. cli_path를 claude.exe로 가리키거나 옵션을 지우고, PowerShell에서 네이티브로 설치하거나, x64 윈도우에서 claude.exe를 담은 휠을 설치합니다. agent-sdk/troubleshooting

실전이 기계에는 Agent SDK가 설치돼 있지 않습니다. npm ls -g --depth=0 | grep -i claude는 빈 결과이고 python3 -c "import claude_agent_sdk"는 ModuleNotFoundError입니다. 이 시리즈를 만든 작업은 전부 대화형 클로드코드와 훅으로 돌렸고, SDK로 옮길 만한 부분은 하나 있습니다. 픽스처 적용과 검증을 도는 픽스처_적용.py가 지금은 정규식과 파서로만 검사하는데, 문체 검사처럼 판단이 필요한 규칙은 판정을 사람이 하고 있습니다. 다만 옮기지 않은 이유가 분명합니다. 여덟 편을 한 번 쓰는 일이라 반복이 아직 없습니다. SDK는 같은 판단을 반복해서 돌릴 때 값이 나오고, 한 번 쓰는 판단은 대화형이 더 쌉니다. 35장을 읽고 바로 옮기고 싶어질 때 이 질문을 먼저 하는 편이 낫습니다. 이 판단을 앞으로 몇 번 더 돌릴 것인가입니다.


이 편을 마치며

사람 없이 도는 상태까지 왔습니다

명령으로 부르고(33장), 파이프라인에서 부르고(34장), 코드에서 부르는(35장) 세 층을 지났습니다. 이제 클로드코드는 도구가 아니라 부품입니다.

이 편에서 반복해 나온 것이 하나 있습니다. 사람이 없으면 실패가 조용해진다는 것입니다. MCP 서버가 안 붙어도 런은 정상 종료하고, 잘못된 스키마가 구버전에서는 오류 없이 비구조화 텍스트를 내고, usage 필드는 서브에이전트 토큰을 조용히 빼고, 세션은 스스로 끝나지 않고, 체크포인트는 Bash 변경을 조용히 놓칩니다. 무인 실행의 설계는 기능을 켜는 일이 아니라 이 조용한 실패들을 소리 나게 만드는 일입니다.

그래서 이 편의 완료 판정은 "돌렸다"가 아니라 "실패했을 때 알 수 있다"입니다.

완료 체크리스트

  • claude -p를 --output-format json으로 돌려 jq로 필드를 꺼내 봤습니다.
  • --bare가 무엇을 안 읽는지 알고, CI에는 그것을 쓰기로 정했습니다.
  • 런 안 실패가 stdout으로 나온다는 것을 알고, 종료 코드와 함께 판정하고 있습니다.
  • claude --version을 확인해 문서의 버전 조건과 대조해 봤습니다.
  • 무인 실행에 --max-turns나 --max-budget-usd 중 하나 이상을 붙였습니다.
  • 재시도를 낮출 잡과 워치독을 켤 잡을 구분할 수 있습니다.
  • CI를 쓴다면 plugin_errors·mcp_server_errors가 비어 있는지 확인하는 게이트를 넣었습니다.
  • 자동화 모드에서 평문 프롬프트는 도구가 없이 시작한다는 것을 알고 도구를 명시했습니다.
  • Code Review를 쓴다면 체크런 심각도 내역을 파싱해 봤습니다(게이트는 나중에 켜도 됩니다).
  • SDK를 쓴다면 settingSources를 명시하고, 시스템 프롬프트 프리셋을 의식적으로 골랐습니다.
  • SDK 결과를 쓸 때 subtype과 structured_output을 둘 다 확인합니다.
  • 서브에이전트를 쓰는 에이전트의 비용을 modelUsage로 집계합니다.

다음 편은 방향이 다시 바뀝니다. 지금까지가 "내가 쓰는 클로드코드"였다면 L6 조직 도입은 "우리가 쓰는 클로드코드"입니다. 관리형 설정으로 표준을 내리고, 사용량을 계측하고, 네트워크와 컴플라이언스를 설계하고, 도입을 확산하는 일입니다. 이 편의 격리와 자격증명 이야기가 거기서 조직 규모로 다시 나옵니다.

자주 막히는 곳

claude -p가 CI에서만 다르게 동작합니다

맥락이 다릅니다. --bare 없이 부르면 그 기계의 ~/.claude와 프로젝트 .claude/가 전부 들어오므로, 내 기계의 훅·스킬·MCP가 CI에는 없습니다. --bare를 붙이고 필요한 것만 --settings·--mcp-config·--agents로 명시하면 두 환경이 같아집니다. 다만 bare 모드는 OAuth와 키체인을 읽지 않으므로 ANTHROPIC_API_KEY를 함께 넣어야 합니다.

스크립트가 성공으로 끝났는데 결과가 엉뚱합니다

런 안 실패를 성공으로 읽었을 가능성이 큽니다. 인증 누락 같은 실패는 stdout의 결과로 나오므로, 종료 코드만 보면 놓칩니다. --output-format json으로 받아 subtype을 확인하고, 구조화 출력을 쓴다면 structured_output이 실제로 있는지도 봅니다.

MCP 서버를 붙였는데 도구가 없습니다

설정 검증에서 건너뛰었을 수 있습니다. 클로드코드는 잘못된 --mcp-config 항목을 건너뛰고 런을 계속해 정상 종료합니다. 터미널에서는 stderr에 경고가 뜨지만 CI가 stderr를 캡처하면 보이지 않습니다. --output-format stream-json으로 받아 system/init의 mcp_server_errors를 확인합니다(v2.1.219 이상). 그 아래 버전이면 필드 자체가 없으니 먼저 올립니다.

@claude를 달았는데 아무 일도 없습니다

순서대로 봅니다. GitHub App이 그 저장소에 설치됐는지, 워크플로가 활성화됐는지, 시크릿이 설정됐는지, @claude가 온전한 단어인지(/claude나 @claude-bot은 안 됩니다), 코멘트 작성자에게 쓰기 권한이 있는지입니다. 예약 실행이라면 GitHub이 그 실행을 귀속시킨 사용자가 봇일 수 있으니 allowed_bots를 확인합니다.

클로드가 푸시한 커밋에 CI가 안 돕니다

GitHub의 규칙입니다. 기본 GITHUB_TOKEN으로 만든 커밋에는 워크플로가 촉발되지 않습니다. github_token: ${{ secrets.GITHUB_TOKEN }}를 넘기고 있다면 지워서 클로드 GitHub App으로 인증하게 하거나 커스텀 앱 토큰을 넘깁니다.

Code Review 결과로 머지를 막고 싶습니다

체크런은 항상 neutral로 끝나므로 브랜치 보호로는 막히지 않습니다. 체크런 출력의 심각도 내역을 gh api와 jq로 파싱해 자기 CI에서 판정합니다(34.5의 명령 두 줄). 다만 처음부터 normal > 0으로 막으면 오탐 하나가 머지를 세우니, 몇 주는 숫자만 기록해 오탐률을 본 뒤 켜는 편이 낫습니다.

SDK 에이전트가 클로드코드처럼 행동하지 않습니다

SDK는 기본적으로 클로드코드의 시스템 프롬프트를 쓰지 않습니다. systemPrompt: { type: "preset", preset: "claude_code" }를 명시하면 예전 동작이 돌아옵니다. 반대로 완전히 다른 역할을 주려면 문자열을 그대로 넘깁니다.

격리했는데 로컬 설정이 들어옵니다

settingSources를 확인합니다. 생략은 ["user","project","local"]과 같으므로 빈 배열을 명시해야 격리됩니다. 그리고 파이썬 SDK 0.1.59 이하는 빈 리스트를 생략과 같게 취급했으니 버전을 올립니다.

SDK 세션이 끝나지 않습니다

세션에는 최상위 타임아웃이 없습니다. maxTurns로 도구 왕복 횟수를 묶는 것이 유일한 상한이고, 서브에이전트에는 각자의 AgentDefinition에 maxTurns를 따로 줍니다. 백그라운드 서브에이전트에 붙는 CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS는 정지 감시라서 총 실행 시간 마감이 아닙니다.

비용이 대시보드와 안 맞습니다

세 가지를 봅니다. total_cost_usd는 클라이언트 측 추정이라 실제 청구와 다를 수 있습니다. usage 필드는 서브에이전트 토큰을 세지 않으므로 중첩이 있으면 과소 집계합니다(modelUsage를 씁니다). 그리고 세션으로 여러 번 부르면 각 결과가 그 호출분만 담으므로 누적은 직접 합해야 합니다.

윈도우에서 SDK가 배치 스크립트를 거부합니다

의도된 보안 동작입니다. 윈도우가 .bat·.cmd를 cmd.exe로 돌리고 그것이 명령줄을 다시 파싱해서 인자로 명령 주입이 가능하기 때문입니다. 네이티브 claude.exe를 주면 됩니다. cli_path를 exe로 바꾸거나 지우고, PowerShell 네이티브 설치를 쓰거나, x64에서는 exe를 담은 휠을 설치합니다.


7부 · L6

조직 도입

나 한 명이 아니라 팀과 회사

먼저 필요한 것
L2 맥락과 통제 (역할이 관리자라면 바로)
마치면
조직 표준 설정·계측·컴플라이언스·도입 계획을 문서로 낸다
범위
36~40장

이 편의 독자는 다릅니다. 앞의 여섯 편은 "내가 클로드코드를 쓴다"는 사람에게 썼고, 이 편은 "우리 조직이 클로드코드를 쓴다"를 설계하는 사람에게 씁니다. 그래서 판단 기준이 뒤집힙니다. 앞에서는 편의가 기준이었고 여기서는 통제 가능성과 감사 가능성이 기준입니다.

순서에도 이유가 있습니다. 36장이 정책을 내리는 경로를 정하고, 37장이 그 정책이 실제로 어떻게 쓰이는지 보는 눈을 만들고, 38장이 트래픽이 지나는 길을 정하고, 39장이 심사를 통과할 근거를 모으고, 40장이 사람에게 닿게 합니다. 정책 없이 계측하면 볼 것이 없고, 계측 없이 확산하면 무엇이 됐는지 모릅니다.

이 편은 L2 맥락과 통제를 전제로 씁니다. 권한 규칙 문법과 설정 파일 계층을 아는 상태에서 그것을 조직 수준으로 올리는 이야기입니다. L3~L5를 건너뛰고 와도 읽히지만, 무엇을 통제할지 판단하려면 스킬·훅·MCP가 무엇인지(L3)는 알아야 합니다.

이 편의 상당 부분은 플랜 조건이 붙습니다. 서버 관리 설정은 Claude for Teams 또는 Enterprise, 제로 데이터 보존은 자격을 갖춘 Enterprise 계정, 분석 대시보드는 Teams·Enterprise 또는 Console입니다. 각 절 머리에 조건을 먼저 적었습니다. 내 플랜에 없는 것은 건너뛰고 읽는 편이 낫습니다.

36

조직 세팅

조직 도입의 첫 결정은 기능이 아니라 정책이 어떤 경로로 개발자 기기에 닿는가입니다. 이것을 정하지 않으면 나머지 결정을 집행할 수단이 없습니다.

36.1관리자 결정 지도

공식클로드코드는 관리형 설정으로 조직 정책을 집행하고, 그 설정은 로컬 개발자 구성보다 우선합니다(설정 우선순위 절의 예외는 별도). 관리형 설정은 클로드 관리 콘솔, MDM 시스템, 또는 디스크의 파일로 전달합니다. 이 설정이 클로드가 닿을 수 있는 도구·명령·서버·네트워크 목적지를 정합니다. admin-setup

공식공식 문서는 도입 결정을 다섯 단계로 정리해 둡니다. 이 순서가 이 편 전체의 골격이기도 합니다. admin-setup

결정고르는 것이 가이드의 위치
API 제공자 선택클로드코드가 어디로 인증하고 어떻게 청구되는가38.1, 38.2
설정 전달 방식관리형 정책이 개발자 기기에 닿는 경로36.2
무엇을 강제할지어떤 도구·명령·통합을 허용하는가36.2, 36.3, 36.4
사용량 가시성지출과 도입을 어떻게 추적하는가37장
데이터 취급 검토보존 정책과 컴플라이언스 태세39장

공식SSO, SCIM 프로비저닝, 좌석 배정은 클로드 계정 수준에서 구성하는 것이라 이 목록에 없습니다. Enterprise 관리자 가이드와 좌석 배정 문서가 그 절차를 다룹니다. admin-setup

제공자 선택이 기능을 정한다

공식제공자 선택은 청구·인증·컴플라이언스 태세와 함께 개발자가 쓸 수 있는 기능도 바꿉니다. admin-setup

제공자고르는 기준
Claude for Teams / Enterprise클로드코드와 claude.ai를 좌석당 구독 하나로 묶고 운영할 인프라를 두지 않으려는 경우. 공식 문서의 기본 권고
Claude ConsoleAPI 우선이거나 사용량 기반 청구를 원하는 경우
Amazon Bedrock기존 AWS 컴플라이언스 통제와 청구를 물려받으려는 경우
Google Cloud의 Agent Platform기존 GCP 통제와 청구를 물려받으려는 경우
Microsoft Foundry기존 Azure 통제와 청구를 물려받으려는 경우

공식여기에 도입 설계에서 가장 자주 놓치는 조건이 있습니다. 일부 기능은 claude.ai 계정을 요구합니다. 웹 클로드코드, 루틴, Code Review, 리모트 컨트롤, Chrome 확장은 Console API 키나 클라우드 제공자 자격증명만으로는 쓸 수 없습니다. Bedrock·Agent Platform·Foundry로 배포한다면 개발자에게 Teams나 Enterprise 좌석이 추가로 필요한지 미리 계획해야 합니다. admin-setup

공식프록시와 방화벽 요건은 제공자와 무관하게 적용됩니다. 여러 제공자 앞에 단일 엔드포인트를 두거나 중앙 요청 로깅이 필요하면 게이트웨이를 봅니다(38.3). admin-setup

설정이 실제로 적용됐는지 확인하는 한 줄

공식관리형 설정을 구성한 뒤 개발자에게 클로드코드에서 /status를 돌리게 합니다. Status 탭의 Setting sources 줄에 Enterprise managed settings와 괄호 안 출처가 나옵니다. (remote), (plist), (HKLM), (HKCU), (file) 중 하나입니다. admin-setup

이 한 줄이 도입 검증의 전부입니다. 관리 콘솔에서 저장했다는 것과 개발자 기기에서 적용됐다는 것은 다른 사실이고, 괄호 안 출처가 예상과 다르면 우선순위 어딘가에서 다른 소스가 이기고 있는 것입니다.

공식로그인 문제로 막히는 개발자에게 줄 세 가지 처방도 공식 문서가 정리해 둡니다. /logout 후 /login으로 계정 전환, 엔터프라이즈 인증 옵션이 안 보이면 claude update, 업데이트 후 터미널 재시작입니다. "아직 조직에 추가되지 않았습니다"가 보이면 그 좌석에 클로드코드 접근이 없는 것이므로 관리 콘솔에서 좌석을 고쳐야 합니다. admin-setup

36.2설정이 기기에 닿는 네 경로

공식클로드코드는 네 소스를 우선순위대로 확인하고 비어 있지 않은 구성을 반환하는 첫 소스를 적용합니다. admin-setup

메커니즘전달우선순위플랫폼
서버 관리 claude.ai 관리 콘솔, 또는 게이트웨이 로그인용 자체 호스팅 Claude apps gateway 최상전부
plist / 레지스트리 정책 macOS는 com.anthropic.claudecode plist, 윈도우는 HKLM\SOFTWARE\Policies\ClaudeCode 높음macOS, 윈도우
파일 기반 관리 macOS /Library/Application Support/ClaudeCode/managed-settings.json, 리눅스·WSL /etc/claude-code/managed-settings.json, 윈도우 C:\Program Files\ClaudeCode\managed-settings.json 중간전부
윈도우 사용자 레지스트리 HKCU\SOFTWARE\Policies\ClaudeCode 최하윈도우 전용

공식네 경로가 보안 등급이 다릅니다. plist와 HKLM은 쓰기에 관리자 권한이 필요해 변조에 강하지만, HKCU는 권한 상승 없이 쓸 수 있으므로 집행 채널이 아니라 편의 기본값으로 취급해야 합니다. 정책을 강제할 생각이라면 HKCU에 두지 않습니다. admin-setup

서버 관리 설정: MDM 없이 정책을 내리는 길

공식서버 관리 설정에 필요한 것은 셋입니다. Claude for Teams 또는 Enterprise 플랜, 클로드 조직의 Owner 또는 Primary Owner 역할, api.anthropic.com 네트워크 접근입니다. server-managed-settings

공식설정은 인증 시점에 기기에 닿고 활성 세션 중에는 매시간 갱신되며, 엔드포인트 인프라가 필요 없습니다. Bedrock·Agent Platform·Foundry 배포도 Claude apps gateway를 돌리면 같은 원격 전달을 얻고, 그렇지 않으면 파일이나 OS 수준 메커니즘을 씁니다. server-managed-settings

방식맞는 조직보안 모델
서버 관리 설정MDM이 없는 조직, 관리되지 않는 기기의 사용자인증 시점에 Anthropic 서버에서 전달
엔드포인트 관리 설정MDM이나 엔드포인트 관리를 쓰는 조직MDM 구성 프로파일, 레지스트리 정책, 관리형 설정 파일로 기기에 배포

공식기기가 MDM에 등록돼 있으면 엔드포인트 관리 설정이 더 강한 보증을 줍니다. 설정 파일을 OS 수준에서 사용자 수정으로부터 보호할 수 있기 때문입니다. 다만 엔드포인트 관리 설정은 Anthropic 호스팅 환경의 클라우드 세션에 닿지 않으므로, 웹 클로드코드를 쓰는 조직은 서버 관리 설정도 함께 구성해야 합니다. server-managed-settings

개념

두 방식은 대체가 아니라 보완이다

MDM이 있으니 서버 관리 설정은 필요 없다는 판단이 흔한 실수입니다. 엔드포인트 관리 설정은 기기에 닿고 서버 관리 설정은 세션에 닿습니다. 개발자가 웹이나 데스크톱 클라우드 세션을 쓰는 순간 기기에 깔린 정책은 그 세션에 없습니다. 표면이 여러 개인 것이 정책 설계에서 되돌아오는 지점입니다.

우선순위의 예외 셋

공식"첫 소스가 이긴다"는 규칙에 예외가 셋 있습니다. 이것을 모르면 정책이 예상과 다르게 합쳐집니다. server-managed-settings

  1. 교차 소스 잠금 키. 샌드박스 허용 목록 잠금처럼 일부 키는 관리자 통제 소스 어디에서든 설정하면 존중됩니다. 사용자가 쓸 수 있는 HKCU 계층은 제외됩니다.
  2. env 블록의 키별 병합. 환경 변수마다 그것을 정의한 가장 높은 소스가 이기고, 상위 소스가 비워 둔 변수는 하위 관리자 소스가 채웁니다(v2.1.223 이상). 그 전에는 이긴 소스의 env 블록 전체만 적용했습니다. 개발자가 쓸 수 있는 설정은 이 병합에 기여하지 못합니다.
  3. 배열 설정의 병합. permissions.allow·permissions.deny 같은 배열은 모든 소스의 항목이 합쳐집니다. 그래서 개발자는 관리형 목록을 넓힐 수는 있어도 줄일 수는 없습니다. 예외 둘(fallbackModel과 availableModels)은 관리형 값이 하위 계층을 대체합니다.

공식policyHelper가 구성돼 있으면 이야기가 달라집니다. 그 출력이 클로드코드가 읽는 유일한 관리형 구성이 되어 네 소스 전부를 선점하고, 잠금 키 검사도 그것만 읽고, 키별 env 병합도 일어나지 않습니다. server-managed-settings

공식관리 콘솔의 서버 관리 구성을 지우고 plist나 레지스트리로 폴백할 의도라면 주의할 것이 있습니다. 캐시된 설정이 다음 성공 조회까지 클라이언트에 남습니다. /status로 지금 어느 관리형 소스가 활성인지 확인해야 합니다. server-managed-settings

WSL이 별도 문제인 이유

공식기본적으로 WSL은 리눅스 파일 경로 /etc/claude-code만 읽습니다. 같은 기계의 윈도우 레지스트리 정책과 C:\Program Files\ClaudeCode 정책을 WSL까지 확장하려면 두 관리자 전용 윈도우 소스 중 하나에 wslInheritsWindowsSettings: true를 설정합니다. admin-setup

공식여기에 엔드포인트 탐지 문제가 하나 더 붙습니다. WSL 2 유틸리티 VM 안의 프로세스는 윈도우 쪽 엔드포인트 탐지 센서에 보이지 않습니다. CrowdStrike Falcon을 쓴다면 WSL 2에 리눅스용 Falcon 센서를 켜고 CrowdStrike의 WSL 문서가 요구하는 두 예외(WSL 가상 머신 프로세스, VM 디스크 이미지)를 넣어야 배포 안 프로세스·파일 활동이 관측됩니다. 관리형 설정이 있는 기기에서 데스크톱 WSL 세션은 기본적으로 사용할 수 없고, 켜려면 Anthropic 계정 팀에 문의합니다. admin-setup

무엇을 강제할 수 있는가

공식관리형 설정으로 잠글 수 있는 통제면과 그 설정 키입니다. 이 표가 조직 정책 설계의 재료 목록입니다. admin-setup

통제하는 일주요 설정
권한 규칙특정 도구·명령을 허용·확인·거부permissions.allow, permissions.deny
권한 잠금관리형 권한 규칙만 적용, --dangerously-skip-permissions 비활성화allowManagedPermissionRulesOnly, permissions.disableBypassPermissionsMode
샌드박싱OS 수준 파일 시스템·네트워크 격리와 도메인 허용 목록sandbox.enabled, sandbox.network.allowedDomains
관리 정책 CLAUDE.md모든 세션에 로드되고 제외할 수 없는 조직 지시관리 정책 경로의 파일
MCP 서버 통제사용자가 추가·연결할 수 있는 서버 제한, 또는 고정 세트 배포allowedMcpServers, deniedMcpServers, allowManagedMcpServersOnly, managed-mcp.json
플러그인 마켓플레이스 통제추가·설치 가능한 마켓플레이스 제한, 단일 실행 사이드로드 플래그 거부, 제안 가능 마켓플레이스 허용 목록strictKnownMarketplaces, blockedMarketplaces, disableSideloadFlags, pluginSuggestionMarketplaces
커스터마이징 잠금스킬·에이전트·훅·MCP 서버를 사용자·프로젝트 출처에서 차단해 플러그인과 관리형 설정에서만 오게 함strictPluginOnlyCustomization
훅 제한관리형 훅만 로드, HTTP 훅 URL 제한allowManagedHooksOnly, allowedHttpHookUrls
로그인 강제특정 로그인 방식이나 Anthropic 조직으로 제한로그인 강제 설정(39.2에서 다시 나옵니다)

이 표를 처음부터 전부 켜지 않는 편이 낫습니다. 도입 초기에 strictPluginOnlyCustomization과 allowManagedHooksOnly를 함께 켜면 개발자가 L3에서 배운 확장을 하나도 못 만들고, 그 상태로는 무엇을 표준화할지 알 수 있는 재료가 모이지 않습니다. 먼저 권한 잠금과 로그인 강제만 켜고, 무엇이 쓰이는지 37장으로 본 뒤 그 결과로 나머지를 정하는 순서가 실제 도입 순서에 맞습니다.

실전이 편을 쓰는 기계에는 관리형 설정이 하나도 없습니다. 네 경로 중 파일 기반 두 곳(/Library/Application Support/ClaudeCode/managed-settings.json, /etc/claude-code/managed-settings.json)은 존재하지 않고, plist는 defaults read com.anthropic.claudecode가 does not exist를 반환합니다. 조직이 없는 1인 사용이라 당연한 결과지만, 이 세 명령이 도입 검증의 실제 절차이기도 합니다. 관리형 설정을 배포한 뒤 이 셋과 /status를 함께 확인하면 "저장은 됐는데 기기에는 안 닿은" 상태를 잡아낼 수 있습니다.

실전대신 권한 규칙은 프로젝트 수준에 있습니다. .claude/settings.local.json에 allow 16개, deny 0개, ask 0개입니다. 조직이라면 이 상태가 문제입니다. allow만 자라고 deny가 비어 있다는 것은 금지선을 한 번도 그은 적이 없다는 뜻이고, 관리형 설정으로 올릴 때 그대로 올리면 금지선 없는 정책이 조직 표준이 됩니다. 도입 심사에서 먼저 물어야 할 것은 "무엇을 허용했나"가 아니라 "무엇을 금지했나"입니다.

36.3MCP 통제

공식MCP 서버 제한은 두 메커니즘을 조합합니다. 고정 세트를 배포하는 managed-mcp.json과, 사용자가 구성한 것을 걸러 내는 allowedMcpServers·deniedMcpServers입니다. 조합으로 일곱 패턴이 나옵니다. managed-mcp

패턴하는 일구성
MCP 비활성화어디서도 서버가 로드되지 않음서버 맵이 빈 managed-mcp.json
고정 배포모든 사용자가 같은 서버를 받고 다른 것을 추가할 수 없음원하는 서버를 담은 managed-mcp.json
승인 카탈로그승인 목록을 공표하고 사용자가 원하는 것을 추가, 그 밖은 차단allowedMcpServers + allowManagedMcpServersOnly: true
플러그인 서버만서버는 플러그인에서만 오고 사용자가 직접 추가 불가strictPluginOnlyCustomization에 mcp 포함
느슨한 허용 목록허용 목록을 강제하되 사용자가 자기 설정에서 넓힐 수 있음allowedMcpServers만(allowManagedMcpServersOnly 없이)
거부 목록만알려진 문제 서버만 차단하고 나머지 허용deniedMcpServers
제한 없음사용자가 무엇이든 추가관리형 파일을 배포하지 않음

공식전달 경로에 제약이 하나 있습니다. managed-mcp.json은 시스템 경로에 두는 파일이고 MDM·GPO·플릿 관리나 관리자 권한 프로세스로 배포하며, 서버 관리 설정으로는 설정할 수 없습니다. 반대로 allowedMcpServers·deniedMcpServers는 어느 설정 파일에나 둘 수 있는데, 집행하려면 관리형 소스에 둬야 합니다. allowManagedMcpServersOnly는 관리형 소스에서만 효과가 있고 다른 곳에서는 무시됩니다. managed-mcp

개념

MDM이 없으면 통제할 수 없는 것이 남는다

36.2에서 서버 관리 설정이 MDM 없는 조직의 답이었는데, MCP의 가장 강한 통제(managed-mcp.json)는 그 경로로 갈 수 없습니다. 즉 MDM 없는 조직이 쓸 수 있는 가장 강한 MCP 통제는 승인 카탈로그(allowedMcpServers + allowManagedMcpServersOnly)입니다. 고정 배포가 필요하다면 그것이 MDM 도입의 근거가 됩니다.

36.4플러그인 표준화

공식플러그인 마켓플레이스는 팀과 커뮤니티에 클로드코드 확장을 배포하는 방식입니다. 마켓플레이스 파일을 만들어 호스팅하고, 플러그인 항목과 소스를 정의하고, 검증·테스트한 뒤 CLI로 관리합니다. plugin-marketplaces

플러그인을 만드는 쪽은 L3 확장에서 다뤘습니다. 여기서는 조직이 그것을 표준으로 깔고 추천하는 쪽만 봅니다.

추천을 정책으로 내리기

공식마켓플레이스의 플러그인 항목에 relevance 객체를 붙이면 사용자 작업이 맞아떨어질 때 클로드코드가 그 플러그인을 제안합니다. 객체는 주제 하나와 신호 하나 이상을 지정하고, 신호는 현재 세션(작업 디렉터리, 클로드가 읽은 파일 같은 것)에 대해 검사하는 패턴입니다. plugin-relevance

공식신호 매칭은 사용자 기계에서 로컬로 일어납니다. 네트워크 트래픽을 추가하지 않고, 어떤 신호가 맞았는지나 그 값을 Anthropic이나 마켓플레이스 운영자에게 보고하지 않습니다. plugin-relevance

노출 위치내용
스피너 팁클로드가 응답하는 동안 스피너 아래에 설치 명령과 함께 제안이 나옵니다
세션 시작 제안cwd 신호가 작업 디렉터리와 맞으면 첫 턴 전에 한 줄 알림(v2.1.153 이상)
/plugin Discover 탭목록 상단에 "이 디렉터리에 제안됨" 같은 주석과 함께 고정(v2.1.154 이상)

공식스피너 팁과 세션 시작 알림은 스피너 팁 시스템의 일부라 사용자나 프로젝트가 spinnerTipsEnabled를 false로 두면 함께 꺼집니다. Discover 탭 고정은 팁 설정과 독립입니다. 그리고 클로드코드는 플러그인을 자동으로 설치하지 않습니다. 사용자가 항상 확인합니다. plugin-relevance

조직 도입에서 이 기능의 값은 교육 비용을 줄이는 데 있습니다. "우리 팀은 결제 코드를 만질 때 이 플러그인을 쓴다"를 문서로 알리면 아무도 읽지 않지만, 그 디렉터리에 들어갈 때 한 줄로 뜨면 읽힙니다. 다만 제안 가능한 마켓플레이스는 pluginSuggestionMarketplaces로 허용 목록을 걸 수 있으니(36.2 표), 사내 마켓플레이스만 제안되게 묶는 것이 함께 갑니다.

실전이 기계의 플러그인은 2개이고 마켓플레이스는 공식 하나에 사외 하나가 더해진 상태입니다(enabledPlugins에 superpowers@claude-plugins-official과 insane-search@gptaku-plugins, extraKnownMarketplaces에 gptaku-plugins). 조직 관점에서 보면 이 상태가 정확히 strictKnownMarketplaces가 막으려는 상태입니다. 개인이 자기 마켓플레이스를 추가한 것이고, 1인 볼트에서는 문제가 없지만 팀이라면 코드 실행 권한을 가진 확장이 심사 없이 들어온 것입니다. 도입 심사에서 이 항목을 볼 때 "플러그인 개수"가 아니라 "마켓플레이스 출처"를 세는 것이 맞습니다.

36.5공유 CLAUDE.md 전략

공식관리형 정책 경로에 CLAUDE.md 파일을 두면 모든 세션에 로드되고 제외할 수 없습니다. 36.2 표의 "관리 정책 CLAUDE.md" 항목입니다. admin-setup

관행여기서 조직이 자주 하는 실수는 이 파일에 너무 많이 넣는 것입니다. 제외할 수 없다는 성질이 매력적으로 보여 코딩 규약 전체를 올리게 되는데, 대가가 둘입니다. 첫째 모든 세션의 모든 요청에 그 길이가 실려 비용이 되고(34.1의 CI 고정 비용 논의와 같은 구조입니다), 둘째 길수록 개별 지시의 준수율이 떨어집니다. 커뮤니티에서 반복 확인되는 권고와 공식 문서의 CI 비용 절감 항목("CLAUDE.md를 짧게 유지하기")이 같은 방향을 가리킵니다. github-actions

관행그래서 층을 나누는 편이 낫습니다. 조직 수준에는 위반하면 사고가 되는 것만 두고, 팀·프로젝트 수준에는 취향과 규약을 둡니다. 판단 기준 한 줄로 쓰면 이렇습니다. "이 줄을 무시했을 때 생기는 결과를 되돌릴 수 있는가." 되돌릴 수 없으면(비밀 유출, 프로덕션 데이터 접근, 감사 대상 파일 수정) 조직 수준, 되돌릴 수 있으면(네이밍, 포매팅, 선호 라이브러리) 프로젝트 수준입니다.

층담을 것예
조직 관리 정책되돌릴 수 없는 금지선, 법·규정 요건, 비밀 취급비밀을 코드에 쓰지 않는다, 고객 데이터 경로를 열지 않는다, 특정 디렉터리를 수정하지 않는다
팀·저장소 CLAUDE.md그 코드베이스를 이해하는 데 필요한 사실빌드·테스트 명령, 아키텍처 경계, 자주 틀리는 지점
개인 설정취향응답 길이, 언어, 개인 워크플로

실전이 볼트의 CLAUDE.md는 루트에 115줄 11,589자이고 도메인별로 여덟 개가 더 있습니다. 1인 작업 공간이라 "조직 정책"과 "프로젝트 규약"이 한 파일에 섞여 있는데, 그것이 실제로 마찰을 만든 적이 있습니다. 산출물 표현 규칙(금지 문자 같은 것)은 위반하면 결과물을 다시 만들어야 하는 되돌릴 수 없는 항목이고, 폴더 네이밍 규칙은 되돌릴 수 있는 항목입니다. 둘이 같은 문서에 같은 톤으로 있으면 중요도 차이가 사라집니다. 조직에 올릴 때는 이 둘을 먼저 분리하고 나서 위쪽만 관리 정책으로 올려야 합니다.

37장으로 넘어가기 전에
  • 우리 조직의 정책이 네 경로 중 어디로 닿는지, 그리고 왜 그 경로인지 말할 수 있습니다.
  • 웹이나 데스크톱 클라우드 세션을 쓰는 사람이 있는지 확인했습니다(있으면 서버 관리 설정이 함께 필요합니다).
  • 지금 우리 권한 규칙에 deny가 하나라도 있는지 확인했습니다.
  • 관리 정책 CLAUDE.md에 넣을 것을 "되돌릴 수 있는가" 기준으로 걸러 봤습니다.

37

계측과 비용 관리

정책을 내렸으면 그것이 실제로 어떻게 쓰이는지 봐야 합니다. 여기서 도구가 셋으로 갈리고 각자 답하는 질문이 다릅니다. 분석 대시보드는 "도입이 되고 있나", OpenTelemetry는 "무엇이 일어났나", 비용 통제는 "얼마 쓰고 있나"입니다.

37.1사용량 분석

공식Teams·Enterprise는 claude.ai/analytics/claude-code에서 대시보드를 보고, Admin과 Owner가 열 수 있습니다. 들어 있는 것은 넷입니다. 사용량 지표(수락된 코드 줄 수, 제안 수락률, 일 활성 사용자와 세션), 기여 지표(클로드코드 도움으로 머지된 PR과 코드 줄 수, GitHub 연동 필요), 리더보드, CSV 데이터 내보내기입니다. analytics

공식대시보드에 없는 것이 중요합니다. 사용자별 토큰 수와 비용 추정은 이 대시보드가 아니라 조직 분석 설정의 지출 보고서(spend report)에서 나오거나, OpenTelemetry 내보내기를 구성해야 얻습니다. 도입 보고에 "사용자별 비용"이 필요하면 대시보드만 보고 계획하면 안 됩니다. analytics

공식기여 지표는 공개 베타이고 Teams·Enterprise 플랜에서 쓸 수 있습니다. claude.ai 조직 안의 사용자만 포함하므로 Console API나 서드파티 통합을 통한 사용은 들어가지 않습니다. 켜는 절차는 네 단계입니다. GitHub 관리자가 조직 GitHub 계정에 클로드 GitHub 앱을 설치하고, 클로드 Owner가 관리자 설정에서 클로드코드 분석을 켜고, 같은 페이지에서 GitHub 분석 토글을 켜고, GitHub 인증을 완료해 포함할 조직을 고릅니다. 데이터는 보통 24시간 안에 나타나고 매일 갱신됩니다. analytics

공식제로 데이터 보존이 켜진 조직에는 기여 지표를 쓸 수 없고 대시보드가 사용량 지표만 보여 줍니다. 39.2의 결정이 37.1의 가시성을 줄이는 관계이므로, 둘을 같은 자리에서 결정해야 합니다. analytics

공식기여 지표의 정의도 알아 둘 필요가 있습니다. 공식 문서는 이 지표가 의도적으로 보수적이고 실제 영향의 과소 추정이라고 밝히면서, 클로드코드 관여에 높은 확신이 있는 줄과 PR만 센다고 적습니다. 코드 줄 수는 정규화 후 3자 이상인 "유효 줄"만 세고 빈 줄과 괄호·사소한 구두점만 있는 줄을 제외합니다. 수락된 줄 수는 거부된 제안을 빼지만 이후 삭제는 추적하지 않습니다. analytics

개념

과소 추정 지표로 도입을 정당화할 때의 함정

보수적 지표는 방어에 강합니다. "적어도 이만큼"이라고 말할 수 있기 때문입니다. 그런데 같은 성질이 목표 설정에는 나쁩니다. 이 숫자를 KPI로 걸면 팀이 숫자에 잡히는 방식으로 쓰기 시작하고, 잡히지 않는 쓸모(설명 요청, 탐색, 리뷰)가 활동에서 빠집니다. 도입 보고에는 쓰고 목표로는 걸지 않는 편이 낫습니다. 그리고 "이후 삭제를 추적하지 않는다"는 성질은 생성 줄 수를 성과로 읽는 것을 위험하게 만듭니다.

공식API 고객은 경로가 다릅니다. Console 조직은 platform.claude.com/claude-code 대시보드와 Claude Code Analytics API를 쓰고, Enterprise는 Enterprise Analytics API로 사용자별 사용량과 비용 데이터를 프로그램으로 가져옵니다. admin-setup

37.2모니터링

공식클로드코드는 OpenTelemetry로 메트릭과 이벤트를 내보냅니다. 환경 변수로 구성하고, 기본은 꺼져 있습니다. monitoring-usage

최소 구성

# 1. 텔레메트리 켜기
export CLAUDE_CODE_ENABLE_TELEMETRY=1

# 2. 익스포터 선택 (필요한 것만)
export OTEL_METRICS_EXPORTER=otlp       # otlp, prometheus, console, none
export OTEL_LOGS_EXPORTER=otlp          # otlp, console, none

# 3. OTLP 엔드포인트
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

# 4. 인증(필요한 경우)
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer your-token"

# 5. 디버깅용으로 내보내기 간격 줄이기
export OTEL_METRIC_EXPORT_INTERVAL=10000  # 기본 60000ms
export OTEL_LOGS_EXPORT_INTERVAL=5000     # 기본 5000ms

claude

공식구성이 됐는지 확인하는 방법도 정해져 있습니다. 메트릭을 내보내는 설정이면 세션이 시작될 때 나오는 claude_code.session.count 메트릭을 백엔드에서 찾고, 로그만 내보내는 설정이면 프롬프트를 하나 보낸 뒤 claude_code.user_prompt 이벤트를 찾습니다. 아무것도 오지 않으면 claude --debug로 돌려 디버그 로그의 OTel 내보내기 오류를 봅니다. monitoring-usage

조직 전체에 켜기

공식관리자는 관리형 설정 파일의 env 블록으로 모든 사용자에게 같은 텔레메트리 설정을 내릴 수 있습니다. 관리형 설정 파일의 환경 변수는 우선순위가 높아 사용자가 덮어쓸 수 없습니다. monitoring-usage

{
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
    "OTEL_METRICS_EXPORTER": "otlp",
    "OTEL_LOGS_EXPORTER": "otlp",
    "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",
    "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317",
    "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer example-token"
  }
}

공식서브프로세스에는 상속되지 않습니다. 클로드코드는 자기가 띄우는 서브프로세스(Bash 도구, 훅, MCP 서버, 언어 서버)에 OTEL_* 환경 변수를 넘기지 않습니다. Bash 도구로 돌리는 OpenTelemetry 계측 애플리케이션이 자기 텔레메트리를 내보내야 한다면 그 명령에서 변수를 직접 설정해야 합니다. monitoring-usage

감사 데이터로 쓰기

공식OpenTelemetry 이벤트가 클로드코드 활동의 감사 데이터 원천입니다. 모든 이벤트가 신원 속성을 담고 있어 도구 호출·MCP 활동·권한 결정을 그것을 촉발한 사용자로 되돌려 연결할 수 있습니다. OTLP 로그 익스포터는 OTLP 수신기를 가진 SIEM이나 SIEM으로 전달하는 OpenTelemetry Collector로 이 이벤트를 보낼 수 있습니다. monitoring-usage

공식신원 귀속에 중요한 사실이 하나 있습니다. 클로드코드는 별도 서비스 계정으로 행동하지 않습니다. 각 이벤트에 기록되는 신원은 개발자 자신의 클로드 계정이고, Claude apps gateway 세션에서는 개발자의 IdP 신원입니다. 그래서 MCP 도구 호출, Bash 명령, 파일 편집이 세션을 시작한 개발자에게 귀속됩니다. monitoring-usage

공식직접 API 키로 인증하거나 Bedrock·Agent Platform·Foundry에 인증하면 세션에 클로드 계정이 없어 user.id와 session.id만 채워집니다. 이런 배포에서는 OTEL_RESOURCE_ATTRIBUTES로 사용자 신원을 직접 붙여야 하고, 관리형 설정 파일이나 실행 래퍼로 사용자별로 설정합니다. Claude apps gateway 세션은 CLI가 IdP 신원을 자동으로 찍으므로 이 작업이 필요 없습니다. monitoring-usage

export OTEL_RESOURCE_ATTRIBUTES="enduser.id=jdoe@example.com,enduser.directory_id=S-1-5-21-..."
개념

감사 요건이 제공자 선택을 되돌린다

36.1에서 제공자를 골랐는데, 감사 요건이 강하면 그 선택이 다시 흔들립니다. 클라우드 제공자로 배포하면 신원이 자동으로 붙지 않아 사용자별 귀속을 직접 만들어야 하고, 그 작업은 관리형 설정을 사용자별로 다르게 배포하는 일이라 MDM 없이는 어렵습니다. 감사가 필수인 조직에서 Claude apps gateway가 자주 답이 되는 이유가 여기입니다.

공식모든 메트릭과 이벤트가 공유하는 표준 속성은 세션 ID, 앱 버전, 진입점(cli·sdk-cli·sdk-ts·sdk-py·claude-vscode 같은 값), 조직 UUID, 계정 UUID와 ID, 익명 사용자 ID, 이메일, 터미널 종류, 그리고 OTEL_RESOURCE_ATTRIBUTES로 넣은 커스텀 속성입니다. 일부는 기본으로 꺼져 있어(app.version, app.entrypoint) 필요하면 명시적으로 켭니다. monitoring-usage

실전계측 항목 자체는 꽤 넓습니다. 문서에 이름이 나오는 메트릭·이벤트를 세어 보면 38종이고, 세션 수·토큰 사용량·비용·코드 줄 수·PR 수·커밋 수 같은 집계부터 도구 결정, 권한 모드 변경, 훅 실행, 스킬 활성화, MCP 서버 연결, 압축, API 오류·거부까지 있습니다. 다음 명령으로 다시 셀 수 있습니다.

curl -sS https://code.claude.com/docs/en/monitoring-usage.md \
  | grep -oE '`claude_code\.[a-z_.]+`' | sort -u | wc -l

실전이 기계에는 텔레메트리가 켜져 있지 않습니다(env | grep -c "^OTEL_\|CLAUDE_CODE_ENABLE_TELEMETRY"가 0). 1인 사용이라 SIEM에 보낼 곳이 없지만, 계측이 없어서 답할 수 없는 질문이 실제로 생겼습니다. 이 시리즈 여덟 편을 쓰는 동안 어떤 도구를 몇 번 썼는지는 대화 로그를 직접 파싱해 알아냈고(Bash 12,154회, Edit 7,028회 같은 값), 그 파싱은 훅으로 적재한 자체 로그가 있어서 가능했습니다. 조직 규모에서는 그 자체 로그가 OpenTelemetry 이벤트로 대체되는 것이고, 없으면 나중에 소급해 만들 수 없습니다. 계측은 도입 전에 켜는 것이 맞습니다.

37.3비용 통제

공식어떤 통제를 쓸 수 있는지는 조직이 클로드코드에 접근하는 방식이 정합니다. Teams·Enterprise 플랜에서는 사용량이 각 구성원의 좌석 허용량에서 나가고, Console과 클라우드 제공자에서는 토큰당 조직에 청구됩니다. 조직이 로그인 방식을 섞어 쓰면 개발자마다 자기가 인증한 방식에 따라 계량됩니다. costs

구성지출 확인상한 설정사용자별 보고
Claude for Teams·Enterprise 조직 분석의 지출 보고서 관리자 설정의 지출 한도 지출 보고서 CSV, Enterprise는 Enterprise Analytics API
Claude Console(API) Console 사용량 페이지 워크스페이스 지출 한도 Console 대시보드, Claude Code Analytics API
Bedrock·Agent Platform·Foundry 클라우드 청구 콘솔(AWS Cost Explorer, GCP Billing, Azure Cost Management) 클라우드 예산 통제 또는 Claude apps gateway의 사용자별 지출 한도 클라우드 청구 태그 또는 게이트웨이

게이트웨이로 개발자별 상한을 거는 방법

공식Claude apps gateway는 gateway.yaml에 admin: 블록을 구성하면 /v1/organizations/spend_limits 관리 API를 제공하고 모든 추론 요청에 실시간으로 상한을 집행합니다. 상한 자체는 gateway.yaml이 아니라 그 API로 설정하고, POST 한 번이 {scope, amount, period}로 상한 하나를 만들거나 교체합니다. 와이어 형태가 Anthropic 공개 Admin API의 지출 한도 엔드포인트와 같으므로, 그 계약으로 쓴 HTTP 클라이언트는 베이스 URL만 바꿔 게이트웨이를 가리킬 수 있습니다. claude-apps-gateway-spend-limits

조직 기본값을 월 500달러로

curl -sS https://claude-gateway.internal.example.com/v1/organizations/spend_limits \
  -H "x-api-key: $GATEWAY_ADMIN_WRITE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scope": {"type": "organization"}, "amount": "50000", "period": "monthly"}'

특정 그룹에 더 좁은 상한을 겹치기

curl -sS https://claude-gateway.internal.example.com/v1/organizations/spend_limits \
  -H "x-api-key: $GATEWAY_ADMIN_WRITE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scope": {"type": "rbac_group", "rbac_group_id": "contractors"}, "amount": "10000", "period": "daily"}'

공식scope.type은 user·rbac_group·organization 셋이고 기간은 일·주·월입니다. 좁은 범위가 넓은 범위 위에 겹쳐집니다. claude-apps-gateway-spend-limits

이 두 명령이 조직 비용 통제에서 가장 구체적인 조각입니다. 클라우드 예산 경보는 사후에 알려 주고, 게이트웨이 상한은 요청 시점에 막습니다. 외주 인력이나 실험 팀처럼 상한이 필요한 그룹이 있으면 이 차이가 그대로 도입 근거가 됩니다.

토큰을 줄이는 쪽

공식공식 비용 문서는 상한 외에 줄이는 방법도 다룹니다. 맥락 관리, 모델 선택, 확장 사고 설정, 전처리 훅입니다. 그리고 긴 세션에서 사용량이 오르는 이유와 배경 토큰 사용도 별도 절로 설명합니다. costs

관행조직 도입에서 실제로 효과가 큰 순서는 뒤집혀 있습니다. 개인의 프롬프트 습관을 교육하는 것보다 관리형 설정으로 기본값을 바꾸는 것이 먼저 듣습니다. 모델 기본값, CLAUDE.md 길이, 자동 압축 설정처럼 모든 세션에 적용되는 것 셋을 손보는 편이 개별 교육보다 측정 가능한 변화를 만듭니다. 개인 습관은 37.2의 계측으로 편차가 드러난 뒤에 다루는 것이 순서입니다.

38장으로 넘어가기 전에
  • 우리 구성이 표의 어느 줄인지, 그래서 상한을 어디서 거는지 알고 있습니다.
  • 사용자별 비용이 필요한지, 필요하면 어느 경로로 얻는지 정했습니다.
  • 감사가 필요하면 신원 속성이 자동으로 붙는 구성인지 확인했습니다.
  • 계측을 도입 전에 켜기로 정했습니다.

38

네트워크와 배포 형태

트래픽이 지나는 길을 정하는 장입니다. 선택지가 많아 보이지만 축은 둘입니다. 추론이 어디서 도는가(제공자)와 요청이 무엇을 통과하는가(게이트웨이·프록시)입니다. 여기에 세션 실행 위치라는 세 번째 축이 자체 호스팅 환경으로 붙습니다.

38.1배포 선택지 지도

공식대부분의 조직에는 Claude for Teams 또는 Enterprise가 가장 좋은 경험을 준다는 것이 공식 문서의 권고입니다. 구독 하나로 클로드코드와 웹 클로드를 함께 쓰고, 청구가 중앙화되고, 세울 인프라가 없습니다. Teams는 셀프서비스로 협업 기능·관리 도구·청구 관리를 담고, Enterprise가 SSO와 도메인 캡처, 역할 기반 권한, 컴플라이언스 API 접근, 조직 전체 구성을 배포하는 관리 정책 설정을 더합니다. third-party-integrations

공식비교표가 다루는 것은 모델 추론이 어디서 도는지입니다. 웹 클로드코드 세션을 조직이 운영하는 컴퓨트에서 돌리는 것은 별개 축이고 자체 호스팅 환경(38.4)이 담당합니다. 두 축을 섞으면 결정이 엉킵니다. third-party-integrations

선택지맞는 경우청구
Claude for Teams / Enterprise대부분의 조직(권고)Teams는 좌석당, Enterprise는 영업 문의
Anthropic Console개인 개발자사용량 기반
Amazon BedrockAWS 네이티브 배포AWS를 통한 사용량 기반
Claude Platform on AWSAWS Marketplace 청구에 클로드 API 기능이 필요한 경우AWS Marketplace를 통한 사용량 기반
Google Cloud의 Agent PlatformGCP 네이티브 배포GCP를 통한 사용량 기반
Microsoft FoundryAzure 네이티브 배포Azure를 통한 사용량 기반

공식표면 쪽 선택지(CLI, 데스크톱, VS Code, JetBrains, 웹, 모바일, 그리고 Chrome·Slack·CI 같은 통합)는 별도 문서가 비교합니다. 표면은 배포 결정보다 개발자가 어디서 일할지의 문제라 조직은 대개 막지 않고 정책만 각 표면에 닿게 하는 쪽을 봅니다(36.2의 서버 관리 설정 논의가 그 이유입니다). platforms

38.2클라우드 제공자

공식클라우드 제공자를 고르는 이유는 대개 기존 컴플라이언스 통제와 청구를 물려받기 위한 것입니다. 각 제공자의 설정 절차는 전용 문서에 있고, 리전 선택과 프롬프트 캐싱 지원 여부 같은 세부가 제공자마다 다릅니다. third-party-integrations

제공자 선택이 기능을 줄이는 관계는 36.1에서 이미 짚었습니다. 여기서는 그것이 조직 설계에 남기는 결과만 정리합니다.

클라우드 제공자를 골랐을 때 추가로 필요한 것이유다루는 절
Teams·Enterprise 좌석 병행 검토웹·루틴·Code Review·리모트 컨트롤·Chrome은 claude.ai 계정 필요36.1
서버 관리 설정 대체 경로관리 콘솔 전달은 Teams·Enterprise 조건. 게이트웨이나 파일·OS 경로로 대체36.2
사용자 신원 직접 부착클라우드 자격증명 세션에는 클로드 계정이 없어 감사 귀속이 비어 있음37.2
지출 확인 경로 변경지출이 클라우드 청구 콘솔로 나감37.3

이 표가 클라우드 제공자 선택의 실제 비용입니다. 추론을 우리 클라우드로 돌리는 것 자체는 설정 변수 몇 개지만, 그 결정이 정책 전달·감사·지출 확인 경로를 전부 다시 만들게 합니다. "AWS를 이미 쓰니까 Bedrock"이라는 결정은 이 네 줄을 함께 보고 나서 하는 것이 맞습니다.

38.3게이트웨이

공식게이트웨이를 두면 각 개발자의 클로드코드가 게이트웨이 주소로 요청을 보내고 게이트웨이가 발급한 자격증명으로 인증합니다. 게이트웨이가 개발자를 인증하고 접근·예산 규칙을 적용한 뒤 조직의 자격증명으로 제공자에 전달합니다. 자격증명이 두 종류로 갈리는 것이 이 구조의 핵심입니다. gateways

자격증명누가 갖는가역할
개발자 자격증명개발자마다 각자게이트웨이에 인증하고 사용량 추적에서 신원을 식별합니다
제공자 자격증명게이트웨이 하나전달되는 모든 트래픽이 공유하는 제공자 계정 자격증명

공식게이트웨이가 조직에 주는 것은 다섯입니다. 자격증명(제공자 키가 서버 쪽에 남고 개발자는 게이트웨이 자격증명만 갖습니다), 사용량 추적(어느 제공자가 요청을 처리하든 개발자·팀별로 귀속), 비용 통제(예산과 레이트 리밋을 한 곳에서), 감사 로깅(컴플라이언스용으로 모든 모델 요청 기록), 제공자 전환(게이트웨이 구성만 바꿔 개발자 기기를 건드리지 않음)입니다. llm-gateway

공식다섯 중 제공자 전환만 조건이 붙습니다. 업스트림과 무관하게 단일 Anthropic 형식 엔드포인트를 노출하는 게이트웨이여야 하고, 제공자 고유 형식을 노출하는 게이트웨이는 클라이언트 구성이 그 제공자에 묶입니다. llm-gateway

대가: 유지해야 하는 인프라가 된다

공식공식 문서가 이 대가를 명시합니다. 게이트웨이는 조직이 운영하는 인프라가 되고, 클로드코드는 릴리스마다 기능을 더하는데 전달하지 않는 게이트웨이는 해당 기능을 깨뜨립니다. 그래서 클로드코드가 진화하는 대로 게이트웨이 제품을 갱신해야 하고, 무엇을 전달할지는 게이트웨이 프로토콜 레퍼런스가 다룹니다. llm-gateway

공식Claude apps gateway는 이 문제를 다르게 다룹니다. Anthropic의 자체 호스팅 게이트웨이로 claude 바이너리에 포함돼 있고, Bedrock·Claude Platform on AWS·Google Cloud·Microsoft Foundry·Anthropic API를 업스트림으로 라우팅합니다. 개발자는 /login으로 회사 IdP에 로그인하고, 게이트웨이가 IdP 그룹별로 모델 접근과 관리형 설정을 집행하고, OTLP 사용량 메트릭을 자체 관측 스택으로 보냅니다. 클로드코드 릴리스와 함께 빌드·테스트되므로 유지할 전달 목록이 없습니다. gateways

개념

게이트웨이 선택은 유지 비용의 위치를 고르는 것이다

이미 LLM 게이트웨이를 돌리는 조직은 그것을 쓰는 편이 자연스럽습니다. 다만 그 선택은 클로드코드 릴리스를 따라가는 일을 우리 팀 백로그에 넣는 것입니다. Claude apps gateway는 그 일을 없애지만 게이트웨이를 하나 더 운영하게 합니다. 둘 다 비용이고, 어느 쪽이 우리 조직에서 더 싼지가 판단 지점입니다.

롤아웃 순서 넷

공식어느 게이트웨이 제품을 고르든 조직 롤아웃 순서는 같습니다. llm-gateway

  1. 게이트웨이를 배포하고 제공자 자격증명을 줘서 전달하는 요청을 인증할 수 있게 합니다.
  2. 개발자마다 게이트웨이 자격증명을 발급해, 사용량이 개발자에게 귀속되고 퇴사 시 자격증명 하나를 폐기하면 끝나게 합니다.
  3. 관리형 설정 파일과 비밀 관리 도구로 구성을 배포해 모든 기계가 베이스 URL과 자격증명을 받게 합니다. 둘 다 배포되면 개발자는 아무것도 구성하지 않습니다.
  4. 각 개발자가 클로드코드에서 구성이 왔는지 확인하게 해, 게이트웨이에 의존하기 전에 배포 문제가 드러나게 합니다.

2번의 부수 효과가 도입 심사에서 자주 결정적입니다. 개발자별 자격증명이 없으면 퇴사자 처리가 "그 사람이 어디에 키를 넣었는지 찾기"가 되고, 있으면 폐기 한 번입니다. 감사 요건이 없는 조직이라도 이 이유만으로 게이트웨이가 정당화되는 경우가 있습니다.

38.4자체 호스팅 환경

공식자체 호스팅 환경은 클라우드 세션을 조직이 통제하는 인프라에서 돌립니다. 구성은 셋입니다. 환경(클라우드 세션을 보낼 수 있는 이름 붙은 목적지, claude.ai 관리자 설정에서 만들고 러너 집합을 묶습니다), 러너(네트워크 안 호스트에서 도는 프로그램, 자체 호스팅 CI 러너와 같은 발상), 세션(개발자가 시작한 클로드코드 작업 하나)입니다. self-hosted-environments

공식흐름은 이렇습니다. 개발자가 클라우드 세션을 시작하면 환경 선택기에 Anthropic 호스팅 환경과 조직이 만든 환경이 함께 나오고, 조직 환경을 고르면 Anthropic 제어면이 세션을 그 환경의 큐에 놓습니다. 러너가 그것을 집어 개발자가 고른 저장소를 클론하고 조직 호스트에서 클로드코드 프로세스를 시작합니다. 세션은 네트워크 안에서 내부 서비스에 닿고, Anthropic으로 가는 트래픽(큐 폴링, 세션 이벤트 스트림, 모델 추론)은 api.anthropic.com으로 나가는 아웃바운드 HTTPS입니다. Anthropic이 네트워크 안으로 들어오는 연결은 없습니다. self-hosted-environments

공식무엇이 남고 무엇이 나가는지의 경계가 도입 심사의 핵심입니다. 저장소 체크아웃, 빌드 산출물, 비밀, 세션이 만들거나 고친 파일은 조직이 프로비저닝한 기계에 남습니다. 대화 자체(프롬프트, 응답, 도구 결과)는 모델 추론을 위해 api.anthropic.com으로 나가고, Anthropic이 세션 트랜스크립트를 저장해 다른 표면에서 세션을 재개할 수 있게 합니다. self-hosted-environments

공식여기서 오해가 자주 생깁니다. 자체 호스팅 환경은 세션 실행을 네트워크로 옮기는 것이고 제어면을 옮기는 것이 아닙니다. 세션 조율, 큐잉, claude.ai 인터페이스는 Anthropic 호스팅으로 남습니다. "우리 인프라에서 돈다"를 "우리 인프라만 쓴다"로 읽으면 심사에서 사실과 어긋납니다. self-hosted-environments

공식설정 상속에도 규칙이 있습니다. 자체 호스팅 환경의 세션은 러너 이미지의 관리형 설정 파일을 읽지만, 서버 관리 설정이 아무 키도 전달하지 않을 때만 그렇습니다(36.2의 우선순위와 키별 예외를 따릅니다). 즉 서버 관리 설정을 쓰고 있으면 러너 이미지에 넣은 파일은 무시됩니다. server-managed-settings

38.5사내망 제약

공식프록시, 커스텀 인증 기관(CA), 상호 TLS(mTLS)를 쓰는 환경의 구성이 별도 문서로 있습니다. 프록시 구성, CA 인증서 저장소와 커스텀 CA, mTLS 인증, 구성 검증, 백그라운드 에이전트에 네트워크 설정 적용, 스트리밍 유휴 감시, 그리고 네트워크 접근 요건입니다. network-config

공식허용 목록에 넣어야 하는 호스트는 문서의 표에 있고, 컨테이너나 제한된 네트워크 환경에서 특히 중요합니다. 문서 표에 이름이 오르는 호스트는 api.anthropic.com, claude.ai, claude.com, platform.claude.com, mcp-proxy.anthropic.com, downloads.claude.ai, storage.googleapis.com, bridge.claudeusercontent.com, raw.githubusercontent.com, 데이터독 인테이크 두 곳, formulae.brew.sh, code.claude.com입니다. 각 호스트가 무엇에 필요한지는 표가 항목별로 적어 두므로, 전부 열지 않고 쓰는 기능에 해당하는 것만 열 수 있습니다. network-config

첫 실행 연결성 검사가 api.anthropic.com이나 platform.claude.com에 닿지 못하면 이 문서를 가리킵니다. 방화벽 티켓을 올릴 때 호스트 목록만 붙이지 말고 표의 "무엇에 필요한가" 열을 함께 붙이는 편이 승인 속도를 올립니다.

런처를 통과시켜야 하는 조직

공식클로드코드가 자기 바이너리에서 시작하는 프로세스를 필수 런처로 통과시키려면 CLAUDE_CODE_PROCESS_WRAPPER 환경 변수나 processWrapper 설정을 씁니다. 이 설정이 덮는 것은 백그라운드 서비스, 에이전트 뷰 각 행의 터미널 호스트와 세션(서비스가 준비해 두는 웜 스탠바이 세션 포함), 업데이트나 크래시 후 재생성되는 세션, 업데이트 완료를 위한 자기 재실행, 리모트 컨트롤 워커 프로세스(v2.1.210 이상), tmux나 iTerm2의 에이전트 팀 분할 창 세션(v2.1.210 이상)입니다. corporate-launcher

공식윈도우에서는 이 변수가 무시됩니다. 런처 계약이 exec에 의존하고 윈도우가 그것을 지원하지 않기 때문입니다. 변수를 설정한 윈도우 기계는 모든 프로세스를 감싸지 않고 계속 동작하며, 유일한 신호는 디버그 로그의 경고입니다. 런처 정책이 윈도우를 포함한다면 이 변수로는 충족되지 않으므로 롤아웃 계획에서 윈도우 기계를 감싸지 않은 것으로 세야 합니다. corporate-launcher

공식런처 밖에서 시작하는 프로세스도 둘 있습니다. 런처 구성 전에 유닛이 작성된 백그라운드 서비스는 launchd나 systemd가 유닛 파일에서 띄우고(/status와 claude daemon status가 불일치를 경고하며, 서비스가 변수를 담고 재시작하면 이후 세션은 런처를 통과합니다), 개발자가 터미널에서 직접 시작한 세션은 호출한 방식대로 돕니다. 후자를 덮으려면 PATH 앞쪽 디렉터리에 실제 바이너리를 런처로 실행하는 claude 스크립트를 두고, 관리형 심링크를 교체하지는 않습니다. corporate-launcher

39장으로 넘어가기 전에
  • 제공자, 게이트웨이 여부, 세션 실행 위치 세 축을 각각 정했습니다.
  • 게이트웨이를 쓴다면 갱신 책임이 누구에게 있는지 정했습니다.
  • 자체 호스팅 환경에서 무엇이 남고 무엇이 나가는지 정확히 말할 수 있습니다.
  • 방화벽 허용 목록을 기능 단위로 좁혀 봤습니다.

39

보안과 컴플라이언스

도입 심사를 통과하려면 두 종류의 답이 필요합니다. "이 도구가 어떻게 안전한가"(아키텍처)와 "우리 규정을 어떻게 만족하는가"(계약과 보존)입니다. 앞의 것은 이미 있는 것을 정리하는 일이고 뒤의 것은 결정하는 일입니다.

39.1보안 아키텍처

공식클로드코드는 기본적으로 엄격한 읽기 전용 권한으로 동작합니다. 파일 편집, 테스트 실행, 명령 실행처럼 추가 행동이 필요하면 명시적 권한을 요청하고, 사용자가 한 번만 승인할지 자동 허용할지 통제합니다. 시스템을 수정할 수 있는 Bash 명령은 승인이 필요하고, ls·cat·git status 같은 내장 읽기 전용 명령 집합은 프롬프트 없이 돕니다. security

공식에이전트 시스템의 위험을 줄이는 내장 보호는 넷입니다. security

보호내용
샌드박스 Bash 도구파일 시스템·네트워크 격리로 Bash 명령을 샌드박싱합니다. /sandbox로 클로드코드가 자율적으로 일할 경계를 정합니다
작업 디렉터리 경계시작한 폴더와 그 하위에만 쓸 수 있고, 상위 디렉터리 파일은 명시적 권한 없이 수정하지 못합니다. 경계 밖 읽기는 승인 프롬프트 후 가능합니다
프롬프트 피로 완화자주 쓰는 안전한 명령을 사용자별·코드베이스별·조직별로 허용 목록에 넣습니다
Accept Edits 모드파일 편집과 mkdir·touch·rm·mv·cp·sed 같은 고정 집합을 작업 디렉터리 경로에 대해 자동 승인합니다. 다른 Bash 명령과 범위 밖 경로는 여전히 물어봅니다

공식공식 문서는 사용자 책임도 명시합니다. 클로드코드는 부여받은 권한만 갖고, 제안된 코드와 명령의 안전성을 승인 전에 검토하는 것은 사용자 책임입니다. security

프롬프트 인젝션

공식프롬프트 인젝션은 공격자가 악성 텍스트를 삽입해 AI 어시스턴트의 지시를 덮어쓰거나 조작하려는 기법입니다. 클로드코드의 핵심 보호는 권한 시스템(민감한 작업에 명시적 승인), 맥락 인지 분석(전체 요청을 분석해 유해 지시 탐지), 입력 정화(명령 인젝션 방지)입니다. security

공식다층 방어가 여전히 필요한 이유는 SDK 문서가 더 분명히 적습니다. 에이전트가 고객 데이터를 외부로 보내라는 악성 파일을 처리하더라도 네트워크 통제가 그 요청을 아예 막을 수 있습니다. 모델의 저항력과 별개로 네트워크 경계가 필요한 이유입니다. agent-sdk/secure-deployment

개념

심사에서 이 절이 하는 일

보안 심사는 대개 "이 도구가 무엇을 할 수 있나"를 묻고, 답이 "명령 실행과 파일 수정"이면 그 자체로는 통과하기 어렵습니다. 통과시키는 것은 기본값이 무엇이고 무엇을 잠글 수 있는지입니다. 기본이 읽기 전용이고, 작업 디렉터리 경계가 있고, 36.2의 표대로 관리형 설정으로 잠글 수 있다는 세 가지가 하나의 답을 만듭니다.

MCP는 우리 책임 영역이다

공식MCP 서버에 대한 공식 입장이 분명합니다. 자기 MCP 서버를 직접 쓰거나 신뢰하는 제공자의 것을 쓰기를 권하고, Anthropic은 커넥터를 디렉터리에 추가하기 전에 등재 기준으로 검토하지만 어떤 MCP 서버도 보안 감사하거나 관리하지 않습니다. security

이 문장이 36.3의 MCP 통제를 필수로 만듭니다. 서버 심사 책임이 조직에 있으므로, 승인 카탈로그나 고정 배포 없이 도입하면 심사 없는 코드가 개발자 권한으로 도는 경로를 열어 둔 것입니다. MCP 통제는 편의 기능이 아니라 이 책임을 집행하는 수단입니다.

클라우드 실행의 통제

공식웹 클로드코드를 쓸 때 Anthropic 호스팅 환경에는 추가 통제가 있습니다. 클라우드 세션마다 격리된 Anthropic 관리 VM, 기본 제한되고 도메인별로 구성 가능한 네트워크 접근, 샌드박스 안에서 범위가 좁혀진 자격증명을 실제 GitHub 토큰으로 변환하는 보안 프록시, 현재 작업 브랜치로 제한된 git push, 컴플라이언스·감사를 위한 전 작업 로깅, 비활성 후 자동 회수입니다. security

공식조직이 자체 호스팅 환경으로 라우팅한 세션은 다릅니다. 조직 인프라에서 돌고 격리, 네트워크 이그레스, git 자격증명이 그 배포의 책임입니다. 리모트 컨트롤은 또 다른 형태로, 웹 인터페이스가 로컬 기계의 클로드코드 프로세스에 붙어 모든 코드 실행과 파일 접근이 로컬에 남고, 연결 중에는 대화 동기화를 위해 세션 트랜스크립트가 Anthropic 서버에 저장됩니다. security

39.2제로 데이터 보존

공식제로 데이터 보존(ZDR)은 자격을 갖춘 Claude for Enterprise 계정에서 쓸 수 있습니다. 켜면 클로드코드 세션 중 생성된 프롬프트와 모델 응답이 실시간으로 처리되고 응답 반환 후 Anthropic이 저장하지 않습니다(법 준수나 악용 대응에 필요한 경우는 예외). zero-data-retention

공식ZDR은 표준 Enterprise 플랜에 포함되지 않고 관리자 설정에서 켤 수 없습니다. 자격을 갖춘 계정에만 열리고 Anthropic이 별도로 활성화합니다. 그리고 조직 단위로 켜지므로 같은 계정 아래 새 조직을 만들면 자동으로 적용되지 않고 각각 따로 켜야 합니다. zero-data-retention

공식ZDR을 켜도 관리 기능은 남습니다. 사용자별 비용 통제, 분석 대시보드, 서버 관리 설정, 감사 로그입니다. 다만 Anthropic 직접 플랫폼에만 적용되므로 Bedrock·Agent Platform·Foundry 배포는 그 플랫폼의 데이터 보존 정책을 따릅니다. zero-data-retention

트래픽이 ZDR 조직으로 가게 만들어야 한다

공식ZDR은 ZDR이 켜진 조직으로 인증된 요청에 적용됩니다. 개발자가 개인 계정으로 로그인하거나 다른 조직의 API 키를 쓰면 그 세션은 적용 범위 밖입니다. 로그인을 ZDR 조직으로 제한하려면 forceLoginMethod와 forceLoginOrgUUID 관리형 설정을 배포합니다. zero-data-retention

이것이 ZDR 도입에서 가장 자주 새는 구멍입니다. 계약으로 ZDR을 켜 두고 로그인 강제를 배포하지 않으면, 개인 계정으로 로그인한 개발자의 세션은 ZDR 밖에서 돕니다. 그리고 그 사실이 겉으로 드러나지 않습니다. 36.2의 로그인 강제 항목과 여기가 같은 결정입니다.

ZDR이 끄는 기능

공식프롬프트나 완성을 저장해야 하는 기능은 백엔드 수준에서 자동으로 비활성화됩니다. zero-data-retention

비활성화되는 기능이유
웹 클로드코드대화 이력의 서버 측 저장이 필요합니다
데스크톱 앱의 클라우드 세션프롬프트와 완성을 담은 영속 세션 데이터가 필요합니다
아티팩트발행된 페이지 내용을 Anthropic 인프라에 저장해야 합니다
피드백 제출(/feedback, /bug, /share)대화 데이터를 Anthropic에 보냅니다
리모트 컨트롤기기 간 동기화를 위해 트랜스크립트를 저장합니다

공식이 기능들은 클라이언트 표시와 무관하게 백엔드에서 차단되므로, 터미널 시작 시 목록에 보여도 쓰려고 하면 조직 정책이 허용하지 않는다는 오류가 납니다. 모델 쪽 제약도 있습니다. Claude Fable 5는 데이터 보존을 요구하는 모델 클래스라 ZDR 조직에서 쓸 수 없고, /model 선택기에서 빠지거나 비활성으로 표시됩니다. best 별칭은 ZDR 조직에서 Opus로 해석됩니다. 그리고 37.1에서 짚은 대로 기여 지표도 쓸 수 없습니다. zero-data-retention

ZDR 결정은 보안 결정처럼 보이지만 실제로는 기능 결정입니다. 위 표의 다섯 기능과 기여 지표, 그리고 모델 하나를 포기하는 대가로 보존을 없앱니다. 규정이 요구하면 선택의 여지가 없지만, "안전할수록 좋으니까"로 켜면 웹과 모바일을 기대했던 팀이 도입 첫 주에 막힙니다. 39.2를 40장의 커뮤니케이션보다 먼저 확정해야 하는 이유입니다.

39.3법무와 도입 심사

공식라이선스는 플랜에 따라 갈립니다. Team·Enterprise·클로드 API 사용자는 상용 약관, Free·Pro·Max 사용자는 소비자 약관입니다. 클로드 API를 직접 쓰든 Bedrock이나 Google Cloud의 Agent Platform으로 접근하든, 상호 별도 합의가 없으면 기존 상용 계약이 클로드코드 사용에도 적용됩니다. legal-and-compliance

공식의료 컴플라이언스에는 조건이 붙습니다. BAA(Business Associate Agreement)를 체결한 고객이 클로드코드를 쓰려면, BAA를 실행하고 ZDR을 활성화한 경우에 BAA가 클로드코드까지 자동 확장됩니다. ZDR이 조직 단위이므로 각 조직마다 따로 켜야 BAA 적용을 받습니다. legal-and-compliance

공식인증 방식에도 정책이 있습니다. OAuth 인증은 Free·Pro·Max·Team·Enterprise 구독 구매자 전용이고 클로드코드와 다른 Anthropic 네이티브 애플리케이션의 통상적 사용을 위한 것입니다. Agent SDK를 포함해 제품이나 서비스를 만드는 개발자는 Claude Console이나 지원되는 클라우드 제공자를 통한 API 키 인증을 써야 하고, Anthropic은 서드파티 개발자가 claude.ai 로그인을 제공하거나 사용자 대신 Free·Pro·Max 자격증명으로 요청을 라우팅하는 것을 허용하지 않습니다. legal-and-compliance

공식컴플라이언스 증빙은 Anthropic Trust Center에서 받습니다. SOC 2 Type 2 보고서, ISO 27001 인증서 등입니다. security

보안 도구 계층

공식코드베이스 취약점 검사도 클로드코드 안에서 할 수 있습니다. Claude Security 플러그인이 다층 방어 스택의 온디맨드 심층 검사 계층이고, 나머지 계층과 이렇게 갈립니다. claude-security

단계도구범위
세션 중보안 가이던스 플러그인클로드가 쓰는 코드의 흔한 취약점을 같은 세션에서 수정
온디맨드 단일 패스/security-review현재 브랜치에 대한 일회성 보안 패스
온디맨드 심층 검사Claude Security 플러그인저장소나 diff에 대한 다중 에이전트 검사

공식플러그인 실행 조건은 넷입니다. 유료 플랜의 클로드코드 v2.1.154 이상(검사가 쓰는 동적 워크플로 때문이고, Pro는 /config의 Dynamic workflows 행에서 켭니다), python3로 접근 가능한 Python 3.9.6 이상(표준 라이브러리만 쓰므로 설치하는 것은 없습니다), 리눅스·macOS·윈도우, 그리고 변경 검사와 패치 생성을 위한 git입니다. 전체 검사는 버전 관리 없이도 됩니다. 설치는 공식 마켓플레이스에서 한 줄입니다. claude-security

/plugin install claude-security@claude-plugins-official

도입 심사 준비에서 이 순서가 값을 합니다. 심사자가 "AI가 쓴 코드의 보안은 누가 보나"를 물을 때, 이미 우리 저장소를 검사해 본 결과를 가져가는 것이 답변 자료 중 가장 강합니다. 39장을 읽고 심사 문서를 쓰기 전에 이 플러그인을 한 번 돌려 보는 편이 낫습니다.

취약점 신고

공식클로드코드에서 보안 취약점을 발견하면 공개하지 말고 HackerOne 프로그램으로 신고하며, 상세 재현 단계를 포함하고 공개 전에 대응할 시간을 줍니다. security

40장으로 넘어가기 전에
  • ZDR이 필요한지 정하고, 필요하다면 그것이 끄는 기능 다섯을 관계자와 공유했습니다.
  • ZDR을 쓴다면 로그인 강제를 함께 배포하기로 정했습니다.
  • MCP 서버 심사 책임이 조직에 있다는 것을 알고 36.3의 통제 패턴을 골랐습니다.
  • 컴플라이언스 증빙(SOC 2, ISO 27001)을 어디서 받는지 알고 있습니다.

40

도입 확산

여기까지가 설계였고 이 장은 사람에게 닿는 일입니다. 공식 문서가 이 부분에 두 개의 키트를 두고 있는데, 둘의 차이는 누가 말하는가입니다. 챔피언 키트는 엔지니어가 동료에게, 커뮤니케이션 키트는 조직이 전체에게 말하는 자료입니다.

40.1챔피언

공식챔피언 역할은 서로를 강화하는 세 행동으로 이뤄집니다. champion-kit

행동실제 모습왜 듣는가
발견한 것을 공유 자기 작업에서 나온 프롬프트, 스크린샷, 작은 성과를 팀이 이미 읽는 곳(엔지니어링 채널, 스탠드업 스레드, PR 설명)에 올립니다 자기 코드베이스에서 나온 예시가 어떤 외부 문서보다 설득력이 큽니다. 동료가 자기 문제에 어떻게 적용되는지 바로 보기 때문입니다
사람들이 묻는 사람이 되기 어떻게 했냐고 물으면 실제로 쓴 프롬프트를 그대로 답합니다 구체적이고 돌릴 수 있는 예시가 호기심과 첫 성공 사이의 간격을 없앱니다. 도입은 대개 그 간격에서 멈춥니다
원을 넓히기 가벼운 반복 습관을 소수만 만듭니다 일회성 발표보다 반복 접점이 남습니다

회의론에 답하는 방식

공식공식 문서의 접근이 명확합니다. 건강한 회의론은 예상되는 것이고 엔지니어가 자기 코드를 만지는 도구에 조심스러운 것은 당연합니다. 효과적인 대응은 일반론을 논박하는 것이 거의 아니고, 우려를 인정하고 짧게 재구성한 뒤 그 사람의 코드에서 구체적 시연 하나를 제안하는 것입니다. 대부분의 우려는 한 번의 성공 경험으로 해소됩니다. champion-kit

우려답변 방향제시할 증거
"나 혼자가 더 빠르다" routinely 쓰는 코드에서는 사실일 것입니다. 대신 피하던 일을 시켜 보게 합니다. 레거시 파일, 낯선 서비스, 테스트 골격처럼 레버리지가 가장 큰 곳입니다 지겨운 작업 하나를 양쪽으로 시간을 재 비교
"AI가 프로덕션 코드를 만지는 것을 신뢰하지 않는다" 읽지 않은 변경이 들어가면 안 된다는 데 동의합니다. 플랜 모드와 통상 diff 리뷰를 합치면 엔지니어가 검토하지 않은 것은 적용되지 않고, 이것은 어떤 PR과도 같은 기준입니다 실제 파일에서 플랜 모드 시연
"주니어를 약하게 만든다" 잘 쓰면 효과적인 설명자입니다. 주니어에게 바꾸기 전에 파일과 그 호출 지점을 설명하게 시켜 보라고 권합니다 "이 파일과 어디서 호출되는지 설명해" 함께 돌려 보기
"한 번 써 봤는데 환각이 났다" 대개 모델 문제가 아니라 맥락 문제입니다. 관련 파일을 @로 지목하고, /init을 돌리고, 실제 오류 출력을 주면 보통 해소됩니다 원래 프롬프트를 제대로 된 @ 맥락과 다시 돌리기
"또 다른 도구를 배울 시간이 없다" 클로드코드는 플랫폼이 아니라 터미널 명령입니다. 첫 세션에서 값이 안 나오면 접어 둬도 됩니다 2분 설치 후 실제 버그 하나
개념

이 표의 공통 구조

다섯 답변이 모두 같은 모양입니다. 인정 → 재구성 → 그 사람의 코드에서 하나입니다. 일반론 대신 표본 하나를 만드는 구조인데, 이것이 도입 확산에서 효과적인 이유는 회의론이 논리로 생긴 것이 아니라 경험 부재로 생긴 것이기 때문입니다. 논리에는 반론이 오고 경험에는 오지 않습니다.

40.2커뮤니케이션

공식커뮤니케이션 키트는 발표 자료 하나를 두 형식(이메일, 메시지)에 변형 둘을 더한 형태로 제공하고, 팁 캠페인용 드립 메시지와 FAQ 응답도 담습니다. 롤아웃에 맞는 것을 골라 고쳐 쓰라는 전제입니다. communications-kit

공식발표 전 체크리스트가 이 장에서 가장 실무적인 부분입니다. 각 항목이 나중에 지원 스레드가 될 구멍을 하나씩 막습니다. communications-kit

항목왜 필요한가
전용 채널을 만들고 발표에 링크질문이 한 곳에 모입니다
우리 환경의 기계 최소 하나에서 설치 명령 테스트모두가 동시에 부딪히기 전에 프록시·방화벽 문제를 잡습니다
보안·데이터 취급 링크 준비"내 코드는 어디로 가나"가 첫 번째 답글이 됩니다
구체적인 첫 작업 하나 선정(우리 코드베이스의 실제 버그나 파일)일반적 예시는 전환되지 않습니다
첫 48시간 채널 담당자 지정답 없는 발표 당일 질문이 동력을 죽입니다
발표를 보내거나 공동 서명할 경영진 스폰서경영진이 보낸 발표가 관리자가 보낸 것보다 첫 주 도입률이 일관되게 높습니다

여섯 항목 중 셋(채널, 담당자, 경영진 서명)이 도구와 무관합니다. 도입 실패의 상당 부분이 기술이 아니라 발표 당일 운영에서 온다는 뜻입니다. 이 셋이 준비 안 됐으면 발표를 미루는 편이 낫습니다.

공식표준 발표문이 다루는 것은 넷입니다. 클로드코드가 무엇인지, 2분 설치 경로, 시도할 구체적 작업 하나, 그리고 "내 코드는 어디로 가나"를 누가 묻기 전에 답하는 것입니다. communications-kit

40.3도입 단계 로드맵

관행공식 문서는 키트를 주지만 단계 로드맵은 자체 판단 영역으로 남깁니다. 이 절은 36~40장의 결정들을 순서로 배열한 것이고, 근거는 각 단계가 앞 단계의 산출물을 필요로 한다는 의존 관계입니다.

단계하는 일끝났다고 판정하는 것이 편의 절
0. 심사 준비 제공자·데이터 보존을 정하고 보안 답변 자료를 모읍니다 ZDR 여부 확정, 우리 저장소로 보안 검사 한 번 돌린 결과 확보 36.1, 39장
1. 파일럿 5~10명에게 최소 정책으로 엽니다. 권한 잠금과 로그인 강제만 켭니다 계측이 켜져 데이터가 들어오고 있음 36.2, 37.2
2. 관찰 파일럿이 실제로 무엇을 쓰는지 봅니다. 어떤 도구, 어떤 MCP 서버, 어떤 확장인지 MCP 승인 카탈로그와 플러그인 표준의 초안이 데이터에서 나옴 37.1, 37.2
3. 표준화 관찰 결과로 MCP·플러그인·CLAUDE.md 정책을 확정합니다 관리형 설정이 배포되고 /status로 확인됨 36.3, 36.4, 36.5
4. 확산 챔피언을 세우고 전사 발표를 합니다 채널·담당자·경영진 서명 준비 완료 후 발표 40.1, 40.2
5. 운영 비용 상한과 감사 파이프라인을 정착시킵니다 지출이 예측 범위 안, 감사 이벤트가 SIEM에 도착 37.3, 38.3

이 순서에서 가장 자주 어긋나는 것은 2단계를 건너뛰는 것입니다. 관찰 없이 3단계로 가면 표준이 추측으로 만들어지고, 추측한 표준은 개발자가 우회하거나(가능하면) 도입을 멈추게 합니다(불가능하면). 1단계에서 계측을 켜는 이유가 이것입니다.

실전이 편은 조직 없이 썼습니다. 그래서 이 절의 로드맵은 직접 돌려 본 것이 아니라 36~40장의 의존 관계를 배열한 것이고, 그 점을 숨기지 않는 편이 맞습니다. 다만 한 가지는 1인 규모에서도 그대로 확인했습니다. 2단계가 실제로 필요하다는 것입니다. 이 볼트에 권한 규칙이 allow 16개·deny 0개로 쌓인 것은 정책을 설계해서가 아니라 필요할 때 하나씩 허용한 결과이고, 그렇게 쌓인 목록은 나중에 보면 무엇이 왜 있는지 알 수 없습니다. 관찰 데이터를 남기지 않으면 규모가 작아도 표준을 만들 근거가 없습니다.


이 편을 마치며

일곱 편이 끝났습니다

설치에서 시작해 조직 표준까지 왔습니다. L0에서 세션 하나를 열었고, 여기서는 조직 전체의 정책·계측·경계·확산을 설계했습니다.

이 편에서 반복해 나온 구조가 하나 있습니다. 결정 하나가 다른 결정을 되돌린다는 것입니다. 클라우드 제공자를 고르면 정책 전달 경로와 감사 귀속을 다시 만들어야 하고, ZDR을 켜면 기능 다섯과 지표 하나가 사라지고, MDM이 없으면 MCP의 가장 강한 통제를 쓸 수 없고, 게이트웨이를 고르면 유지 비용이 어느 팀 백로그로 갈지가 정해집니다.

그래서 조직 도입 설계에서 실제로 어려운 것은 이 되돌림들을 한 화면에서 보는 일입니다. 36.1의 결정 지도가 다섯 줄인 이유가 그것이고, 이 편의 절 사이에 상호 링크가 많은 이유도 그것입니다.

완료 체크리스트

  • 제공자를 고르고, 그 선택이 못 쓰게 만드는 기능이 있는지 확인했습니다.
  • 정책이 기기에 닿는 경로를 정하고, 웹·클라우드 세션까지 닿는지 확인했습니다.
  • HKCU를 집행 채널로 쓰지 않기로 했습니다.
  • 권한 규칙에 deny를 하나 이상 그었습니다.
  • MCP 통제 패턴 일곱 중 하나를 골랐고, 그것이 우리 전달 경로로 가능한지 확인했습니다.
  • 관리 정책 CLAUDE.md에 넣을 것을 "되돌릴 수 있는가"로 걸렀습니다.
  • 계측을 도입 전에 켰습니다.
  • 감사가 필요하면 신원 속성이 자동으로 붙는 구성인지 확인했습니다.
  • 지출을 어디서 보고 어디서 막는지 정했습니다.
  • ZDR 여부를 정하고, 켤 경우 로그인 강제를 함께 배포하기로 했습니다.
  • MCP 서버 심사 책임이 조직에 있다는 것을 관계자와 공유했습니다.
  • 발표 전 체크리스트 여섯 항목 중 도구와 무관한 셋을 준비했습니다.
  • 표준화 전에 관찰 단계를 넣었습니다.

시리즈는 여기서 끝나지만 갱신은 끝나지 않습니다. 공식 문서가 바뀌면 이 일곱 편의 공식 라벨 문단이 갱신 대상이고, 그것을 찾는 방법은 색인 편의 부록 G(갱신 추적)에 있습니다. 자기 환경이 바뀌면 실전 라벨 문단이 재확인 대상입니다. 라벨을 나눈 이유가 여기서 값을 합니다. 무엇을 언제 다시 봐야 하는지가 문단 단위로 표시돼 있습니다.

자주 막히는 곳

관리 콘솔에서 저장했는데 개발자 기기에 적용되지 않습니다

개발자에게 /status를 돌리게 해 Setting sources 줄을 봅니다. Enterprise managed settings가 없으면 아직 닿지 않은 것이고, 있는데 괄호 안이 예상과 다르면 다른 소스가 이기고 있는 것입니다. 서버 관리 설정은 인증 시점에 닿고 활성 세션 중 매시간 갱신되므로, 방금 저장한 값은 재로그인이나 다음 갱신까지 기다려야 할 수 있습니다.

서버 관리 구성을 지웠는데 예전 정책이 남아 있습니다

캐시된 설정이 다음 성공 조회까지 클라이언트에 남습니다. plist나 레지스트리로 폴백할 의도였다면 그 사이에는 캐시된 서버 값이 계속 이깁니다. /status로 지금 활성인 관리형 소스를 확인하고, 폴백이 확실히 필요하면 클라이언트가 한 번 성공적으로 조회하도록 기다립니다.

개발자가 권한 목록을 자기 설정으로 넓혔습니다

의도된 동작입니다. permissions.allow·permissions.deny 같은 배열은 모든 소스가 병합되므로 개발자는 넓힐 수는 있고 줄일 수는 없습니다. 넓히는 것까지 막으려면 allowManagedPermissionRulesOnly로 관리형 규칙만 적용되게 잠급니다. 그리고 위험한 것은 allow를 좁히는 것보다 deny로 못 박는 것이 확실합니다. deny는 bypassPermissions에서도 삽니다.

MDM이 없어서 MCP 고정 배포를 못 합니다

managed-mcp.json은 시스템 경로 파일이라 서버 관리 설정으로 보낼 수 없습니다. MDM 없는 조직이 쓸 수 있는 가장 강한 통제는 allowedMcpServers + allowManagedMcpServersOnly: true의 승인 카탈로그입니다. 고정 배포가 요건이라면 그것이 MDM 도입의 근거가 됩니다.

WSL 세션에 정책이 안 걸립니다

WSL은 기본적으로 /etc/claude-code만 읽습니다. 윈도우 정책을 확장하려면 HKLM 레지스트리나 C:\Program Files\ClaudeCode 파일에 wslInheritsWindowsSettings: true를 넣고, WSL 안에서 /status로 (HKLM)이나 (file)이 보이는지 확인합니다. 그리고 관리형 설정이 있는 기기에서 데스크톱 WSL 세션은 기본적으로 비활성이라 켜려면 Anthropic 계정 팀에 문의해야 합니다.

감사 이벤트에 누가 했는지가 비어 있습니다

인증 방식 때문입니다. 직접 API 키나 Bedrock·Agent Platform·Foundry로 인증하면 세션에 클로드 계정이 없어 user.id와 session.id만 채워집니다. OTEL_RESOURCE_ATTRIBUTES로 사용자별 신원을 직접 붙이거나(관리형 설정 파일이나 실행 래퍼로 사용자마다 다르게), Claude apps gateway를 써서 IdP 신원이 자동으로 찍히게 합니다.

ZDR을 켰는데 데이터가 보존되는 것 같습니다

두 가지를 봅니다. ZDR은 조직 단위이므로 같은 계정의 다른 조직에는 적용되지 않습니다. 그리고 ZDR은 ZDR 조직으로 인증된 요청에만 적용되므로, 개발자가 개인 계정이나 다른 조직 API 키로 로그인하면 범위 밖입니다. forceLoginMethod와 forceLoginOrgUUID를 배포하지 않았다면 그것이 원인일 가능성이 큽니다.

ZDR을 켜니 웹과 모바일이 안 됩니다

의도된 동작입니다. 웹 클로드코드, 데스크톱 클라우드 세션, 아티팩트, 피드백 제출, 리모트 컨트롤이 백엔드에서 비활성화됩니다. 프롬프트와 완성을 저장해야 하는 기능들입니다. 기여 지표도 쓸 수 없고 Fable 5도 쓸 수 없습니다. 이 목록을 도입 발표 전에 공유해야 첫 주 혼란이 줄어듭니다.

기여 지표에 데이터가 안 나옵니다

순서대로 봅니다. GitHub 앱이 조직 GitHub 계정에 설치됐는지, 관리자 설정에서 클로드코드 분석과 GitHub 분석 토글이 둘 다 켜졌는지, GitHub 인증을 완료해 조직을 골랐는지입니다. 데이터는 보통 24시간 안에 나오고 매일 갱신됩니다. 그리고 ZDR이 켜진 조직에서는 애초에 쓸 수 없습니다.

게이트웨이를 붙였는데 새 기능이 안 됩니다

전달 규칙이 최신이 아닐 가능성이 큽니다. 클로드코드는 릴리스마다 헤더와 요청 필드를 더하고, 전달하지 않는 게이트웨이는 해당 기능을 깨뜨립니다. 게이트웨이 프로토콜 레퍼런스로 전달 목록을 갱신하거나, 이 유지 비용을 없애려면 클로드코드와 함께 릴리스되는 Claude apps gateway를 검토합니다.

윈도우에서 런처가 안 걸립니다

윈도우에서 CLAUDE_CODE_PROCESS_WRAPPER는 무시됩니다. 런처 계약이 exec에 의존하고 윈도우가 지원하지 않기 때문입니다. 기계는 정상 동작하고 유일한 신호는 디버그 로그 경고이므로, 런처 정책이 윈도우를 포함한다면 윈도우 기계를 감싸지 않은 것으로 세고 다른 통제를 찾아야 합니다.

도입은 했는데 아무도 안 씁니다

40.2 체크리스트의 도구와 무관한 셋(채널, 첫 48시간 담당자, 경영진 서명)이 준비됐는지 먼저 봅니다. 그다음 챔피언이 있는지 봅니다. 공식 챔피언 키트의 핵심은 외부 자료가 아니라 우리 코드베이스에서 나온 예시가 설득한다는 것이고, 그런 예시를 만들 사람이 없으면 발표만으로는 움직이지 않습니다. 그리고 계측이 켜져 있다면 "아무도 안 쓴다"가 사실인지 먼저 확인할 수 있습니다.


부록

부록 A~H

치트시트, 용어집, 표면 대조표, 트러블슈팅, 프롬프트, 안티패턴, 갱신 추적, 학습 로드맵

쓰는 법
처음부터 읽지 않고 필요할 때 찾아 봅니다. 무언가 안 될 때는 부록 D, 이름이 헷갈릴 때는 부록 A, 문서에 있는데 내 환경에 없을 때는 부록 C입니다.

부록

A

한 장 치트시트

외우기 위한 목록이 아닙니다. 있는지 몰라서 못 쓰는 것을 없애기 위한 목록입니다. 한 번 훑고 나서 필요할 때 되돌아오면 됩니다. 각 항목의 상세는 L1 일상 운전이 정본입니다.

입력 접두어 4종

공식프롬프트 첫 글자가 무엇이냐에 따라 입력의 성격이 달라집니다. interactive-mode

접두어하는 일메모
/명령 또는 스킬 호출메시지 맨 앞에서만 인식됩니다. 뒤에 붙는 글자는 인자가 됩니다
!셸 모드. 명령을 직접 실행하고 출력을 세션에 넣습니다v2.1.186부터 출력이 들어오면 클로드가 자동으로 응답합니다
@파일 경로 언급. 자동완성이 열립니다경로를 설명하는 대신 파일을 직접 읽게 합니다
:이모지 단축코드v2.1.217 이상. emojiCompletionEnabled를 false로 끌 수 있습니다

공식셸 모드는 클로드의 해석이나 승인을 거치지 않고 바로 돕니다. 명령과 출력이 대화 맥락에 들어가고, 긴 명령은 Ctrl+B로 백그라운드로 보낼 수 있습니다. 나갈 때는 빈 프롬프트에서 Esc나 Backspace를 누릅니다. interactive-mode

단축키

공식플랫폼과 터미널에 따라 다를 수 있습니다. macOS에서 Option 조합을 쓰려면 터미널에서 Option을 Meta로 설정해야 합니다. interactive-mode

키하는 일
Esc클로드를 중단하거나 열린 대화상자를 닫습니다
Esc Esc입력 초안을 지우거나, 되감기 메뉴를 엽니다
Shift+Tab (윈도우는 Alt+M)권한 모드를 순환합니다
Ctrl+C진행 중인 동작을 끊거나 입력을 지웁니다
Ctrl+D세션을 종료합니다
Ctrl+G 또는 Ctrl+X Ctrl+E지금 입력을 기본 텍스트 편집기에서 엽니다
Ctrl+O트랜스크립트 뷰어를 켜고 끕니다
Ctrl+R명령 이력 역방향 검색
Ctrl+B실행 중인 작업을 백그라운드로 보냅니다
Ctrl+T클로드의 할 일 체크리스트를 켜고 끕니다
Ctrl+S작성 중인 프롬프트를 넣어 두거나 되꺼냅니다
Ctrl+L화면을 다시 그립니다
Ctrl+Z클로드코드를 일시 중단합니다
Ctrl+X Ctrl+K돌고 있는 백그라운드 서브에이전트를 전부 멈춥니다
Option+P (윈도우는 Alt+P)모델을 바꿉니다
Option+T (윈도우는 Alt+T)확장 사고를 켜고 끕니다
Option+O (윈도우는 Alt+O)패스트 모드를 켜고 끕니다

공식줄바꿈은 네 가지 방법이 있습니다. 어느 터미널에서나 되는 \ Enter와 Ctrl+J, macOS에서 Option을 Meta로 설정한 뒤 쓰는 Option+Enter, 그리고 iTerm2와 WezTerm, Ghostty, Kitty, Warp, Apple Terminal, Windows Terminal에서 기본으로 되는 Shift+Enter입니다. VS Code나 Cursor, Alacritty, Zed에서는 /terminal-setup을 한 번 돌려 바인딩을 심습니다. interactive-mode troubleshooting

권한 모드 6종

공식세션의 기본 승인 방식입니다. CLI에서는 Shift+Tab으로 순환하고, VS Code와 데스크톱, claude.ai에서는 모드 선택기를 씁니다. default는 CLI와 확장, 데스크톱에서 Manual로 표시되며 manual을 같은 값의 별칭으로 받습니다. glossary permission-modes

모드성격
default수정 가능한 동작마다 물어봅니다. 화면 표기는 Manual입니다
plan읽고 조사해 계획만 냅니다. 소스를 고치지 않습니다
acceptEdits파일 편집을 자동 승인합니다
auto별도 분류 모델이 배후에서 검토해 위험한 것만 막습니다. 명시적 ask 규칙은 여전히 묻습니다
dontAsk묻지 않습니다
bypassPermissions권한 검사를 우회합니다

모드는 넓은 기본값이고, 그 위에 세밀한 권한 규칙이 얹힙니다. 규칙은 deny → ask → allow 순으로 평가되고 먼저 맞는 것이 이깁니다. 설계법은 L2 14장에 있습니다.

매일 쓰는 명령

공식공식 명령 표에는 95개가 실려 있습니다. 표시는 두 종류로 갈리는데, 대부분은 CLI에 코딩된 내장 명령이고, 일부는 번들 스킬(클로드에게 넘겨지는 프롬프트)이며, 일부는 여러 서브에이전트로 팬아웃하는 번들 워크플로입니다. 모든 명령이 모든 사용자에게 보이는 것은 아니고 표면과 플랜, 환경에 따라 달라집니다. commands

명령하는 일
/init프로젝트 구조를 읽어 CLAUDE.md 초안을 만듭니다
/context지금 맥락을 무엇이 얼마나 먹고 있는지 격자로 보여 줍니다
/compact대화를 요약해 자리를 비웁니다. 무엇을 남길지 지시를 붙일 수 있습니다
/clear빈 맥락으로 새 대화를 시작합니다
/rewind이전 지점으로 되감습니다. 코드만, 대화만, 둘 다 중에 고릅니다
/resume이전 대화로 돌아갑니다. 인자 없이 쓰면 선택기가 열립니다
/rename지금 세션에 이름을 붙입니다
/plan계획 모드로 들어갑니다
/model모델을 바꿉니다. 바꾼 값은 유지됩니다
/effort추론에 쓰는 노력 수준을 조절합니다
/permissions승인 규칙을 세션과 전역에서 설정합니다
/memory지침 파일을 편집하고 자동 메모리를 켜고 끕니다
/hooks등록된 훅 설정을 봅니다
/mcpMCP 서버 상태를 보고 승인하거나 다시 연결합니다
/doctor설치와 설정을 점검하고 수정안을 제안합니다
/status지금 세션의 상태와 활성 설정 출처를 봅니다
/usage플랜과 토큰 사용량을 봅니다. /cost가 별칭입니다
/diff커밋하지 않은 변경과 턴별 차이를 봅니다
/code-review지금 차이나 PR을 검토합니다. /review가 별칭입니다
/btw대화 이력에 남기지 않고 곁가지 질문을 합니다
/export지금 대화를 평문으로 내보냅니다
/cd세션의 작업 디렉터리를 옮깁니다. 프롬프트 캐시는 유지됩니다
/tasks백그라운드 작업과 끝난 서브에이전트를 봅니다
/config설정 화면을 엽니다
/help도움말과 쓸 수 있는 명령을 봅니다

실전이 표를 만들면서 공식 문서 안의 불일치를 하나 발견했습니다. commands 문서의 표는 "클로드코드에 포함된 모든 명령"이라고 적혀 있지만, 다른 공식 문서가 안내하는 /skills, /terminal-setup이 그 표에는 없습니다. 명령 이름을 확인할 때 표 하나만 근거로 삼지 말고, 그 기능을 다루는 문서에서도 확인하는 편이 안전합니다. 확인 방법은 아래와 같습니다.

# 표에 실린 명령 수를 센다(2026-08-11 기준 95)
curl -s https://code.claude.com/docs/en/commands.md \
  | sed -n '/## All commands/,$p' | grep -c '^| `/'

# 특정 명령이 어느 문서에 적혀 있는지 확인한다
curl -s https://code.claude.com/docs/en/debug-your-config.md | grep -o '/skills'

실전이 볼트의 로그를 재 보면 조금 다른 사실도 나옵니다. 기록된 사용자 발화 1,934건 중 /로 시작한 것은 0건이고, 스킬이 실제로 발동한 턴은 73건입니다. 다만 이 로그는 UserPromptSubmit 훅으로 적재되므로 내장 명령이 이 경로를 타지 않을 수 있어, 0건을 "명령을 전혀 쓰지 않았다"로 읽으면 안 됩니다. 확실한 것은 평문 지시가 압도적 다수라는 점입니다. 명령 목록을 외우는 것보다 평문으로 의도를 잘 쓰는 쪽이 실제 성과를 더 움직입니다.

터미널에서 시작하는 형태

공식CLI 진입 형태는 아래가 대표입니다. cli-reference

명령하는 일
claude대화 세션을 시작합니다
claude "질문"질문을 넣은 채로 세션을 시작합니다
claude -p "질문"비대화 실행. 한 번 답하고 끝냅니다
claude -c가장 최근 세션을 이어 갑니다
claude -r "<세션>" "질문"특정 세션을 골라 이어 갑니다
claude doctor세션을 켜지 않고 설치와 설정 진단만 봅니다
claude update최신 버전으로 올립니다
claude mcpMCP 서버를 추가하고 관리합니다
claude plugin플러그인을 설치하고 관리합니다
claude agents모든 세션을 한 화면에서 봅니다
claude auth login로그인합니다. logout과 status가 짝입니다

공식플래그는 79개가 실려 있습니다. 자주 쓰는 것만 뽑으면 이렇습니다. cli-reference

플래그하는 일
--model이 실행에 쓸 모델을 지정합니다
--permission-mode시작 권한 모드를 지정합니다(예: plan, auto)
--worktree별도 git 워크트리에서 돌려 변경을 격리합니다. 짧은 형태는 -w입니다
--safe-mode모든 커스터마이징을 끄고 시작합니다. 설정 문제를 좁힐 때 씁니다
--bare훅, 스킬, 플러그인, MCP, 자동 메모리, 지침 파일을 로드하지 않습니다. CI 권장
--output-formattext, json, stream-json 중에 고릅니다
--allowedTools쓸 수 있는 도구를 좁힙니다. 무인 실행에서 중요합니다
--add-dir작업 디렉터리 밖의 경로를 추가로 열어 줍니다
--fork-session이력을 유지한 채 새 세션 ID로 갈라 냅니다
--max-turns턴 수에 상한을 둡니다
--verbose자세한 출력을 켭니다. 개발 중 디버깅용입니다
--version버전을 확인합니다

공식--bare와 --safe-mode는 목적이 다릅니다. --bare는 CI와 스크립트에서 어느 기기에서나 같은 결과를 얻으려고 커스터마이징을 배제하는 것이고, --safe-mode는 문제 원인이 플러그인이나 MCP, 훅 중 무엇인지 좁히려고 임시로 끄는 것입니다. 후자는 조직 관리형 훅과 설정 정책은 그대로 적용합니다. glossary debug-your-config


B

용어집

공식공식 용어집에는 용어 46개가 정의돼 있습니다. 아래는 이 시리즈에서 쓰는 한국어 표기와 짝지은 것입니다. 정의가 길거나 미묘한 것은 공식 항목을 직접 보는 편이 낫습니다. glossary

한국어원어한 줄 뜻
에이전트 루프agentic loop맥락 수집 → 행동 → 검증을 끝날 때까지 반복하는 주기. 확장 지점은 대개 이 주기의 특정 국면에 꽂힙니다
에이전트 하네스agentic harness모델을 코딩 에이전트로 만드는 도구와 맥락 관리, 실행 환경. 클로드코드가 하네스이고 클로드가 그 안의 모델입니다
표면surface클로드코드에 접근하는 자리(CLI, VS Code, JetBrains, 데스크톱, claude.ai). Slack과 Chrome은 표면이 아니라 연동입니다
세션session현재 디렉터리에 묶인 대화 하나. 자기 컨텍스트 윈도우를 가집니다
턴turn메시지를 보낸 순간부터 응답이 끝날 때까지. Stop 훅이 턴 끝에 발화합니다
컨텍스트 윈도우context window세션의 작업 기억. 대화, 읽은 파일, 명령 출력, 지침 파일, 스킬이 여기 들어갑니다
자동 압축compaction한계에 가까워지면 오래된 도구 출력을 먼저 비우고 대화를 요약합니다
도구tool클로드가 실제로 하는 행동. 도구가 없으면 텍스트로만 답합니다
체크포인트checkpoint프롬프트마다 만들어지는 복원 지점. git과 별개이며 Bash로 만든 변경은 추적하지 않습니다
지침 파일CLAUDE.md매 세션 시작에 로드되는 지속 지침. 시스템 프롬프트 뒤에 사용자 메시지로 들어갑니다
자동 메모리auto memory클로드가 교정과 취향을 보고 스스로 적는 노트. 저장소별로 ~/.claude/projects/에 쌓입니다
규칙rules.claude/rules/의 모듈형 지침. paths:로 범위를 좁히면 해당 파일을 읽을 때만 로드됩니다
권한 모드permission mode세션의 기본 승인 방식. 6종입니다
권한 규칙permission rule도구 이름과 인자 패턴으로 허용, 질의, 거부를 정하는 항목. deny → ask → allow 순으로 평가됩니다
계획 모드plan mode읽고 조사해 계획만 내는 모드. 승인 전까지 소스를 건드리지 않습니다
자동 모드auto mode분류 모델이 배후에서 검토해 대부분을 프롬프트 없이 통과시키는 모드. 분류기는 도구 결과를 보지 않습니다
샌드박스sandboxingBash 도구에 대한 OS 수준 파일과 네트워크 격리. 권한 규칙과 별개 층입니다
프로젝트 신뢰project trust디렉터리 설정을 로드하기 전 받는 승인. 홈 디렉터리는 세션 단위로만 유지됩니다
프롬프트 인젝션prompt injection파일이나 웹페이지, 도구 결과에 심긴 적대적 지시
스킬skillSKILL.md에 담는 지침과 절차. 관련되면 자동으로, 또는 /이름으로 부릅니다. 커스텀 명령의 후속입니다
명령command/이름으로 부르는 재사용 지시. 공식 문서가 제품 카피에서 "슬래시"를 뺐습니다
서브에이전트subagent자기 컨텍스트와 시스템 프롬프트, 도구 권한을 가진 보조 에이전트. 결과 요약만 돌려줍니다
훅hook정해진 생애주기 지점에서 자동 실행되는 핸들러. 모델 판단이 아니라 결정론적으로 발화합니다
출력 스타일output style시스템 프롬프트를 바꿔 응답 성격을 바꾸는 설정. 소프트웨어 공학 전용 부분을 끕니다
플러그인plugin스킬, 훅, 서브에이전트, MCP 서버를 한 단위로 묶은 설치물
MCPModel Context Protocol외부 데이터와 서비스를 붙이는 개방 표준
MCP 도구 검색MCP Tool Search스키마 로드를 미루는 절약 장치. 이름만 먼저 올리고 쓸 때 전체를 받습니다
커넥터connectorclaude.ai 계정에 붙인 MCP 서버. 그 계정으로 로그인하면 /mcp에 함께 나타납니다
에이전트 팀agent teams팀 리드가 조율하는 독립 세션들. 실험 기능이며 환경 변수로 켭니다
워크트리 격리worktree isolation별도 git 워크트리에서 돌려 병렬 작업이 서로 덮어쓰지 않게 하는 방식
검증 루프verification loop클로드가 돌릴 수 있는 검사를 주어, 통과할 때까지 스스로 반복하게 만드는 구조
비대화 모드non-interactive mode-p로 한 번 실행하고 끝내는 모드. 예전 이름은 헤드리스입니다
관리형 설정managed settings조직이 강제하는 설정. 사용자와 프로젝트 설정이 덮어쓰지 못합니다
설정 계층settings layers관리형 정책 → 명령행 인자 → 로컬 → 프로젝트 → 사용자 순의 우선순위

이름이 바뀐 용어

공식오래된 글과 커뮤니티 자료에는 옛 이름이 남아 있습니다. 검색할 때는 새 이름을 씁니다. glossary

옛 이름지금 이름메모
Headless modeNon-interactive mode-p 플래그와 동작은 같습니다. 문서 경로는 아직 headless입니다
Custom commandsSkills.claude/commands/ 파일은 계속 동작합니다
Slash commandsCommands제품 카피에서 "슬래시"가 빠졌습니다
번역 원칙. 이 시리즈는 코드로 존재하는 것을 한국어로 옮기지 않습니다. 파일명, 명령, 설정 키, 플래그는 원문 그대로 인라인 코드로 씁니다(CLAUDE.md, /compact, settings.json, --permission-mode). 제품과 기능 고유명도 공식 표기를 따르고 임의 번역을 만들지 않습니다(Agent SDK를 다른 말로 바꾸지 않습니다).

C

표면 대조표

이 부록의 목적은 하나입니다. 내 환경에 없는 기능을 붙잡고 시간을 쓰지 않게 하는 것입니다. 가용 여부를 가르는 축은 두 개입니다. 어떻게 인증하는가(공급자), 그리고 어느 플랜인가입니다.

모든 공급자에서 되는 것

공식클로드코드 CLI와 로컬에서 도는 것은 모든 공급자에서 동작합니다. CLI와 Agent SDK, VS Code와 JetBrains 확장, 서브에이전트, 훅, 명령, 스킬, 지침 파일 메모리, 플러그인, MCP 서버, 체크포인트, 샌드박스, 워크플로, OpenTelemetry 계측, 관리형 설정 파일이 여기 해당합니다. feature-availability

공식다만 이 중 셋에는 공급자별 차이가 있습니다. claude.ai 커넥터는 그 구독이 활성 인증 방식일 때만 로드되고, MCP 도구 검색은 ANTHROPIC_BASE_URL이 제1자가 아닌 호스트를 가리키면 기본으로 꺼지며, 내장 Explore 서브에이전트는 Claude API에서는 상속 모델을 Opus로 제한하고 다른 공급자에서는 메인 대화의 모델을 그대로 상속합니다. feature-availability

claude.ai 구독이 있어야 되는 것

공식아래는 claude.ai 계정 로그인을 요구합니다. Anthropic 콘솔 API 키나 제3자 공급자로는 닿지 않습니다. 웹, 모바일, Slack 연동, 데스크톱, 루틴(/schedule), 울트라리뷰, 코드 리뷰(Team과 Enterprise), 리모트 컨트롤, Chrome 확장, 컴퓨터 조작(Pro와 Max), 아티팩트, 음성 입력입니다. feature-availability

플랜별 가용

공식claude.ai 계정으로 로그인한 경우, 플랜이 아래를 가릅니다. Admin은 관리자가 켜야 열린다는 뜻입니다. feature-availability

기능ProMaxTeamEnterprise
웹(클라우드 세션)있음있음있음좌석 조건 있음
루틴있음있음있음있음
리모트 컨트롤있음있음AdminAdmin
채널있음있음AdminAdmin
컴퓨터 조작있음있음없음없음
디스패치(데스크톱)있음있음없음없음
코드 리뷰없음없음있음있음
아티팩트있음있음있음Admin
사용량 분석 대시보드없음없음있음있음
분석 API없음없음없음있음
서버 관리형 설정없음없음있음있음
SSO없음없음있음있음
SCIM없음없음없음있음
제로 데이터 보존없음없음없음별도 활성 필요

공급자별로 갈리는 CLI 기능

공식로컬 CLI에서 동작하지만 서버 쪽 기능에 의존하는 것들입니다. feature-availability

기능claude.ai 구독Anthropic 콘솔Amazon BedrockGoogle CloudMicrosoft Foundry
웹 검색있음있음없음Claude 4 이상Anthropic 호스팅만
패스트 모드있음있음없음없음없음
자동 모드있음있음일부 모델일부 모델일부 모델
어드바이저있음있음없음없음없음
세션 간 메시지macOS·리눅스macOS·리눅스없음없음없음
채널있음있음없음없음없음
/loop 예약있음있음명시 간격만명시 간격만명시 간격만
GitHub Actions있음있음있음있음있음
GitLab CI/CD있음있음있음있음없음

공식자동 모드의 "일부 모델"은 Claude Sonnet 5, Opus 4.7 이상, Fable 5를 뜻합니다. /loop의 "명시 간격만"은 /loop every 2 hours처럼 간격을 직접 적어야 하고, 간격 없이 쓰면 10분마다 돌며 인자 없이 쓰면 사용법만 나온다는 뜻입니다. feature-availability

공식LLM 게이트웨이로 인증하면 가용 기능은 게이트웨이가 전달하는 하위 공급자와 같아집니다. 어드바이저처럼 Anthropic 전용 기능은 게이트웨이가 요청을 그대로 전달할 때만 동작합니다. feature-availability

없는 기능의 대체. 공식 문서는 공급자별로 대체안까지 정리해 두었습니다. 예약이 안 되면 /schedule 대신 간격을 명시한 /loop를, 클라우드 세션이 안 되면 GitHub Actions나 GitLab CI/CD를, 웹 검색이 안 되면 URL을 지정한 WebFetch를 씁니다.

D

트러블슈팅

증상별로 어디를 볼지 먼저 가르고, 그다음에 진단 명령을 씁니다. 순서를 바꾸면 엉뚱한 문서를 오래 뒤지게 됩니다.

증상으로 갈래 찾기

공식공식 문서가 증상별 라우팅 표를 제공합니다. troubleshooting

증상볼 곳
command not found, 설치 실패, PATH, EACCES, TLS 오류troubleshoot-install
로그인 반복, OAuth 오류, 403 Forbidden, 공급자 자격 증명troubleshoot-install
설정이 적용되지 않음, 훅이 발화하지 않음, MCP가 로드되지 않음debug-your-config
API Error: 5xx, 529 Overloaded, 429, 요청 검증 오류errors
model not found 또는 접근 권한 없음errors
CPU나 메모리 과다, 느린 응답, 멈춤, 검색이 파일을 못 찾음troubleshooting
VS Code 확장이 연결되지 않음vs-code
JetBrains 플러그인이나 IDE를 감지하지 못함jetbrains

공식어느 쪽인지 모르겠으면 세션 안에서 /doctor를 돌립니다. 설치와 설정, 확장, 맥락 사용량을 점검하고 확인을 받은 뒤 고칠 수 있는 것은 고쳐 줍니다. 클로드코드가 아예 시작되지 않으면 셸에서 claude doctor를 씁니다. troubleshooting

무엇이 실제로 로드됐는지 보기

공식설정 문제의 원인은 대개 셋입니다. 파일이 로드되지 않았거나, 기대한 위치가 아닌 곳에서 로드됐거나, 다른 파일이 덮어썼습니다. 아래 명령으로 실제 로드 상태를 봅니다. debug-your-config

명령보여 주는 것
/context지금 맥락을 차지한 전부. 시스템 프롬프트, 도구, MCP 도구, 서브에이전트와 그 출처, 메모리 파일, 스킬, 대화
/memory사용자와 프로젝트 스코프의 메모리 파일 위치, 자동 메모리 폴더와 토글
/skills프로젝트, 사용자, 플러그인 출처의 스킬
/hooks활성 훅 설정
/mcp연결된 MCP 서버와 상태
/permissions실제로 적용 중인 allow와 deny 규칙
/status활성 설정 출처. 관리형 설정이 걸려 있는지 포함
/debug [증상]세션 디버그 로그를 켜고 로그와 설정 경로로 진단하게 합니다

공식/context에 파일이 있는데도 지시를 안 따르는 경우, 문제는 로드가 아니라 지시가 쓰인 방식일 가능성이 큽니다. 여러 해석이 가능할 만큼 모호할 때, 두 파일이 상충할 때, 파일이 길어져 개별 규칙에 주의가 덜 갈 때 준수율이 떨어집니다. debug-your-config

자주 겹치는 원인

공식설정 관련 놀라움은 대부분 위치와 문법 규칙 몇 개로 환원됩니다. debug-your-config

증상원인고치는 법
훅이 발화하지 않음matcher를 문자열이 아니라 JSON 배열로 씀문자열 하나에 |로 여러 도구를 씁니다(예: "Edit|Write")
훅이 발화하지 않음matcher 값을 소문자로 씀(예: "bash")대소문자를 구분합니다. 도구 이름은 Bash, Edit, Write, Read입니다
훅이 발화하지 않음훅을 별도 파일에 정의함프로젝트와 사용자 설정에는 별도 훅 파일이 없습니다. settings.json의 "hooks" 키 아래에 둡니다
전역 권한과 훅, env가 무시됨~/.claude.json에 적음그 파일은 앱 상태용입니다. ~/.claude/settings.json에 적습니다. 서로 다른 파일입니다
settings.json 값이 무시됨같은 키가 settings.local.json에 있음로컬이 프로젝트를 덮고, 둘 다 사용자 설정을 덮습니다
스킬이 /skills에 없음파일이 .claude/skills/이름.md임폴더 안에 SKILL.md로 둡니다(.claude/skills/이름/SKILL.md)
스킬이 보이는데 자동으로 안 불림disable-model-invocation: true이거나 설명이 실제 표현과 안 맞음/skills의 배지를 봅니다. user-only 표시면 스스로 부르지 않습니다
하위 폴더 지침 파일이 무시됨하위 파일은 시작 시가 아니라 필요할 때 로드됨그 폴더의 파일을 Read로 읽을 때 로드됩니다. 파일을 쓰거나 만들 때는 로드되지 않습니다
서브에이전트가 지침 파일을 무시함내장 Explore와 Plan은 지침 파일을 건너뜀위임 프롬프트에 다시 적거나, 커스텀 서브에이전트 본문에 넣습니다
.mcp.json이 로드되지 않음파일이 .claude/ 안에 있음저장소 루트에 .mcp.json으로 둡니다
MCP 서버가 일부 디렉터리에서 시작 실패command나 args에 상대 경로를 씀로컬 스크립트는 절대 경로를 씁니다. npx처럼 PATH에 있는 실행기는 그대로 됩니다
Bash(rm *) 거부 규칙이 /bin/rm을 막지 못함접두 규칙은 명령 문자열을 그대로 대조함변형마다 패턴을 추가하거나, PreToolUse 훅이나 샌드박스로 보장을 만듭니다

에러 메시지로 찾기

공식공식 에러 레퍼런스에는 런타임 메시지 99개가 15개 갈래로 정리돼 있습니다. 서버 오류, 사용량 한도, 인증, 네트워크, 요청, 설치, 명령행, 플러그인, 도구, 백그라운드 세션, 래퍼와 IDE, 경고, 응답 품질입니다. 터미널에 보이는 문장을 그 페이지 상단의 색인 표에서 찾는 것이 가장 빠릅니다. errors

공식에러 대부분은 CLI, 데스크톱, 웹 셋 모두에 같이 적용됩니다. 셋이 같은 CLI를 감싸고 있기 때문입니다. 예외는 래퍼와 IDE 오류로, 이것은 클로드코드가 아니라 실행시킨 프로그램이 출력합니다. errors

깨끗한 설정으로 좁히기

공식원인을 못 찾으면 두 단계로 격리합니다. 먼저 claude --safe-mode로 모든 커스터마이징을 끈 세션을 엽니다. 문제가 사라지면 원인은 지침 파일, 스킬, 플러그인, 훅, MCP, 커스텀 명령과 에이전트 중 하나입니다. 그래도 남으면 설정 자체가 의심되므로, CLAUDE_CONFIG_DIR를 빈 디렉터리로 돌리고 .claude도 .mcp.json도 지침 파일도 없는 디렉터리에서 실행합니다. debug-your-config

claude --safe-mode

# 그래도 재현되면 설정을 통째로 우회한다
cd /tmp && CLAUDE_CONFIG_DIR=/tmp/claude-clean claude

공식깨끗한 세션에서는 첫 실행 설정 화면이 뜹니다. 그 화면이 보이면 우회가 실제로 걸린 것입니다. 조직 관리형 설정은 ~/.claude 밖 시스템 경로에 있으므로 이 방법으로도 계속 적용됩니다. 리눅스와 윈도우에서는 자격 증명이 설정 디렉터리 아래에 있어 다시 로그인해야 하고, macOS에서는 키체인에 있어 그대로 이어집니다. debug-your-config

성능과 안정성

공식CPU나 메모리가 과하게 오를 때 순서는 이렇습니다. /compact로 맥락을 줄이고, 큰 작업 사이에 재시작하고, 큰 빌드 디렉터리를 .gitignore에 넣고, claude --safe-mode로 플러그인이나 MCP, 훅이 원인인지 확인합니다. 그래도 높으면 /heapdump로 스냅샷과 진단 파일을 남깁니다. troubleshooting

힙 스냅샷은 공유하지 않습니다. 공식.heapsnapshot 파일에는 프로세스의 모든 문자열이 들어갑니다. 대화 전문과 자격 증명이 포함되므로 공개 이슈에 첨부하지 않습니다. 보고할 때는 통계만 담긴 -diagnostics.json만 올립니다. troubleshooting

공식검색이 파일을 못 찾을 때는 번들 ripgrep이 그 시스템에서 실행되지 않는 경우가 많습니다. 플랫폼 패키지로 설치하고 USE_BUILTIN_RIPGREP를 0으로 두면 시스템 것을 씁니다. 적용됐는지는 claude doctor의 Search 줄이 시스템 경로를 보여 주는지로 확인합니다. troubleshooting

# macOS 예시
brew install ripgrep
{
  "env": {
    "USE_BUILTIN_RIPGREP": "0"
  }
}

E

프롬프트 모음

공식공식 프롬프트 라이브러리에는 복사해 쓰는 지시문 52개가 있습니다. 개발 흐름 5단계(파악, 설계, 구현, 출하, 운영)와 카테고리 15종으로 태그돼 있고, 역할별(기획, 디자인, 문서, 마케팅, 보안, 운영, 데이터) 필터도 있습니다. 원문은 영어이고 { }로 채울 자리가 표시돼 있습니다. prompt-library

아래는 그중 형태가 특히 재사용 가치가 높은 것을 한국어로 옮긴 것입니다. 전량과 원문은 위 문서에서 보시면 됩니다. 대괄호는 자기 상황으로 바꿉니다.

단계지시문
파악이 코드베이스의 개요를 알려 주세요. 구조, 핵심 디렉터리, 그것들이 어떻게 연결되는지
[경로]가 무엇을 하고 데이터가 어떻게 흐르는지 설명하고, 결과를 [형태]로 써 주세요
[대상]을 지웠다면 무엇이 깨집니까
[경로]의 커밋 이력을 훑어 이 코드가 어떻게, 왜 지금 모양이 됐는지 정리해 주세요
설계[대상]을 [목표]로 리팩토링할 계획을 세워 주세요. 바꿀 파일을 나열하되 아직 수정하지 마세요
[기능]을 만들려고 합니다. 구현, 사용 흐름, 엣지 케이스, 트레이드오프를 다 덮을 때까지 저를 인터뷰하고, 끝나면 명세를 SPEC.md에 써 주세요
[기능]에서 설계가 다뤄야 할 오류 상태, 빈 상태, 엣지 케이스를 나열해 주세요
구현[예시]가 어떻게 구현됐는지 보고 그 패턴을 파악한 다음, [새 것]을 같은 방식으로 만들어 주세요
[경로]에 테스트를 쓰고, 돌리고, 실패한 것을 고쳐 주세요
[기능]의 테스트를 먼저 쓰고, 통과할 때까지 구현해 주세요
커밋하지 않은 변경을 검토해서, 커밋 전에 위험해 보이는 것을 짚어 주세요
그건 아닙니다. [지적]. 다른 방법으로 해 보세요
출하이 브랜치의 병합 충돌을 해결하고, 각 쪽에서 무엇을 남겼는지 설명해 주세요
[시작]과 [끝]을 비교해 릴리스 노트를 기능, 수정, 호환성 깨짐으로 묶어 초안을 써 주세요
[브랜치]에 푸시될 때마다 [단계]를 하는 GitHub Actions 워크플로를 써 주세요
운영[증상]이 [위치]에서 보고됐습니다. 조사해서 무슨 일이 벌어지는지 알려 주세요
[증상]. 로그와 최근 배포, 설정 변경을 확인하고 가장 유력한 원인을 말해 주세요
이 프로젝트에서 [단계]를 하는 /이름 스킬을 만들어 주세요

이 형태들이 공통으로 하는 일

공식공식 권고를 네 문장으로 줄이면 이렇습니다. 검증 기준을 함께 준다(예시 입력과 기대 출력, 그리고 구현 후 테스트를 돌리라는 지시), 출처를 지목한다(추측하게 하지 말고 답이 있는 자리를 알려 준다), 기존 패턴을 참조시킨다(코드베이스 안의 좋은 예를 지목한다), 증상을 서술한다(고쳐 달라고 하지 말고 증상과 유력 위치, 무엇이 "고쳐진 것"인지를 적는다). best-practices

공식모호한 지시가 늘 나쁜 것은 아닙니다. 탐색 단계이고 방향을 틀 여유가 있다면 "이 파일에서 무엇을 개선하겠습니까" 같은 질문이 스스로 묻지 못했을 것을 끌어냅니다. best-practices

관행같은 지시를 세 번 이상 반복해 입력하고 있다면 그것은 도구가 될 것입니다. 스킬로 옮기는 방법은 L3 19장에 있습니다. 반복 없이 미리 스킬을 만드는 것은 대개 낭비입니다.


F

안티패턴 12종

앞의 다섯은 공식 문서가 정리한 흔한 실패이고, 뒤의 일곱은 이 가이드를 만들면서 실제로 낸 실패입니다. 뒤쪽을 넣은 이유는 하나입니다. 남의 실패는 읽고 넘기지만 재현되는 실패는 구조 문제이고, 구조 문제는 규칙을 어디에 두느냐로 갈립니다.

공식이 정리한 다섯

공식아래 다섯은 공식 문서의 "흔한 실패 패턴" 절을 그대로 옮긴 것입니다. best-practices

이름증상고치는 법
1. 잡동사니 세션 한 작업으로 시작해 다른 것을 묻고 다시 돌아옵니다. 맥락이 무관한 정보로 찹니다 무관한 작업 사이에 /clear
2. 반복 교정 틀린 것을 고쳐 주고, 여전히 틀리고, 또 고쳐 줍니다. 맥락이 실패한 접근으로 오염됩니다 두 번 실패하면 /clear 후, 배운 것을 담은 더 나은 첫 프롬프트로 다시 시작
3. 과다한 지침 파일 지침 파일이 너무 길어 절반이 무시됩니다. 중요한 규칙이 소음에 묻힙니다 가차없이 줄입니다. 지시 없이도 잘하고 있는 것은 지우거나 훅으로 바꿉니다
4. 믿고 넘어가기 그럴듯한 구현이 나왔지만 엣지 케이스를 못 다룹니다 항상 검증 수단을 줍니다. 검증할 수 없으면 내보내지 않습니다
5. 끝없는 탐색 범위 없이 "조사해 보라"고 해서 수백 개 파일을 읽고 맥락을 채웁니다 조사 범위를 좁히거나 서브에이전트에 맡겨 메인 맥락을 지킵니다

공식3번에 붙는 판별 질문이 하나 있습니다. 지침 파일의 각 줄마다 "이 줄을 지우면 클로드가 실수하게 되는가"를 묻고, 아니면 자릅니다. 규칙을 적어 뒀는데도 계속 어긴다면 파일이 너무 길어 그 규칙이 묻혔을 가능성이 큽니다. best-practices

이 가이드를 만들며 낸 일곱

이름무슨 일이 있었나구조적 교정
6. 규칙을 문서에만 두기 표기 금지 규칙을 지침 파일에 적어 뒀지만 위반이 계속 나왔습니다. 어겨도 아무 일이 없었기 때문입니다 같은 규칙을 Stop 훅으로 옮겼습니다. 규칙 문장은 그대로이고 발화 지점만 바뀌었는데, 위반이 그 턴에서 되돌려집니다
7. 아직 없는 것을 링크하기 미리 만든 목차대로 편들을 서로 링크해 뒀더니 첫 배포에서 404가 7건 났습니다 링크와 비링크를 사람 판단이 아니라 "본문이 있는가"로 자동 판정하게 했습니다. 편이 발행되면 링크가 스스로 살아납니다
8. 공용 자산을 손으로 복사하기 여러 문서가 같은 스타일과 스크립트를 쓰는데 사본을 각자 들고 있었습니다. 하나를 고치면 나머지가 뒤처집니다 정본 하나를 두고 주입기가 사본을 갈아 끼우게 했습니다. 사람이 고치는 자리는 정본뿐입니다
9. 큰 문서를 요약으로 받기 거대한 레퍼런스 페이지에서 필요한 항목만 뽑아 달라고 했더니, 존재하지 않는 설정 키가 섞여 나왔습니다. 이미 읽어 둔 내용과 모순돼 걸렸습니다 큰 문서는 원문을 그대로 받아 직접 읽습니다. 그리고 그 페이지를 끝까지 못 읽었으면 "전량"이라고 쓰지 않고 범위를 줄여 적습니다
10. 설정에 절대 경로 박기 훅 인자에 기기별 절대 경로가 리터럴로 들어가 있었습니다. 그 기기에서는 동작하니 아무도 모릅니다 플레이스홀더(${CLAUDE_PROJECT_DIR})로 바꿉니다. 경로나 계정이 바뀌면 조용히 깨지는 종류의 결함입니다
11. 로컬 확인으로 끝내기 로컬에서 잘 보이던 문서가 배포 번들에서 스타일이 죽어 나왔습니다. 조립 과정에서만 드러나는 결함이었습니다 한 단위를 끝까지(작성 → 검증 → 빌드 → 배포 → 라이브 확인) 통과시켜 봅니다. 중간에 멈추면 그 구간의 결함은 보이지 않습니다
12. 근거 없는 단언 초안에 "대개 이렇게 한다"류의 문장이 섞였습니다. 출처가 공식인지 관행인지 직접 해 본 것인지 구분되지 않았습니다 모든 실질 주장에 세 라벨 중 하나를 붙이게 했습니다. 셋 중 어디에도 못 넣는 문장은 근거가 없는 것이므로 지웁니다

실전일곱 중 여섯은 한 번에 통과하는 검사를 만들면 재발이 멈췄습니다. 사람의 주의력에 맡긴 것은 다시 났고, 스크립트나 훅으로 옮긴 것은 다시 나지 않았습니다. 어느 규칙을 문서에 두고 어느 규칙을 기계에 둘지가 실제 차이를 만듭니다.

판별 질문 하나. 새 규칙을 적을 때 "이 규칙을 어기면 무엇이 그것을 알아차리는가"를 물어봅니다. 답이 "내가 기억한다면"이라면 그 규칙은 아직 규칙이 아닙니다.

G

갱신 추적

이 가이드에서 가장 빨리 낡는 것은 기능 목록입니다. 그래서 갱신을 따라잡는 절차를 여기에 적어 둡니다. 독자가 자기 손으로 대조할 수 있어야 이 가이드를 계속 믿을 수 있습니다.

주 1회 훑기

공식주간 다이제스트가 "일하는 방식을 바꿀 만한" 기능만 골라 줍니다. 각 항목에는 실행 가능한 코드와 짧은 시연, 전체 문서 링크가 붙어 있고, 버그 수정과 사소한 개선 전량은 changelog에 있습니다. 즉 다이제스트로 무엇을 배울지 고르고, changelog로 왜 동작이 바뀌었는지 찾습니다. whats-new changelog

  • 주간 다이제스트를 열어 굵게 표시된 항목만 봅니다. 대개 주당 4개 내외입니다.
  • 항목에 붙은 버전 범위를 자기 claude --version과 비교합니다.
  • 내 버전보다 나중 것은 지금 없는 기능입니다. 설정을 뒤지지 않습니다.
  • 쓸 만한 것이 보이면 그 항목의 문서 링크로 들어가 한 번 돌려 봅니다.

이 가이드를 대조하는 절차

이 시리즈는 공식 문서 185편 전체를 다시 확인하지 않습니다. 실제로 인용한 61편만 확인하면 되고, 그 목록은 본문에서 기계적으로 뽑을 수 있습니다. 절차는 셋입니다.

# 1) 인용한 공식 문서 목록을 뽑는다
grep -oh 'https://code.claude.com/docs/en/[a-z0-9/-]*' L*/index.html | sort -u > cited.txt

# 2) 링크가 살아 있는지 확인한다(404가 나면 문서가 개명·삭제된 것이다)
while read u; do printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$u")" "$u"; done < cited.txt

# 3) 문서 총 편수를 다시 센다(구조가 바뀌었는지 본다)
curl -s https://code.claude.com/docs/llms.txt | grep -c '^- \[.*](https://code.claude.com/docs/'

실전이 절차를 오늘 돌린 결과를 적어 둡니다. 인용 문서 61편 전부 200으로 응답했고, 총 편수는 185편이었습니다. 그런데 이 시리즈의 앞선 편들은 총 편수를 171편으로 적어 두고 있었습니다. 하루 만에 14편이 사라질 일은 없으니, 이는 문서가 바뀐 것이 아니라 처음 계측이 틀렸던 것입니다. 두 색인(llms.txt와 sitemap.xml)을 각각 받아 대조해 185편에서 일치하는 것을 확인하고, 기준 문구를 고쳤습니다.

실전여기서 얻은 규칙 하나를 남깁니다. 여러 곳이 인용하는 숫자는 계측 명령과 함께 적습니다. 숫자만 적어 두면 그것이 어떻게 나온 값인지 잊고, 틀렸을 때 아무도 알아차리지 못합니다. 명령을 함께 적어 두면 누구든 다시 세서 반증할 수 있습니다. 이 가이드의 모든 실전 라벨이 값과 명령을 함께 적는 이유가 이것입니다.

무엇이 바뀌면 이 가이드를 고쳐야 하는가

신호영향 범위대응
인용 링크가 404그 문단문서가 개명됐는지 확인하고 각주를 갱신합니다
기능 이름 변경용어집과 본문 전량부록 B의 옛 이름 표에 한 줄 추가하고 본문 표기를 함께 고칩니다
기본값 변경(모델, 모드 등)해당 편의 절버전과 함께 적습니다. 옛 동작을 지우지 않고 언제 바뀌었는지 남깁니다
플랜이나 공급자 가용 변경부록 C대조표만 고치면 됩니다. 본문에 가용 정보를 복사해 두지 않은 이유입니다
새 확장 수단 추가L3 또는 L4해당 편에 절을 추가하고 이 색인의 레벨 표는 건드리지 않습니다

관행가용 정보와 플랜 정보를 본문 여러 곳에 복사하지 않고 부록 한 곳에 모은 것은 의도적입니다. 자주 바뀌는 사실은 사본을 많이 만들면 반드시 일부가 낡습니다. 자주 바뀌는 것은 한 곳에, 잘 안 바뀌는 것은 본문에 두는 편이 유지 비용이 낮습니다.


H

학습 로드맵

세 가지 기간으로 나눴습니다. 각 칸의 기준은 실제로 남은 산출물입니다. 산출물이 없으면 그 주는 넘어간 것이 아닙니다.

1주 코스: 손에 붙이기

날할 일남는 것
1일설치하고 인증하고 세션을 엽니다. 표면은 CLI로 시작합니다세션이 열리고 claude doctor가 깨끗합니다
2일실제 저장소에서 파일 하나를 고쳐 커밋합니다클로드코드가 만든 커밋 1개
3일계획 모드로 조사부터 시작해 여러 파일에 걸친 변경을 합니다계획 하나와 그것을 따른 변경
4일/context로 맥락을 보고, /compact와 /clear를 구분해 씁니다맥락이 왜 차는지에 대한 감각
5일/init로 지침 파일을 만들고 절반으로 줄입니다15줄 이하의 지침 파일
주말되감기(Esc Esc)로 위험한 시도를 한 번 해 보고 되돌립니다실패해도 되는 작업 방식

1개월 코스: 통제 붙이기

주할 일남는 것
1주위 1주 코스커밋과 지침 파일
2주L1을 끝냅니다. 실무 한 건을 탐색부터 리뷰까지 혼자혼자 끝낸 실무 작업 1건
3주L2의 권한과 샌드박스. 승인 프롬프트를 규칙으로 옮깁니다allow와 deny가 함께 있는 권한 설정
4주검증 수단을 하나 만듭니다. 테스트나 빌드, 스크린샷 비교클로드가 스스로 통과 여부를 판정하는 검사 1개

공식4주차가 이 로드맵의 분기점입니다. 클로드는 일이 다 된 것처럼 보이면 멈추는데, 돌릴 수 있는 검사가 없으면 "다 된 것처럼 보임"이 유일한 신호이고 사람이 검증 루프가 됩니다. 통과와 실패를 내는 것을 하나 주면 루프가 스스로 닫힙니다. best-practices

공식검사를 만든 다음에는 그것이 얼마나 강하게 멈춤을 막을지 고릅니다. 한 프롬프트 안에서 돌리게 하는 방법, /goal 조건으로 두어 매 턴 재확인하게 하는 방법, Stop 훅으로 통과 전까지 턴을 끝내지 못하게 하는 방법(8회 연속 차단하면 클로드코드가 훅을 무시하고 턴을 끝냅니다), 검증 서브에이전트에게 반증을 시도하게 하는 방법입니다. 뒤로 갈수록 설정 비용은 늘고 사람의 주의는 덜 듭니다. best-practices

3개월 코스: 구조 만들기

월할 일남는 것
1개월위 1개월 코스검사 1개와 권한 설정
2개월L3. 반복이 확인된 것 두세 개만 스킬과 훅으로 옮깁니다쓰이는 스킬 1~2개, 반드시 도는 훅 1개
3개월규모가 한 세션을 넘는 작업을 만나면 L4로. 안 만났으면 가지 않습니다병렬로 쪼갠 작업 1건, 또는 안 갔다는 판단

실전2개월차 목표를 "두세 개만"으로 적은 근거를 하나 두겠습니다. 앞서 0.2절에서 잰 값입니다. 확장을 갖춰 놓은 환경에서도 스킬이 실제로 발동한 턴은 3.9퍼센트, 서브에이전트는 5.0퍼센트였습니다. 스킬을 열 개 만드는 것보다 실제로 발화하는 두 개를 갖는 편이 낫습니다. 만들었지만 안 불리는 확장은 자산이 아니라 유지 비용입니다.

관행3개월차에 "안 갔다는 판단"을 산출물로 적어 둔 것도 의도입니다. 다음 레벨로 가는 것이 항상 발전은 아닙니다. 한 세션에서 끝나는 작업만 하는 사람이 병렬을 배우면, 쓰지 않는 구조를 유지하는 일만 늘어납니다.


고르고 나서

읽을 순서가 정해졌습니다

자기 레벨을 진단하고, 역할에 맞는 트랙을 고르고, 자기 환경에 없는 기능을 미리 걸러 냈습니다. 이제 첫 편으로 갑니다.

이 편의 완료 체크리스트

  • 0.3절의 6문항에 파일을 열어 답했습니다.
  • 진단 결과로 나온 시작 레벨을 하나 정했습니다.
  • 자기 역할에 맞는 트랙(실무자, 팀 리드, 관리자)을 골랐습니다.
  • 자기 인증 방식을 확인하고, 부록 C에서 없는 기능을 미리 걸러 냈습니다.
  • claude --version으로 자기 버전을 확인했습니다.
  • 부록 A의 입력 접두어 4종과 권한 모드 6종을 한 번 훑었습니다.
  • 안 읽어도 되는 편을 정해, 읽을 분량을 줄였습니다.

여기까지 하면 읽을 순서가 정해졌습니다. 대부분은 L0 시작이나 L1 일상 운전으로 갑니다. 이 편은 되돌아오는 자리입니다. 명령 이름이 헷갈릴 때 부록 A, 무언가 안 될 때 부록 D, 문서에 있는데 내 환경에 없을 때 부록 C로 오시면 됩니다.

자주 묻는 것

순서대로 다 읽어야 합니까

아닙니다. 0.1절의 "안 읽어도 되는 편"과 0.2절의 트랙을 보고 자기 범위를 줄이는 것이 이 편의 목적입니다. 다만 L1과 L2는 건너뛰지 않는 편이 좋습니다. 이 둘을 비우고 확장 기능을 배우면 잘못된 지시와 넓은 권한을 그대로 증폭하게 됩니다.

이미 몇 달 써 왔는데 어디서 시작할까요

0.3절의 3번과 4번만 확인해 보시면 됩니다. 지침 파일에서 줄을 지운 적이 있는지, 권한을 규칙으로 적어 뒀는지입니다. 오래 쓴 사람도 이 둘이 비어 있는 경우가 많고, 여기가 비면 확장 기능이 오작동을 증폭합니다. 그 절의 진단 명령으로 파일을 직접 열어 확인하는 편이 정확합니다.

공식 문서를 그냥 읽는 것과 무엇이 다릅니까

배열이 다릅니다. 공식 문서는 기능별로 완전하게 배열돼 있어 "무엇이 있는지" 찾기에 좋고, 이 시리즈는 능력 단계별로 배열해 "지금 다음에 무엇을" 정하기 쉽게 했습니다. 사실 자체는 공식 문서가 정본이므로, 의심스러우면 각 문단 끝 각주로 원문을 확인하시면 됩니다.

문서에 있는 기능이 제 환경에서는 안 됩니다

설정을 뒤지기 전에 세 가지를 먼저 지웁니다. 버전이 낮은지(claude --version과 주간 다이제스트의 버전 범위 대조), 인증 방식이 그 기능을 지원하지 않는지(부록 C), 플랜에 없는 기능인지입니다. 셋 다 아니면 부록 D로 갑니다.

라벨이 공식인데 제 환경과 다릅니다

각주의 원문을 먼저 확인해 주십시오. 공식 라벨은 "이 문서에 그렇게 적혀 있다"는 뜻이고, 문서는 최신 버전을 기준으로 쓰여 있습니다. 기본값과 동작은 버전에 따라 바뀌므로 자기 버전을 함께 봐야 합니다. 원문과도 다르면 이 가이드의 오류이므로 각주 쪽이 정본입니다.

실전 라벨의 숫자는 제 환경에서도 같습니까

아닐 것입니다. 그 숫자는 특정 볼트와 특정 시점의 측정값이고, 그래서 값만 적지 않고 재는 명령을 함께 적어 두었습니다. 같은 명령으로 자기 값을 재 보시면 됩니다. 중요한 것은 자기 환경에서 무엇이 실제로 쓰이고 있는지입니다.

여덟 편을 다 읽어야 합니까

아닙니다. 0.2절의 트랙 셋 중 하나만 따라가면 됩니다. 혼자 쓰는 실무자는 L0에서 L3까지, 팀 리드는 여기에 L4를 더하고, 관리자는 L0과 L2를 거쳐 L6으로 갑니다. L5는 파이프라인이나 코드로 클로드코드를 부를 일이 생겼을 때만 필요합니다. 지금 안 읽는 편은 필요해질 때 상단 고정 바에서 바로 열 수 있습니다.

팀에 공유할 때 무엇부터 주면 됩니까

이 색인 편 링크 하나면 됩니다. 각자 0.3절로 자기 레벨을 정하게 하는 편이, 모두에게 같은 편을 읽히는 것보다 이탈이 적습니다. 조직 차원의 도입 계획이 필요하면 관리자만 L2와 L6을 봅니다.

태그클로드코드공식문서레퍼런스
최종 수정: 2026-08-11
무료 AI 활용 진단 내 AI 활용 수준, 상위 몇 %일까요? 진단하면 내 점수와 지금 무엇부터 할지 알려드립니다.