Skip to main content

Claude Code Deep Dive — CLI Reference, Headless, 세션제어, 자동화 파이프라인

해당 포스팅은 현재 재직중인 회사에 관련이 없고, 개인 역량 개발을 위한 스터디 자료로 활용할 예정입니다.

들어가며

이 글에서는 Claude Code의 100여 가지 플래그, 헤드리스 파이프라인, 세션 관리, 스케줄 자동화, CI/CD 통합, 자동화 패턴, 환경변수, 디버깅까지 정리합니다. 본문의 기본 골격은 AWS Korea가 공개한 Claude Code Deep Dive Workshop의 Chapter 5이고, 거기에 두 개의 교육 과정에서 학습한 내용을 덧붙였습니다.

인용한 자료무엇인가본문 표기
Claude Code Deep Dive WorkshopAWS Korea가 GitHub에 공개한 실습 워크샵Chapter 5
Claude Code in ActionAnthropic 공식 온라인 교육 과정 (Skilljar 플랫폼)Lesson NEW-06 등
Claude Code on Amazon BedrockAWS Skill Builder의 온라인 학습 프로그램Module 8 등

중간에 "보충"으로 표시한 절은 워크샵 본문 밖에서 가져온 내용입니다. 어느 과정의 어느 차시에서 온 것인지 절 머리에 적어 두었고, 링크를 포함한 전체 목록은 맨 아래 References에 있습니다.

Ch.1~4가 "대화형의 세계"였다면, Ch.5는 **"CLI 자동화의 세계"**입니다. -p 한 글자가 대화형과 무인 파이프라인 사이의 스위치이며, Ch.4에서 만든 설정 자산(Permissions, Hooks, MCP)이 무인 환경에서도 그대로 동작합니다.


목차

  1. claude 명령과 플래그
  2. Headless 심화
  3. 세션 제어
  4. 스케줄과 자동실행
  5. CI/CD 통합
  6. 자동화 패턴
  7. 환경변수
  8. 디버깅
  9. Recap & Labs
  10. References

1. claude 명령과 플래그

해결하는 문제: "100개 넘는 플래그를 어떻게 분류하고, 어떤 조합을 쓰면 되는가?"

명령 구조

$ claude # 대화형 세션
$ claude "explain this project" # 초기 프롬프트로 시작
$ claude -p "query" # 실행 후 종료 (headless)
$ cat logs.txt | claude -p "explain" # 파이프 입력
$ claude -c # 이 디렉토리 최근 대화 계속
$ claude -r "auth-refactor" "Finish this PR" # 이름으로 세션 재개

서브커맨드 한눈에 보기

분류서브커맨드용도
계정/설치auth login/logout/status, setup-token, update, doctor, project purge인증, 설치, 진단, 정리
운영agents, attach, logs, stop, respawn, rm, daemon, remote-control백그라운드/원격 세션 관리
확장mcp login/logout, gateway --config, ultrareview, plugin, importMCP 인증, 게이트웨이, 심층리뷰, 플러그인, 타 에이전트 설정 가져오기
인프라self-hosted-runner setup/doctor/orchestrator, auto-mode defaults/reset자체 호스팅 러너, auto mode 설정

💡 오타를 쳐도 근접 서브커맨드를 제안합니다: claude udpate → "Did you mean claude update?"

플래그 6분류 체계

분류대표 플래그해결하는 문제
동작 모드-p, --bg, --remote, --worktree, --bare, --safe-mode, --remote-control세션이 어디서 어떻게 뜨는가
세션-c, -r, --from-pr, --fork-session, -n, --autocompact맥락을 이어가거나 분기, 자동 compact
모델과 사고--model, --effort, --fallback-model, --advisor, --teammate-mode지능과 비용의 조절, 팀메이트 표시
권한과 도구--permission-mode, --tools, --allowed/disallowedTools, --disable-slash-commands무인 실행의 능력 범위
구성과 확장--settings, --agents, --mcp-config, --plugin-dir, --strict-mcp-config세션별 설정 오버레이
출력과 진단--output-format, --json-schema, --input-format, --verbose, --debug결과 형식과 관측

모델 플래그 상세

$ claude --model opus # 별칭 사용
$ claude --effort high # low..max (모델별 상이)
$ claude --fallback-model sonnet,haiku # 과부하 시 순차 시도
$ claude --advisor opus # 어드바이저 도구 활성
# 우선순위: 플래그 > ANTHROPIC_MODEL > settings

권한과 도구 플래그

$ claude --permission-mode plan # 6모드 중 선택 (Ch.4)
$ claude -p --allowed-tools "Bash(git log *)" "Read" # 무확인 허용
$ claude --disallowedTools "Edit" # 도구 자체 제거
$ claude --disallowedTools "mcp__*" # 전 MCP 도구 제거
$ claude --tools "Bash,Edit,Read" # 내장 도구만 한정

**왜 **--disallowedTools가 두 가지 역할인가? 베어이름("Edit")은 도구를 컨텍스트에서 완전 제거하고, 스코프 규칙("Bash(rm *)")은 도구는 유지하되 해당 호출만 거부합니다.

--bare vs --safe-mode

속성--bare--safe-mode
목적속도 (스크립트 가속)진단 (고장 원인 이분)
비활성화훅, 스킬, 플러그인, MCP, CLAUDE.md전 커스터마이즈
유지Bash, 읽기, 편집 도구managed 정책, 인증, 권한
사용 장면-p 반복 호출의 기동 시간 절약커스텀이 원인인지 이분 판정

보충: v2.1 이후 추가된 주요 플래그

📕 출처: Anthropic 공식 문서 CLI Reference — References [6]

워크샵 이후 추가되거나 변경된 플래그 중 실무에서 유용한 것들입니다:

플래그용도비고
--remote-control, --rc세션에 Remote Control을 활성화하여 Claude.ai/모바일에서도 제어서버 모드는 claude remote-control 서브커맨드
--autocompact <auto | tokens>세션 자동 compact 윈도우 설정설정 파일 변경 없이 세션 단위
--teammate-mode팀메이트(sub-agent) 표시 방식: in-process(기본), auto, tmux, iterm2병렬 에이전트 모니터링
--input-format-p 입력 형식 지정: text(기본) 또는 stream-json프로그래밍적 입력 처리
--strict-mcp-config--mcp-config로 지정한 MCP 서버만 사용, 나머지 전부 무시CI에서 MCP 환경 격리
--disable-slash-commands모든 스킬과 슬래시 명령 비활성무인 실행의 공격 면적 축소
--forward-subagent-text서브에이전트의 텍스트/thinking을 출력 스트림에 포함디버깅, 관측
--append-subagent-system-prompt모든 서브에이전트 시스템 프롬프트에 텍스트 추가서브에이전트 규칙 일괄 적용
--prompt-suggestions각 턴 후 다음 프롬프트 예측 메시지 방출IDE 통합
--cwd <path>claude agents에서 특정 디렉터리의 세션만 표시멀티 프로젝트 관리

⚠️ --enable-auto-mode는 v2.1.111에서 제거되었습니다. Auto mode는 이제 Shift+Tab 순환에 기본 포함되며, --permission-mode로 제어합니다.

📌 Permission mode는 현재 6개: plan, default, acceptEdits, auto, dontAsk, bypassPermissions. 워크샵의 autoEdit/fullAuto는 각각 acceptEdits/auto로 이름이 변경되었습니다.

조합 관용구 5선

# 1. CI 리뷰: 예산과 도구를 잠근 헤드리스
claude -p --max-budget-usd 2 --allowed-tools "Read" "Grep" ...

# 2. 빠른 배치: 최소 기동 + 저비용 모델
claude --bare -p --model haiku "..."

# 3. 격리 실험: PR 분기 워크트리
claude -w '#123' --permission-mode plan

# 4. 세션 재현: 소스 고정 + 오버레이
claude --setting-sources project --settings ./ci.json -p "..."

# 5. 무인 야간: dontAsk + 폴백 체인
claude -p --permission-mode dontAsk --fallback-model sonnet,haiku "..."


2. Headless 심화

해결하는 문제: "-p로 어떻게 파이프라인을 만들고, 결과를 구조화하며, 비용을 제어하는가?"

-p의 본질

-p는 단순 출력 모드가 아닙니다. Agent SDK 경로를 타는 단발 에이전트 실행입니다. 도구, 훅, 설정이 모두 살아있는 채로 결과만 표준출력에 남깁니다.

계약채널용도
결과stdout본문 또는 JSON 응답
진단stderr에러, 경고, 훅 메시지
판정exit code0=성공, 비0=실패/상한도달

입력 6경로

claude -p "직접 인자" # 1. 인자
cat error.log | claude -p "원인 분석" # 2. 파이프
claude -p "$(cat prompt.txt)" # 3. 명령 치환
claude -p "요약해" < notes.md # 4. 리다이렉트
claude -p <<'EOF' # 5. 히어독
여러 줄 지시문 ...
EOF
claude -c -p "이어서 리팩토링" # 6. 세션 이어받기

💡 파이프(stdin) = 데이터, 인자 = 지시. 이 분리를 이해하면 스크립트 설계가 깔끔해집니다.

Exit Code 계약

claude -p "테스트 실패 원인을 찾아 수정" --max-turns 15
case $? in
0) echo "OK" ;;
*) echo "FAIL (code $?)" ; exit 1 ;;
esac

exit code의미활용
0정상 완료파이프라인 다음 단계 진행
비0오류, 상한 도달 등게이트 차단, 알람 발송
auth status: 0/1로그인/미로그인CI 전제조건 확인
ultrareview: 0/1통과/발견PR 머지 게이트

--output-format json

$ claude -p "고위험 파일 3개" --output-format json
{
"type": "result",
"subtype": "success",
"result": "1. src/auth/... (본문)",
"session_id": "...",
"total_cost_usd": 0.0284,
"num_turns": 4,
"duration_ms": 21033,
"usage": { "input_tokens": ..., "output_tokens": ... }
}

필드용도
.result본문 텍스트
.total_cost_usd비용 관측
.session_id세션 재개 키
.is_error오류 여부 분기

stream-json 이벤트 순서

순서type내용
1system세션 시작, 모델/도구 목록
2~Nassistant모델 응답 메시지 단위
2~Nuser (tool_result)도구 실행 결과 반환
마지막result최종 결과 (json과 동일)

추가 옵션: --include-partial-messages (토큰 단위), --include-hook-events (훅 수명주기)

--json-schema 구조화 출력

"파싱에서 계약으로" — 자유 텍스트를 jq로 파싱하는 대신, 스키마로 출력 형식을 강제합니다.

claude -p "이 diff의 위험도를 평가해" \
--json-schema '{
"type": "object",
"properties": {
"risk": {"type": "string", "enum": ["low","medium","high"]},
"reason": {"type": "string"},
"block": {"type": "boolean"}
},
"required": ["risk","reason","block"]
}'

SDK에서는 Zod(TypeScript), Pydantic(Python)으로 동일한 스키마를 정의합니다 (Ch.6).

예산과 턴 상한

claude -p "의존성 취약점 정리해 패치 PR 초안까지" \
--max-turns 20 \
--max-budget-usd 3.00

상한기본값설계 요령
--max-turns무제한파일럿 실측 p95의 1.5배로 시작
--max-budget-usd무제한초과 종료는 실패가 아니라 신호

⚠️ 무인 실행에서 상한 미지정은 금지입니다. 상한 없으면 비용이 발산할 수 있습니다.

캐시 최적화

claude -p --exclude-dynamic-system-prompt-sections \
"이 모듈의 순환 의존을 정리해"

시스템 프롬프트의 기기별 섹션(작업 경로, 환경 정보)이 캐시를 깨뜨립니다. 이 플래그는 동적 섹션을 첫 사용자 메시지로 이동시켜, 여러 사용자/기계가 같은 작업을 돌릴 때 프롬프트 캐시 적중률을 높입니다.

에러 처리와 재시도 골격

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이 모델 과부하의 1차 방어이고, 재시도 함수는 일시 오류 한정 2차 방어입니다.


3. 세션 제어

해결하는 문제: "대화를 어디에 저장하고, 어떻게 이어가며, 분기하고, 웹으로 넘기는가?"

세션 저장 구조

항목상세
저장 위치~/.claude/projects/ 아래 프로젝트별 JSONL
기본 수명30일 자동 정리 (cleanupPeriodDays, Ch.4)
저장 끄기-p--no-session-persistence, 전 모드는 env 변수
일괄 정리claude project purge (--dry-run으로 예행)

continue vs resume

-c / --continue-r / --resume
동작현재 디렉토리 최근 대화 직행ID 또는 이름으로 특정 재개
범위add-dir로 얹은 세션 포함현 프로젝트 + 워크트리 한정 검색
헤드리스-c -p로 이어받기 가능인자 없이는 대화형 픽커
용도일상 복귀의 기본기명명된 세션, bg 세션 재개

--from-pr

$ claude --from-pr 123
$ claude --from-pr https://github.com/org/repo/pull/123

Claude가 만든 PR은 세션과 자동 링크됩니다. 리뷰어 코멘트 대응 흐름: 코멘트 확인 → claude --from-pr 123 → 그 PR을 만든 맥락 그대로 후속 수정.

GitHub, GitHub Enterprise, GitLab MR, Bitbucket PR URL 모두 수용합니다.

fork와 session-id

# 원본 보존 분기: 재개하되 새 세션 ID로
$ claude --resume auth-refactor --fork-session

# 고정 좌표: 스크립트가 세션 ID를 소유
$ SID=$(uuidgen)
$ claude -p --session-id "$SID" "1단계: 스캔"
$ claude -p --resume "$SID" "2단계: 스캔 결과로 수정"

대화형의 /fork와 동일한 개념이 CLI에서는 --fork-session으로 구현됩니다.

체크포인트와 Rewind

방법용도
/undo마지막 턴 되돌리기
/rewind NN턴 전으로 이동
Git checkpoint파일 변경 시점별 자동 스냅샷
--fork-session분기점 보존 후 실험

웹 왕복 (Remote / Teleport)

# 로컬에서 웹 세션 생성
$ claude --remote
# → URL 반환, 브라우저에서 이어서 작업

# 웹에서 만든 세션을 로컬로 가져오기
$ claude --teleport <session-id>

Remote Control

역할동작
로컬 → 웹--remote로 URL 발급
웹 → 로컬--teleport로 가져오기
용도모바일에서 확인, 팀원에게 세션 공유

4. 스케줄과 자동실행

해결하는 문제: "반복 작업을 어떤 방식으로 실행할지, Routines와 cron의 차이는 무엇인가?"

자동화 실행 방식 5종

실행 방식트리거인프라제어 수준
/loop세션 안 반복 지시로컬대화형
/goal조건 도달 판정로컬대화형
RoutinesCron / HTTP POST / GitHub 이벤트Anthropic 클라우드최소 구축
cron + -pcrontab내 서버완전 통제
CI/CDPR, push, scheduleGitHub/GitLab Runner이벤트 기반

보충: Routines 상세

📕 출처: Anthropic 공식 교육 과정 「Claude Code in Action」 Lesson NEW-06 (Routines & Headless) — References [2]

핵심: Routines = 저장된 프롬프트 + 레포 + 커넥터 + 트리거 → 클라우드에서 실행

구성 요소설명
PromptClaude에게 할 일을 지시
Repository작업할 레포
Connectors필요한 외부 연결
Trigger언제 실행할지

만드는 방법 2가지:

  • Web: claude.ai/code/routines — 이름, 지시, 레포, 트리거 선택
  • 터미널: /schedule daily dependency audit at 9am

⚠️ 3가지 제한 사항:

제한설명
Research Preview동작과 제한이 계속 변할 수 있음
최소 1시간 간격더 자주 필요하면 cron 사용
기본 브랜치 클론 + claude/ 접두사 브랜치만 pushmain을 덮어쓰지 못하도록 하는 가드레일
claude://open?prompt=이+프로젝트를+설명해줘&cwd=/path/to/project

런북, Notion, 위키에 임베드하면 클릭 한 번으로 Claude Code 세션 진입.

--bg와 --exec

# 백그라운드로 Claude 세션 기동
$ claude --bg "flaky 테스트 원인 조사"
# → 세션 ID 반환, 터미널 즉시 복귀

$ claude logs 7c5dcf5d # 진행 확인
$ claude attach 7c5dcf5d # 터미널로 가져오기

# 셸 명령을 PTY 잡으로
$ claude --bg --exec 'pytest -x'

⚠️ --bg-p는 병용 불가합니다 (v2.1.198 규칙).

cron + headless 레시피

# crontab -e
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/home/dev/.local/bin

# 매일 07:00 의존성 감사
0 7 * * 1-5 cd /home/dev/payments && \
./scripts/nightly-deps-audit.sh >> ~/logs/deps.log 2>&1

cron 3대 함정:

  1. PATH가 빈약 → 반드시 명시
  2. 인증 만료 → Bedrock SSO 헬퍼/역할 설정 (Ch.3)
  3. 실패 알람 없음 → 스크립트 내 exit 게이트 + notify

5. CI/CD 통합

해결하는 문제: "이벤트 기반으로 Claude를 부르되, 묻지 않고 / 넘치지 않고 / 흔적을 남기려면?"

비대화 3원칙

원칙구현왜?
P1: 묻지 않는다-p + --allowed-tools 명시, 확인 프롬프트 원천 제거무인 환경에 프롬프트 대기 불가
P2: 넘치지 않는다--max-turns, --max-budget-usd, 모델 하향 기본비용 발산 방지
P3: 흔적을 남긴다--output-format json 저장, 아티팩트 업로드감사, 디버깅 재료

CI 인증 전략

방식설명장기 시크릿
AWS OIDC (권장)역할 인수 + Bedrock0개
구독 조직claude setup-token으로 장기 토큰1개 (시크릿 저장소)
API 조직ANTHROPIC_API_KEY 시크릿1개
게이트웨이 조직BASE_URL + 서비스 자격1개

🔑 공통 원칙: 잡 권한 최소화, 키는 마스킹 로그, 포크 PR 실행 주의.

GitHub Actions 기본 골격

# .github/workflows/audit.yml
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: ${{ vars.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.sh

PR 리뷰 잡

on: { pull_request: { types: [opened, synchronize] } }
# ... checkout(fetch-depth: 0), 인증, 설치 생략 ...
- name: Review
run: |
git diff origin/${{ github.base_ref }}...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.json # 게이트

보충: 관리형 대안 — Managed Code Review

📕 출처: Anthropic 공식 교육 과정 「Claude Code in Action」 Lesson NEW-07 (GitHub Actions and Code Review) — References [3]

항목관리형 Code ReviewDIY GitHub Action
설정켜기만 하면 됨워크플로우 직접 구성
범위PR 리뷰 (코멘트만)리뷰 이상의 모든 것 (구현, 보고, 스케줄)
특징전체 코드베이스 맥락, 인라인 코멘트, 중복 제거완전 제어
제한승인/차단 불가, autofix 없음

💡 관리형 서비스부터 시작하세요. Claude가 CI에서 실제로 "무언가를 해야 하는" 순간 Action으로 이동.

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 # -p + 상한 + 스키마 동일
artifacts: { paths: [review.json], when: always }

같은 원칙, 다른 문법. 스크립트를 재사용하면 CI 플랫폼은 부차 변수입니다.

--init 준비 훅

{ "hooks": { "Setup": [
{ "matcher": "init",
"hooks": [{ "type": "command",
"command": "npm ci && cp .env.ci .env" }]
}
] } }

# CI 스텝에서:
- run: claude -p --init "테스트 실패를 조사해 수정"
# → -p 실행 전에 init 매처 Setup 훅이 선행

비용 통제 다이얼

수단설명
--max-budget-usd호출 단위 달러 상한
--max-turns턴 수 제한
모델 하향리뷰/분류는 sonnet/haiku 기본
paths 필터발동 조건 축소 (docs 변경은 스킵)
--exclude-dynamic...캐시 적중률 향상
Gateway 한도조직 수준 안전망 (Ch.3)

6. 자동화 패턴

해결하는 문제: "현장에서 검증된 자동화 스크립트 패턴은 무엇인가?"

Pattern 1: 이슈 트리아지

#!/usr/bin/env bash
set -uo pipefail
N=$1
gh issue view "$N" --json title,body > issue.json
OUT=$(claude --bare -p "issue.json을 분류해" \
--model haiku --max-turns 6 \
--json-schema "$(cat .ci/triage-schema.json)") || exit 1
LABEL=$(echo "$OUT" | jq -r '.category')
gh issue edit "$N" --add-label "$LABEL"
echo "$OUT" | jq -r '.summary' | gh issue comment "$N" -F -

안전선: 닫기 금지, 제안까지만. 확정은 사람.

Pattern 2: 로그 분석 (map-reduce)

왜 map-reduce인가? 대량 로그를 통째로 넣으면 토큰 비용이 폭발합니다. 셸이 압축/분할을, Claude가 해석/상관을 맡는 분업이 비용과 품질을 동시에 지킵니다.

Pattern 3: 일일 보고서

#!/usr/bin/env bash
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로 팀 브리핑: 요약, 리스크, 오늘 볼 것 3" \
--max-turns 8 --max-budget-usd 0.50 > report.md

curl -s -X POST "$SLACK_WEBHOOK" \
-d "$(jq -n --rawfile t report.md '{text:$t}')"

Pattern 4: 문서 파이프라인

# 변경된 모듈만 문서 재생성
for m in $(git diff --name-only HEAD~1 | grep '^src/' | cut -d/ -f2 | sort -u); do
claude -p "src/$m 모듈의 API 문서를 docs/$m.md로 갱신" \
--allowed-tools "Read" "Grep" "Write(./docs/**)" \
--max-turns 10
done

# 한영 병행: 갱신분만 번역
for f in $(git diff --name-only -- docs/*.md); do
claude --bare -p "기술 용어를 보존해 영어로 번역" \
< "$f" > "docs/en/$(basename $f)"
done

Pattern 5: 배치 마이그레이션

for f in $(cat targets.txt); do
grep -qx "$f" done.txt 2>/dev/null && continue
claude -p "$f를 신규 ORM API로 마이그레이션" \
--allowed-tools "Read" "Edit" "Bash(npm run test *)" \
--max-turns 12 || { echo "$f" >> failed.txt; git checkout -- "$f"; continue; }
npm run test -- --related "$f" || { echo "$f" >> failed.txt; git checkout -- "$f"; continue; }
git add "$f" && git commit -m "migrate: $f"
echo "$f" >> done.txt
done

핵심 설계: 파일 1개 = 변환 + 테스트 + 커밋 원자 단위. 실패 시 git checkout으로 원복하고 failed.txt에 기록 → 배치가 멈추지 않고 사람이 나중에 개입.

보충: 검증 3단계

📕 출처: Anthropic 공식 교육 과정 「Claude Code in Action」 Lesson NEW-08 (Verifying Unsupervised Runs) — References [4]

단계방법원칙
1. Diff 우선/code-review + git diff요약이 아닌 변경 자체를 읽기
2. 테스트 게이트PostToolUse Hook → exit 2신뢰가 아닌 와이어링으로 강제
3. Cold Second Opinion새 세션/sub-agent로 맥락 없이 리뷰확증 편향 차단

감시하지 않을수록 더 많이 검증합니다.


7. 환경변수

해결하는 문제: "어떤 환경변수가 있고, 어떻게 점검하며, 보안 원칙은 무엇인가?"

7칸 분류표

분류대표 변수용도
인증ANTHROPIC_API_KEY, CLAUDE_CODE_USE_BEDROCK, AWS_PROFILE공급자 선택과 자격
네트워크HTTPS_PROXY, HTTP_PROXY, NO_PROXY프록시, 방화벽 우회
모델/사고ANTHROPIC_MODEL, CLAUDE_CODE_MAX_MODEL기본 모델, 상한 모델
기능 스위치CLAUDE_CODE_SIMPLE, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICbare 모드, 텔레메트리
관측CLAUDE_CODE_ENABLE_TELEMETRY, OTEL_EXPORTER_OTLP_ENDPOINTOTel, 비용 추적
디렉토리/기록CLAUDE_CONFIG_DIR, CLAUDE_TRANSCRIPT_DIR설정/기록 위치 재정의
기록CLAUDE_CODE_SESSION_PERSISTENCE세션 저장 제어

점검 원라이너

# 인증 상태 확인
claude auth status --text && echo "OK" || echo "NOT LOGGED IN"

# Bedrock 연결 확인
CLAUDE_CODE_USE_BEDROCK=1 claude -p "hello" --max-turns 1 2>&1 | head -1

# 프록시 적용 확인
env | grep -i proxy

보안 원칙

원칙설명
시크릿은 env에만settings.json에 API 키를 넣지 말 것
CI에서는 Secrets 저장소GitHub Secrets, AWS Secrets Manager 등
로그 마스킹--output-format json의 result에 키가 새지 않도록
최소 권한필요한 변수만 export, 나머지는 unset

8. 디버깅

해결하는 문제: "Claude Code가 이상하게 동작할 때, 어떤 순서로 진단하는가?"

진단 흐름 6단

단계명령목적
1. 재현동일 프롬프트 재실행일시 오류 배제
2. verbose--verbose턴 단위 전체 출력 확인
3. debug--debug tool,permission,hook카테고리별 필터 진단
4. doctorclaude doctor환경 자동 진단 + 수정 제안
5. safe-mode--safe-mode전 커스터마이즈 비활성 → 이분 판정
6. bare/격리--bare 또는 새 디렉토리최소 환경에서 재현 여부

--debug 카테고리

claude --debug tool,permission,hook,mcp -p "test"
# 쉼표로 여러 카테고리 동시 활성
# --debug-file ./debug.log 로 파일 출력도 가능

카테고리출력 내용
tool도구 호출/결과 상세
permission허용/차단 판정 경로
hook훅 매칭, 실행, exit code
mcpMCP 서버 통신
model모델 선택, 폴백
session세션 로드/저장

헤드리스 전용 이슈

증상원인해결
무한 대기확인 프롬프트 발생--allowed-tools 또는 --permission-mode dontAsk
예상 외 종료--max-turns 도달상한 상향 또는 작업 분할
빈 출력exit 비0 + stderr에 에러2>err.log 후 확인
비용 폭발상한 미설정 + 루프--max-budget-usd 필수 지정

9. Recap & Labs

핵심 요약 표

Part한 줄 핵심
1. 명령과 플래그서브커맨드 2계열 + 플래그 6분류로 전체 정리
2. Headless-p는 SDK 경유 단발 에이전트, 구조화 출력으로 계약
3. 세션 제어어디서든 이어가고(-c/-r), 분기하고(fork), 웹으로 넘기기(remote)
4. 스케줄실행 방식 5종: /loop, /goal, Routines, cron, CI
5. CI/CD3원칙: 묻지 않고, 넘치지 않고, 남긴다
6. 자동화 패턴트리아지, 로그분석, 보고서, 문서, 배치 — 5패턴
7. 환경변수7칸 분류, 점검 원라이너, 시크릿은 env에만
8. 디버깅6단 진단: 재현→verbose→debug→doctor→safe-mode→bare

FAQ 6가지

QA
-p에서 CLAUDE.md 적용되나?--bare 없으면 적용됨. --bare는 건너뜀
--max-turns 초과하면?오류 exit code로 종료, 결과 없음
Routines와 cron 차이?Routines=Anthropic 인프라(서버 불필요), cron=내 서버(완전 통제)
--from-pr-w 차이?--from-pr=맥락 복원, -w=코드 격리(워크트리)
CI에서 비용 상한 없으면?무한 루프 가능 → 반드시 --max-budget-usd 지정
stream-json은 언제?실시간 진행 UI가 필요할 때 (타자기 효과, 진행률 표시)

실습 3종

Lab주제핵심 확인소요
Lab 1Headless 파이프라인-p, JSON 응답, --json-schema, exit code, 예산 상한~10분
Lab 2세션 제어-c, -r, session-id, fork-session, 저장 구조~10분
Lab 3자동화 스크립트배치 분석, 재시도 골격, 일일 보고서~15분

Lab 1: Headless 파이프라인

목표: -p의 본질(SDK 경유 단발 에이전트)과 구조화 출력, exit code 계약을 확인합니다. 소요 시간: ~10분 사전 준비: claude CLI, jq

Step 1: 실습 프로젝트 준비

mkdir -p ~/lab-ch5 && cd ~/lab-ch5 && git init
echo "const x = 1;" > index.js

Step 2: 기본 -p 실행

claude -p "이 프로젝트에 파일이 몇 개 있는지 알려줘"
# → 텍스트 출력 후 즉시 종료

Step 3: JSON 응답 확인

claude -p "index.js의 역할을 한 줄로 설명해" --output-format json
# → { "type":"result", "result":"...", "total_cost_usd":..., "num_turns":... }

Step 4: jq로 필드 추출

OUT=$(claude -p "이 프로젝트를 한 줄로 요약해" --output-format json)
echo "$OUT" | jq -r '.result' # 본문만
echo "$OUT" | jq '.total_cost_usd' # 비용
echo "$OUT" | jq '.num_turns' # 턴 수

Step 5: --json-schema 구조화 출력

claude -p "index.js를 분석해줘" \
--json-schema '{
"type": "object",
"properties": {
"language": {"type": "string"},
"lines": {"type": "integer"},
"summary": {"type": "string"}
},
"required": ["language", "lines", "summary"]
}'
# → {"language":"JavaScript","lines":1,"summary":"..."} 정확한 구조

🔑 핵심: --json-schema는 "파싱에서 계약으로" 전환합니다. 정규식으로 텍스트를 파싱할 필요가 없습니다.

Step 6: exit code 계약 확인

claude -p "완료" --max-turns 1; echo "Exit: $?"
# → Exit: 0 (정상)

claude -p "index.js를 리팩토링하고 테스트까지 작성해" --max-turns 1; echo "Exit: $?"
# → Exit: 비0 (턴 상한 초과)

Step 7: 파이프 입력 + 예산 상한

# 파이프 입력
cat index.js | claude -p "이 코드의 문제점을 찾아줘"

# 예산 상한
claude -p "이 프로젝트를 완전히 리팩토링해" \
--max-turns 5 --max-budget-usd 0.50
echo "Exit: $?"

검증:

□ --output-format json에서 result, total_cost_usd 필드 확인
□ --json-schema로 정확한 JSON 구조 반환
□ --max-turns 초과 시 비0 exit code
□ 파이프 입력이 프롬프트 컨텍스트로 전달됨


Lab 2: 세션 제어

목표: 대화를 이어가고(-c), 골라잡고(-r), 분기하고(fork), 스크립트가 좌표를 소유하는(session-id) 흐름을 확인합니다. 소요 시간: ~10분 사전 준비: Lab 1 프로젝트 또는 아무 git 저장소

Step 1: 대화형 세션 시작 → 종료

cd ~/lab-ch5
claude
# 세션 안에서:
> 이 프로젝트에 README.md를 만들어줘
> exit

Step 2: -c로 최근 대화 이어받기

claude -c
# → 방금 만든 README.md 맥락이 남아있음
> 방금 만든 README에 설치 방법 섹션 추가해줘
> exit

Step 3: -c -p로 헤드리스 이어받기

claude -c -p "README.md에 License 섹션도 추가해"
# → 이전 대화 맥락 유지한 채 실행 후 종료

Step 4: -r 픽커로 세션 선택

claude -r
# → 대화형 픽커에서 세션 목록 표시, 선택하여 재개

Step 5: session-id 고정 좌표

SID=$(uuidgen)
claude -p --session-id "$SID" "1단계: index.js 분석"
claude -p --resume "$SID" "2단계: 분석 결과 기반으로 개선안 제시"
# → 같은 세션에서 2단계가 1단계 맥락을 이어감

📌 이것이 스크립트 자동화의 핵심입니다: session-id로 좌표를 고정하면 다단계 파이프라인에서 맥락을 유지할 수 있습니다.

Step 6: fork-session (분기)

claude -c
> 이 프로젝트를 TypeScript로 전환할 계획을 세워줘
> exit

# 동일 지점에서 분기
claude -c --fork-session
# → 새 세션 ID로 원본 보존 분기
> 아니야, Python으로 전환하는 걸로 바꿔
> exit

Step 7: 세션 저장 위치 확인

ls ~/.claude/projects/
# → 프로젝트별 디렉터리 존재 확인

검증:

□ -c로 이전 대화 맥락이 유지됨
□ -c -p로 헤드리스에서도 이전 세션 이어감
□ session-id로 스크립트가 세션 좌표를 소유
□ fork-session으로 원본 보존 분기
□ ~/.claude/projects/ 아래 JSONL 존재


Lab 3: 자동화 스크립트

목표: 구조화 출력 + jq 집계 → 배치 분석, 에러 재시도, 일일 보고서까지 자동화 패턴을 구성합니다. 소요 시간: ~15분 사전 준비: Lab 1 프로젝트, jq

Step 1: 실습 파일 준비

cd ~/lab-ch5
mkdir -p src scripts
cat > src/auth.js << 'EOF'
function login(user, pass) {
if (pass === "admin") return true;
return fetch("/api/auth", { body: JSON.stringify({user, pass}) });
}
module.exports = { login };
EOF

cat > src/utils.js << 'EOF'
function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
function retry(fn, n=3) { /* TODO */ }
module.exports = { sleep, retry };
EOF

Step 2: 배치 분석 (다중 파일 → 구조화 출력 → 집계)

for f in src/*.js; do
claude --bare -p "이 파일의 보안 위험도를 평가해" \
--max-turns 6 --max-budget-usd 0.30 \
--json-schema '{
"type":"object",
"properties":{
"file":{"type":"string"},
"risk_score":{"type":"number"},
"top_issue":{"type":"string"}
},
"required":["file","risk_score","top_issue"]
}' < "$f"
done | jq -s 'sort_by(-.risk_score)' > report.json

echo "=== 보안 분석 결과 ==="
jq -r '.[] | "[\(.risk_score)] \(.file): \(.top_issue)"' report.json

🔑 --bare로 훅/MCP 탐색을 건너뛰어 기동 시간을 절약합니다. 배치에서는 파일 수만큼 기동하므로 차이가 큽니다.

Step 3: 에러 처리 + 재시도 골격

cat > scripts/run-claude.sh << 'EOF'
#!/usr/bin/env bash
set -uo pipefail

run_claude() {
local prompt="$1" schema="$2" attempt=1
while [ $attempt -le 3 ]; do
OUT=$(claude --bare -p "$prompt" \
--output-format json \
--json-schema "$schema" \
--max-turns 10 --max-budget-usd 1.00 \
2>err.log) && {
echo "$OUT" | jq -r '.result'; return 0
}
grep -qiE 'rate|overloaded|529' err.log || break
echo "재시도 $attempt/3..." >&2
sleep $((attempt * 20))
attempt=$((attempt + 1))
done
return 1
}
EOF
chmod +x scripts/run-claude.sh

Step 4: 일일 보고서 (간이 버전)

cat > scripts/daily-summary.sh << 'EOF'
#!/usr/bin/env bash
set -uo pipefail
cd ~/lab-ch5

# 수집: 최근 커밋
git log --oneline -10 > digest.txt

# 서술: Claude가 요약
claude -p "digest.txt를 보고 팀 브리핑을 작성해: 요약, 주요 변경, 오늘 볼 것" \
--max-turns 8 --max-budget-usd 0.50 > daily-report.md

echo "=== 일일 보고서 생성 완료 ==="
cat daily-report.md
EOF
chmod +x scripts/daily-summary.sh

# 실행 테스트
git add -A && git commit -m "lab files"
bash scripts/daily-summary.sh

검증:

□ report.json에 파일별 risk_score + top_issue 구조화 데이터
□ jq -s로 배열 집계 + 정렬 동작
□ --bare로 기동 시간 단축 체감
□ daily-report.md 생성 완료


References

1차 출처 (본문 작성 기반)

#출처상세
[1]Claude Code Deep Dive Workshop — Chapter 5: CLI ReferenceAWS Korea, 2026.07. Choi WooHyung PSA
[2]Anthropic 공식 교육 — Claude Code in Action: Routines & HeadlessAnthropic Skilljar 과정
[3]Anthropic 공식 교육 — Claude Code in Action: GitHub Actions and Code ReviewAnthropic Skilljar 과정
[4]Anthropic 공식 교육 — Claude Code in Action: Verifying Unsupervised RunsAnthropic Skilljar 과정
[5]AWS Bedrock Online Program — Claude Code on Bedrock: Automation and ScalingAWS

2차 출처 (교차 검증)

#출처상세
[6]Anthropic Docs — CLI Referencedocs.anthropic.com/en/docs/claude-code/cli-reference
[7]Anthropic Docs — GitHub Actionsdocs.anthropic.com/en/docs/claude-code/github-actions
[8]GitHub — anthropics/claude-code-actiongithub.com/anthropics/claude-code-action
[9]Claude Code Deep Dive — Ch.3 Admin SetupGateway, OIDC, 비용 통제 참조
[10]Claude Code Deep Dive — Ch.4 SettingsHooks, Permissions, MCP 참조