code.claude.com 공식 레퍼런스 전 페이지 — CLI · Commands · Env vars · Tools · Interactive mode · Checkpointing · Hooks · Plugins · Channels — 를 실행 모드 축으로 재구성했다. 첫 발견부터 정정이다: Claude Code의 실행 모드는 2개가 아니라 3개다.
CLI reference를 정독하면 claude(대화형)와 claude -p(헤드리스) 사이에 네이티브 백그라운드 세션 계층(--bg · claude agents · attach/logs/respawn)이 따로 있다. 하네스들이 nohup·tmux·lock으로 손수 짓는 것의 공식 등가물이며, --bg와 -p는 결합이 금지된 별개 모드다.
커스텀 명령은 이제 스킬로 통합됐고(한 메시지에 최대 6개 체이닝), 슬래시 명령의 헤드리스 지원은 v2.1.205+에서 "인자 직접 지정 + 픽커 없음" 형태만 열렸다.
| 축 | 대화형에서만 | 헤드리스(-p)에서도 |
|---|---|---|
| 슬래시 명령 | 픽커·다이얼로그형 전부 — /rewind /resume /diff /plan /permissions |
/config key=value · /model <인자> · /effort · /mcp(텍스트 요약) · /color · /fast |
| 권한 처리 | 프롬프트 UI + Shift+Tab 모드 사이클 | --permission-prompt-tool(MCP 위임, 30s 대기) 또는 bypass — 블랭킷 우회가 유일한 길이 아니다 |
| 상한 | 없음 (사람이 중단) | --max-turns · --max-budget-usd — 프로세스 내부 상한 공식 지원 |
| 세션 영속 | 항상 저장 + 체크포인트 동반 | --no-session-persistence로 무흔적 실행 선택 가능 |
| 구조화 출력 | — | --json-schema · --output-format stream-json · --include-hook-events |
--exclude-dynamic-system-prompt-sections는 문서에 "-p 스크립트·멀티유저 워크로드에 권장"으로 명시돼 있다. 이 세션에서 실측된 스폰 실패("Prompt is too long" — 대형 동적 주입 상속)의 공식 완화 수단이 이미 존재했다는 뜻이다.
"모든 하위 프로세스에 설정 — IDE 터미널 포함"
"중첩 세션의 공식 판별자"
| 사실 | 대화형 | 헤드리스(-p) |
|---|---|---|
| API 키 사용 | ANTHROPIC_API_KEY 사용 전 1회 승인 프롬프트 |
무언 사용 — 구독을 조용히 덮어씀 |
| 백그라운드 태스크 | 턴을 넘어 지속 (Ctrl+B·/tasks) |
최종 결과 직후 종료 — 데몬을 남길 수 없는 구조 |
| MCP 자동 백그라운딩 | 미적용 | CLAUDE_AUTO_BACKGROUND_TASKS — 비대화형 전용 (v2.1.212+) |
| env 우선순위 | settings env 블록이 셸 env를 덮어씀 · scope 간 managed > local > project > user — 워커가 launchd 최소 env로 떠도 settings env는 동일 적용 |
|
| 도구 권한 (43종) | 프롬프트 요구 13종(Bash·Edit·Write·WebFetch·Skill·Workflow 등) — bypass가 제거하는 것은 이 프롬프트 계층뿐, exit-2 훅 게이트는 전 모드 동일 |
|
Interactive mode 페이지 전체가 사실상 "사람이 조향하는 표면"의 목록이다 — Shift+Tab, Ctrl+B 백그라운딩, ! 셸 모드, Esc Esc 되감기, /btw, vim 모드. 전부 헤드리스 등가물이 없다. 그리고 Checkpointing의 한계 목록이 두 모드의 "되돌리기" 구현 차이를 정확히 보여준다.
훅은 user·project·local·managed·플러그인·스킬/에이전트 frontmatter 6개 출처에서 병합(대체 아님)되고, 동일 핸들러는 dedup, 매칭된 훅은 병렬 실행된다. disableAllHooks로도 managed 훅은 못 끈다.
세션 생명주기·턴·도구 호출·서브에이전트·압축·MCP·환경 변화·표시까지. Setup은 헤드리스 전용(--init-only, -p+--init/--maintenance) — CI 준비용 이벤트가 따로 있다.
exit 1은 차단이 아니다(WorktreeCreate만 예외) — 비차단 에러로 계속 진행된다. exit 2의 stderr만 Claude에게 전달. SessionEnd 훅은 1.5초 공유 예산.
settings·managed·플러그인 훅이 서브에이전트 안에서도 발화하고 agent_id/agent_type이 입력에 추가된다. agent frontmatter의 Stop은 SubagentStop으로 자동 변환.
플러그인은 skills·agents·hooks·MCP에 더해 LSP 서버·모니터·테마까지 7종을 제공한다. 설치 스코프는 user(~/.claude/settings.json)·project(.claude/settings.json, 커밋 공유)·managed. project 스코프는 신뢰 게이트 뒤에서만 로드되고 코드 실행 컴포넌트는 추가 제한 — "repo 유래 구성은 검증 후 로드"가 설계 원칙이며, enabledPlugins는 한 번 기록되면 업데이트를 넘어 지속된다.
채널(research preview)은 세션 안으로 이벤트를 밀어 넣는 MCP 서버다 — 단방향(웹훅/알림)·양방향(reply tool)에 더해 permission relay로 도구 승인 프롬프트를 폰으로 중계해 yes <id>/no <id>로 원격 승인까지 한다. 발신자 allowlist 게이팅이 명문 요구사항이다(인젝션 벡터라서).
손수 구현 중인 것들의 네이티브 대체가 문서에 이미 있었다. 블랭킷 bypass → --permission-prompt-tool · 자체 재귀 가드 → CLAUDE_CODE_CHILD_SESSION=1 · 2h 외부 kill → --max-turns/--max-budget-usd · 주입 과중(스폰 실패) → --exclude-dynamic-system-prompt-sections · nohup/tmux 수제 백그라운드 → --bg+claude agents · telegram rc 브릿지 → Channels permission relay(preview, allowlist 제약). 그리고 네 번째 분기: 대화형과 워커는 "되돌리기·조향"을 각각 세션 내부 장치(체크포인트·Shift+Tab·채널)와 세션 외부 장치(worktree·타임아웃·보드)로 푼다.