Claude Code Deep Dive - 5(CLI Reference)
1. Chapter 5의 핵심
Chapter 1~4가 사람이 Claude Code와 대화하면서 작업하는 방법을 다뤘다면, Chapter 5는 Claude Code를 스크립트와 CI/CD 안에서 실행하는 방법을 다룬다.
회사에서, 해당 CI/CD 파이프라인에 적용해 보면 좋을 것 같다는 생각이 든다.
Claude Code를 사람이 조작하는 개발 도구에서, 결과를 판정하고 비용과 권한을 통제할 수 있는 자동화 실행기로 확장하는 과정이다.
전체 흐름은 다음과 같다.
- CLI 명령과 플래그를 분류한다.
-p로 Headless 작업을 실행한다.- JSON과 exit code로 결과를 판정한다.
- 기존 세션을 재개하거나 분기한다.
- cron, Routines, CI에 자동화를 배치한다.
- 이슈 트리아지, 로그 분석, 보고서 등의 패턴을 적용한다.
- 환경변수와 디버깅 절차로 운영한다.
2. CLI 기본 구조
claude [플래그] [프롬프트]기본 실행 형태
# 대화형 세션
claude
# 초기 요청과 함께 대화형 세션 시작
claude "explain this project"
# 실행 후 종료하는 Headless 모드
claude -p "query"
# 파이프 입력
cat logs.txt | claude -p "explain"
# 현재 디렉터리의 최근 대화 재개
claude -c
# 이름이나 ID로 특정 대화 재개
claude -r "auth-refactor" "Finish this PR"| 형태 | 설명 |
|---|---|
claude | 대화형 세션 |
claude "prompt" | 초기 프롬프트로 대화형 세션 시작 |
claude -p "prompt" | 작업 후 종료되는 비대화형 실행 |
주요 관리 명령
| 명령 | 용도 |
|---|---|
claude auth login/logout | 로그인과 로그아웃 |
claude auth status | 로그인 상태 및 exit code 확인 |
claude setup-token | CI용 장기 OAuth 토큰 발급 |
claude update/install | 업데이트 또는 지정 버전 설치 |
claude doctor | 환경과 설정 진단 |
claude project purge | 프로젝트 로컬 상태 정리 |
claude agents/logs/attach | 백그라운드 에이전트 조회, 로그 확인, 접속 |
claude stop/respawn | 에이전트 중지와 재기동 |
claude mcp login/logout | MCP OAuth 인증 |
3. 플래그를 여섯 종류로 분류하기
| 분류 | 주요 플래그 | 역할 |
|---|---|---|
| 동작 모드 | -p, --bg, --remote, --worktree, --bare, --safe-mode | 실행 방식 결정 |
| 세션 | -c, -r, --from-pr, --fork-session, -n | 기존 맥락 재사용 |
| 모델과 사고 | --model, --effort, --fallback-model | 모델과 추론 수준 선택 |
| 권한과 도구 | --permission-mode, --tools, --allowed-tools | 실행 능력 제한 |
| 구성과 확장 | --settings, --agents, --mcp-config | 설정과 확장 주입 |
| 출력과 진단 | --output-format, --json-schema, --debug | 결과 계약과 문제 분석 |
모델과 사고 수준
claude --model opus
claude --effort high
claude --fallback-model sonnet,haiku
claude --advisor opus자료에서 설명하는 일반적인 우선순위는 다음과 같다.
CLI 플래그 > 환경변수 > 파일 설정조직의 managed 설정은 이보다 높은 강제 계층으로 적용될 수 있다.
권한과 도구 제한
# Plan 모드
claude --permission-mode plan
# 특정 도구와 명령만 허용
claude -p \
--allowed-tools "Read" "Bash(git log *)" \
"최근 변경 사항을 분석해줘"
# Edit 도구 제거
claude --disallowedTools "Edit"
# rm 계열 호출 거부
claude --disallowedTools "Bash(rm *)"
# 모든 MCP 도구 제거
claude --disallowedTools "mcp__*"
# 사용할 내장 도구 제한
claude --tools "Bash,Edit,Read"실행별 설정 오버레이
claude --settings ./ci-settings.json
claude --settings '{"model":"haiku"}'
claude --setting-sources user,project
claude --mcp-config ./mcp.json --strict-mcp-configCI처럼 재현성이 중요한 환경에서는 설정 소스를 고정하고 별도의 설정 파일을 주입하면 로컬과 CI의 차이를 줄일 수 있다.
시스템 프롬프트
| 플래그 | 동작 | 적합한 상황 |
|---|---|---|
--append-system-prompt | 기본 프롬프트 뒤에 규칙 추가 | Claude Code의 정체성 유지 |
--append-system-prompt-file | 파일의 규칙 추가 | 긴 규칙을 버전 관리 |
--system-prompt | 기본 프롬프트 전체 대체 | 별도 비코딩 에이전트 |
--system-prompt-file | 파일로 전체 대체 | 완전한 프롬프트 교체 |
기본 동작을 유지하려면 append 계열을 사용하는 것이 기본이다. 전체 대체는 기본 안전 지침까지 사라지므로 실행 책임도 함께 가져가야 한다.
4. --bare와 --safe-mode
| 항목 | --bare | --safe-mode |
|---|---|---|
| 목적 | 반복 스크립트 기동 가속 | 문제 원인 진단 |
| 훅, 스킬, 플러그인 | 탐색하지 않음 | 비활성화 |
| MCP, CLAUDE.md | 탐색하지 않음 | 비활성화 |
| 기본 도구 | Bash, 읽기, 편집 가능 | 인증과 기본 권한은 정상 |
| managed 정책 | 최소 실행 | 계속 적용 |
정리하면 다음과 같다.
- 빠른 파일 단위 배치:
--bare - 훅, MCP, 스킬, CLAUDE.md 중 무엇이 문제인지 확인:
--safe-mode
claude --bare -p --model haiku "이 파일의 복잡도를 분석해줘"
claude --safe-mode -p "문제가 발생하는 작업"5. Headless 실행
-p의 의미
-p는 단순히 답변만 출력하는 옵션이 아니다. 자료 기준으로 Agent SDK 경로를 이용하는 단발 에이전트 실행이다.
다음 기능도 유지된다.
- 도구 실행
- 훅
- MCP
- 설정
- 권한 모델
차이는 사람이 대화를 이어가는 대신 결과를 stdout에 남기고 종료한다는 점이다.
| 채널 | 역할 |
|---|---|
| stdout | 작업 결과 |
| stderr | 오류와 진단 정보 |
| exit code | 성공과 실패 판정 |
입력 전달 방법
# 직접 인자
claude -p "직접 인자"
# 파이프
cat error.log | claude -p "원인 분석"
# 명령 치환
claude -p "$(cat prompt.txt)"
# 리다이렉트
claude -p "요약해줘" < notes.md
# Here Document
claude -p <<'EOF'
여러 줄 지시문
EOF
# 기존 세션 이어받기
claude -c -p "이어서 리팩터링해줘"파이프나 리다이렉트에는 데이터를, 명령 인자에는 데이터를 어떻게 처리할지를 적는 방식이 이해하기 쉽다.
Exit Code
claude -p "테스트 실패 원인을 찾아 수정해줘" \
--max-turns 15
case $? in
0) echo "OK" ;;
*) echo "FAIL"; exit 1 ;;
esac0: 정상 완료0이 아닌 값: 실행 오류 또는 상한 도달
CI에서는 자연어 응답보다 exit code가 Job 성공 여부를 결정한다.
6. 출력 형식과 구조화 출력
출력 형식
| 형식 | 설명 | 용도 |
|---|---|---|
text | 최종 본문 출력 | 사람이 읽는 간단한 스크립트 |
json | 결과와 비용, 세션 메타데이터 출력 | 배치, 비용 집계, 세션 재개 |
stream-json | 진행 이벤트를 줄 단위 JSON으로 출력 | 실시간 UI, 장기 작업 관측 |
claude -p "고위험 파일 3개를 찾아줘" \
--output-format json대표적인 JSON 필드:
.result: 최종 본문.total_cost_usd: 호출 비용.num_turns: 사용한 턴 수.session_id: 재개에 사용할 세션 ID
OUT=$(claude -p "작업 요청" --output-format json)
echo "$OUT" | jq -r '.result'
echo "$OUT" | jq -r '.total_cost_usd'
echo "$OUT" | jq -r '.session_id'stream-json의 주요 이벤트는 system, assistant, tool_result, result다. --include-partial-messages와 --include-hook-events로 부분 응답과 훅 이벤트도 받을 수 있다.
JSON Schema
claude -p "이 diff의 위험도를 평가해줘" \
--json-schema '{
"type": "object",
"properties": {
"risk": {
"enum": ["low", "medium", "high"]
},
"reasons": {
"type": "array",
"items": {"type": "string"}
},
"block": {
"type": "boolean"
}
},
"required": ["risk", "block"]
}'결과를 CI 게이트에 바로 연결할 수 있다.
RISK=$(
claude -p "git diff의 위험도를 평가해줘" \
--json-schema "$SCHEMA" |
jq -r '.risk'
)
[ "$RISK" = "high" ] && exit 1프롬프트에서 “JSON으로 답해줘”라고 요청하는 것은 형식 요청이다. --json-schema는 후속 파이프라인이 기대하는 출력 계약이다.
7. 무인 실행의 안전장치
claude -p "의존성 취약점을 분석하고 패치 PR 초안을 작성해줘" \
--max-turns 20 \
--max-budget-usd 3.00| 옵션 | 역할 |
|---|---|
--max-turns | 에이전틱 턴 수 상한 |
--max-budget-usd | 호출당 비용 상한 |
--allowed-tools | 사용 가능한 도구와 명령 제한 |
--fallback-model | 모델 과부하 시 폴백 |
자료 기준 --max-turns는 기본 무제한이므로, 사람이 지켜보지 않는 실행에서는 반드시 상한을 설정해야 한다.
상한 산정 방법:
- 실제 작업을 파일럿으로 실행한다.
- 턴 수와 비용의 p95를 측정한다.
- 처음에는 p95의 약 1.5배로 설정한다.
- 상한 도달을 작업 분할이나 상한 재조정 신호로 본다.
재시도
모든 실패를 재시도하지 않는다. Rate limit이나 일시적 과부하처럼 다시 실행할 가치가 있는 오류만 골라야 한다.
run_claude() {
local attempt=1
while [ "$attempt" -le 3 ]; do
OUT=$(claude -p "$1" \
--output-format json \
--max-turns 15 \
2>err.log) && {
echo "$OUT"
return 0
}
grep -qiE 'rate|overloaded|529' err.log || break
sleep $((attempt * 20))
attempt=$((attempt + 1))
done
return 1
}모델 과부하에는 재시도 전에 --fallback-model을 사용하는 방법도 있다.
8. 세션 제어
세션 트랜스크립트는 프로젝트별 JSONL로 저장된다.
~/.claude/projects/자료 기준 기본 정리 기간은 30일이며 cleanupPeriodDays로 조정한다. claude project purge로 프로젝트 로컬 상태를 정리할 수 있다.
Continue와 Resume
| 명령 | 동작 |
|---|---|
claude -c | 현재 디렉터리의 가장 최근 세션으로 이동 |
claude -r | 선택기에서 세션 선택 |
claude -r <ID> | 특정 세션 ID 재개 |
claude -r <name> | 이름으로 재개 |
claude -c
claude -r "payments-refactor"
claude -c -p "이어서 리팩터링해줘"세션 ID는 프로젝트와 Worktree 범위에서 검색된다. 세션을 찾지 못하면 실행 디렉터리부터 확인한다.
PR 세션 복원
claude --from-pr 123
claude --from-pr https://github.com/org/repo/pull/123--from-pr은 PR과 연결된 대화 맥락을 복원한다. claude -w '#123'은 PR 코드를 별도 Worktree로 분기한다는 차이가 있다.
세션 분기
claude \
--resume auth-refactor \
--fork-session같은 지점에서 구현 방향 A와 B를 각각 실험할 때 사용할 수 있다.
SID=$(uuidgen)
claude -p \
--session-id "$SID" \
"1단계: 프로젝트 스캔"
claude -p \
--resume "$SID" \
"2단계: 스캔 결과를 바탕으로 수정"이처럼 스크립트가 세션 ID를 소유하면 다단계 파이프라인에서도 맥락을 이어갈 수 있다.
이름, 내보내기, 되돌리기
claude -n "payments-refactor"세션 내부 명령:
/rename auth-hotfix: 이름 변경/export: 대화 기록 내보내기/rewind: 코드와 대화를 이전 체크포인트로 복구
/rewind는 Bash 명령의 외부 부수효과, 원격 API 변경, 데이터베이스 작업까지 되돌리지는 않는다. 세션 안의 시행착오는 /rewind, 장기 이력과 협업은 Git이 담당한다.
웹과 로컬 이동
claude --remote "로그인 버그를 수정해줘"
claude --teleport--remote는 웹 클라우드 세션에 작업을 위임하고, --teleport는 해당 세션을 로컬로 가져온다. Remote Control은 로컬에서 실행 중인 세션을 웹이나 모바일에서 조작하는 반대 방향의 기능이다.
9. 자동화 실행 위치
| 자동화 표면 | 실행 위치 | 적합한 상황 | 주의점 |
|---|---|---|---|
/loop, /goal | 현재 세션 | 조건 달성까지 반복 | 세션 종료 시 함께 종료 |
| Desktop 예약 | 개인 PC | GUI 기반 개인 정기 작업 | 기계 필요 |
| Routines | 관리형 클라우드 | 스케줄, API, GitHub 이벤트 | 관리형 실행 환경 |
| CI 파이프라인 | GitHub Actions, GitLab CI | PR, push, 이슈 이벤트 | 권한과 비용 설계 |
| cron + Headless | 자체 서버 또는 PC | 완전한 실행 통제 | PATH, 인증 수명, 로그 |
/loop와 /goal
/loop 테스트가 전부 통과할 때까지 실패를 고쳐/loop는 같은 작업을 반복한다.
/goal 전체 테스트 통과 + 린트 0 경고 상태 도달/goal은 최종 상태를 계약하고, Claude가 방법을 바꿔가며 조건을 달성한다.
| 구분 | /loop | /goal |
|---|---|---|
| 중심 | 작업 반복 | 상태 도달 |
| 방식 | 같은 요청 반복 | 수단을 바꾸며 지속 |
| 종료 | 반복 조건 종료 | 완료 조건 충족 |
Routines
Routines는 개인 기계 없이 관리형 환경에서 Claude Code를 실행한다.
지원 트리거:
- 스케줄
- API 호출
- GitHub 이벤트
Deep Link
claude-cli://open?path=~/work/payments&prompt=결제 지연 알람 원인을 조사해런북, 알림, 대시보드에 Deep Link를 넣으면 지정된 저장소와 프롬프트로 Claude Code 세션을 열 수 있다.
백그라운드 실행
claude --bg "flaky 테스트 원인 조사"
claude logs <session-id>
claude attach <session-id>
claude --bg --exec 'pytest -x'--bg는 세션을 유지한 채 터미널만 돌려받는다. 자료 기준 -p와 함께 사용할 수 없다.
cron
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/home/dev/.local/bin
0 7 * * 1-5 cd /home/dev/payments && \
./scripts/nightly-deps-audit.sh >> ~/logs/deps.log 2>&1cron에서는 다음을 확인해야 한다.
- PATH를 명시한다.
- Bedrock SSO나 토큰 만료를 고려한다.
- stdout과 stderr를 로그로 보존한다.
10. CI/CD 통합
세 가지 원칙
묻지 않고, 넘치지 않고, 흔적을 남긴다.
| 원칙 | 구현 |
|---|---|
| 묻지 않는다 | -p, 명확한 --allowed-tools |
| 넘치지 않는다 | --max-turns, --max-budget-usd, 저비용 모델 |
| 흔적을 남긴다 | JSON, stderr, 아티팩트, PR 코멘트 |
인증
| 환경 | 인증 방식 | 특징 |
|---|---|---|
| 구독 조직 | claude setup-token | 장기 토큰을 시크릿에 보관 |
| API 조직 | ANTHROPIC_API_KEY | Console 발급 키 |
| AWS | OIDC 역할 인수 + Bedrock | 장기 시크릿 제거 가능 |
| 게이트웨이 | BASE_URL + 서비스 자격 | 중앙 정책 활용 |
자료에서는 AWS 환경에서 OIDC 역할 인수를 권장한다.
보안 원칙:
- CI Job 권한 최소화
- 키와 토큰 로그 마스킹
- 프롬프트와 결과 JSON에 시크릿 미포함
- 포크 PR에 시크릿 미주입
GitHub Actions 기본 흐름
jobs:
deps-audit:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: CLAUDE_ROLE
aws-region: ap-northeast-2
- run: curl -fsSL https://claude.ai/install.sh | bash
- run: |
CLAUDE_CODE_USE_BEDROCK=1 \
./scripts/nightly-deps-audit.shWorkflow 안에 Claude 명령을 길게 작성하기보다는, 로컬에서도 실행 가능한 셸 스크립트를 만들고 CI에서 호출하는 구성이 좋다.
PR 리뷰 게이트
git diff "origin/$BASE...HEAD" > pr.diff
claude -p "pr.diff를 리뷰하고 차단 여부를 판단해줘" \
--allowed-tools "Read" "Grep" "Bash(git diff *)" \
--max-turns 12 \
--max-budget-usd 1.50 \
--json-schema "$(cat .ci/review-schema.json)" \
> review.json
jq -e '.block == false' review.jsonClaude가 리뷰를 작성하는 데서 끝내지 않고 block 값을 Job의 성공과 실패에 연결한다.
GitLab CI
claude-review:
stage: test
image: ubuntu:24.04
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
before_script:
- apt-get update && apt-get install -y curl git jq
- curl -fsSL https://claude.ai/install.sh | bash
- export PATH="$HOME/.local/bin:$PATH"
script:
- ./scripts/mr-review.sh
artifacts:
paths:
- review.json
when: always문법은 달라도 Headless 실행, 상한, Schema, exit gate라는 원칙은 동일하다.
비용 통제
| 방법 | 설명 |
|---|---|
| 호출 상한 | 턴과 예산 상한 설정 |
| 모델 하향 | 분류와 일반 리뷰에 저비용 모델 사용 |
| 발동 조건 축소 | paths, 라벨, 이벤트 조건으로 Job 수 감소 |
| 캐시 활용 | 설치 캐시와 프롬프트 캐시 개선 |
| 비용 집계 | total_cost_usd 월별 집계 |
| 조직 안전망 | 게이트웨이 한도와 예산 알람 |
가장 큰 절감은 모델 단가를 낮추는 것보다 불필요한 Job이 발동하지 않게 하는 데서 나온다.
실패와 아티팩트
성공 여부와 상관없이 보존할 항목:
- 결과 JSON
- stderr
- Debug 로그
- 비용과 턴 수
실패는 다음과 같이 구분한다.
- 리뷰 결과에 따른 정상 게이트 실패
- Claude Code 실행 오류
- 턴 또는 예산 상한 도달
11. 실전 자동화 패턴
공통 구조:
셸 전처리 -> Claude의 구조화된 판정 -> 전용 CLI 액션 -> 실패 큐
이슈 트리아지
입력:
- 이슈 제목과 본문
- 재현 정보
판정:
- 카테고리
- 우선순위
- 담당 팀
- 중복 의심 이슈
액션:
- 라벨 추가
- 담당 팀 멘션
- 요약 코멘트
초기에는 자동 종료나 확정 처리보다 제안 수준으로 권한을 제한한다.
로그 분석
대량 로그를 그대로 Claude에 전달하지 않는다.
grep -E 'ERROR|FATAL' app.log |
sed -E 's/[0-9a-f-]{36}/<id>/g' |
sort |
uniq -c |
sort -rn |
head -20 > sigs.txt처리 과정:
- 셸에서 오류 로그만 추출
- 변동 값 정규화
- 동일 오류 집계
- 상위 시그니처만 Claude에 전달
- 결과를
jq -s로 합침 - 최종 호출에서 인시던트 보고서 작성
셸이 압축하고 Claude가 해석하는 Map-Reduce 구조다.
일일 보고서
SINCE=$(date -d yesterday +%F)
{
git log --since="$SINCE" --oneline
gh pr list --state all \
--search "updated:>=$SINCE" \
--json number,title,state
gh issue list \
--search "created:>=$SINCE" \
--json number,title
} > digest.txt
claude -p \
"digest.txt로 팀 브리핑을 작성해줘" \
--max-turns 8 \
--max-budget-usd 0.50 \
> report.md역할 분리:
git,gh: 데이터 수집- Claude: 요약과 서술
- Markdown, Slack Webhook: 저장과 배달
문서 파이프라인
모든 문서를 다시 만들지 않고 Git diff로 변경된 모듈만 처리한다.
핵심 원칙:
- 변경분만 갱신
- 쓰기 권한을
docs/**로 제한 - 번역도 변경된 문서만 수행
배치 마이그레이션
파일 한 개를 다음 원자 단위로 취급한다.
변환 -> 관련 테스트 -> 성공 시 커밋 -> 실패 시 원복과 기록상태 파일:
targets.txt: 전체 대상done.txt: 완료 목록failed.txt: 사람의 확인이 필요한 실패 목록
장점:
- 일부 실패가 전체 배치를 중단하지 않음
- 중단 지점부터 재개 가능
- 파일별 커밋으로 롤백 단위 명확
- 실패 목록이 사람의 개입 큐가 됨
12. 환경변수
| 분류 | 대표 변수 |
|---|---|
| 인증과 공급자 | CLAUDE_CODE_USE_BEDROCK, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL |
| 네트워크 | HTTPS_PROXY, NO_PROXY, NODE_EXTRA_CA_CERTS |
| 모델과 사고 | ANTHROPIC_MODEL, MAX_THINKING_TOKENS |
| 기능 스위치 | DISABLE_*, CLAUDE_CODE_SIMPLE, CLAUDE_CODE_SAFE_MODE |
| 관측 | CLAUDE_CODE_ENABLE_TELEMETRY, OTEL_* |
| 디렉터리 | CLAUDE_PROJECT_DIR, CLAUDE_PLUGIN_ROOT |
| 기록 | CLAUDE_CODE_SKIP_PROMPT_HISTORY, Debug 로그 경로 |
Bedrock
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=ap-northeast-2네트워크
export HTTPS_PROXY=http://proxy.corp.example:8080
export NO_PROXY=localhost,127.0.0.1,.corp.example
export NODE_EXTRA_CA_CERTS=/etc/ssl/certs/corp-root-ca.pemTLS 검증을 무력화하는 NODE_TLS_REJECT_UNAUTHORIZED=0은 사용하지 않는다.
OpenTelemetry
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
export OTEL_RESOURCE_ATTRIBUTES=department=platformCI Job 정보를 OTEL_RESOURCE_ATTRIBUTES에 넣으면 파이프라인별 이벤트와 비용을 구분할 수 있다.
점검
env |
grep -iE 'claude|anthropic|otel|aws_region' |
sort최종 적용 구성은 Claude Code의 /status에서 확인한다.
보안 원칙:
- 키 실값을 셸 rc 파일에 저장하지 않음
- 가능하면 OIDC와 자격 증명 helper 사용
- 조직 표준은 managed 설정으로 배포
- 개인 실험은 현재 셸 세션에만 적용
- CI와 Debug 로그의 시크릿 마스킹 확인
13. 디버깅
진단 순서
- 최소 재현 명령을 만든다.
--verbose로 턴 출력을 확인한다.--debug로 필요한 로그를 켠다.claude doctor와claude auth status를 실행한다.--safe-mode로 커스터마이징 문제인지 구분한다.--bare또는 새 디렉터리에서 최소 환경으로 재현한다.
각 단계에서 가능한 원인 범위를 절반씩 줄이는 것이 목적이다.
Debug 로그
claude --debug "api,hooks" -p "작업 요청"
claude --debug "!statsig,!file" -p "작업 요청"
claude --debug-file /tmp/claude-debug.log -p "작업 요청"CI에서는 실패했을 때만 Debug 로그를 아티팩트로 보존하는 방식이 적합하다.
Safe Mode 이분법
--safe-mode에서 문제가 사라지면 커스텀 계층에 원인이 있다.
- 훅 비활성화
- MCP 설정 제한
- 스킬과 CLAUDE.md를 나눠 복구
- 최근 변경부터 확인
--safe-mode에서도 재현되면 코어 실행, 인증, 네트워크, 버전을 확인한다.
판정형 진단
claude doctor
claude auth status --text
claude auth status || {
echo "auth missing"
exit 1
}Headless에서 자주 발생하는 문제
| 증상 | 가능 원인 | 대응 |
|---|---|---|
| 출력 없이 오래 걸림 | 권한 확인 대기 | --allowed-tools 보강 |
| 결과가 잘림 | Stream 미수집, 파이프 버퍼 | JSON 봉투로 수신 |
| 턴 상한에 자주 걸림 | 상한 과소 | p95 재측정, 작업 분할 |
| 로컬 성공, CI 실패 | 설정 소스와 환경 차이 | --setting-sources 고정 |
| 세션을 찾지 못함 | 다른 프로젝트 디렉터리 | 같은 경로 또는 이름 재개 |
| 훅이 실행되지 않음 | --bare 사용 | --bare 제거 |
문제를 외부에 전달할 때 준비할 재현 번들:
- Claude Code 버전
- 최소 재현 명령
- Debug 로그
claude doctor결과
14. 실무 적용 로드맵

| 기간 | 적용 범위 | 예시 |
|---|---|---|
| 1~2주 | 개인 자동화 | 일일 보고서 또는 트리아지 한 종류 |
| 3~6주 | 팀 CI | PR 리뷰 Job, 비용 집계 |
| 7~12주 | 확장 | 배치 마이그레이션, Routines 이전 |
마무리
Chapter 5의 핵심은 Claude Code 명령을 cron이나 CI에 넣는 것만으로 자동화가 완성되지 않는다는 점이다.
운영 가능한 자동화가 되려면 다음 조건이 함께 필요하다.
- 입력과 출력 형식이 명확해야 한다.
- JSON Schema와 exit code로 결과를 판정해야 한다.
- 턴, 예산, 도구 권한에 상한이 있어야 한다.
- 실패 결과와 실행 비용을 기록해야 한다.
- 사람이 다시 개입할 수 있는 실패 큐가 있어야 한다.
Claude Code 자동화도 일반적인 운영 시스템과 같다. 정상 실행보다 실패했을 때 멈추고, 기록하고, 다시 이어갈 수 있는 구조가 더 중요하다.
