Claude Code는 첫날부터 모든 세션을 디스크에 기록해 왔습니다. 저희가 이를 인덱싱했습니다.
요약
Claude Code가 모든 세션 데이터를 JSONL 형식으로 로컬 디스크에 기록하고 있음을 발견했습니다. 이를 인덱싱하여 세션 기록, 도구 호출, 파일 수정 내역 등을 구조화된 데이터로 활용할 수 있는 방법을 제시합니다.
핵심 포인트
- Claude Code 세션 데이터는 ~/.claude/projects/에 JSONL로 저장됨
- 모든 턴, 도구 호출, 응답 내역이 구조화된 객체로 포함됨
- 세션 상태 관리를 위해 매 턴마다 체크포인트를 작성하는 방식 권장
- 공식적인 훅(hook) 사양 정립을 위한 업스트림 논의 진행 중
~/.claude/projects/ 디렉토리를 확인해 보세요.
여러분이 가졌던 모든 세션에 대한 JSONL 파일이 존재합니다. 모든 턴 (turn), 모든 도구 호출 (tool call), 수정된 모든 파일, 모든 응답까지 말이죠. 이 모든 것이 첫 세션부터 시작되어 추가 전용 (append-only) 방식으로 저장되어 있습니다. 저희의 데이터는 1월까지 거슬러 올라가며, 57MB 용량에 1,026개의 세션, 76,000개의 턴을 포함하고 있습니다. 그동안 그냥 그 자리에 그대로 있었던 것입니다.
누가 알려준 것이 아닙니다. 그냥 확인해 보았을 뿐입니다.
형식 또한 깔끔합니다. 각 라인은 role, timestamp, content, tool calls 등 모든 것이 구조화된 JSON 객체입니다.
아무도 기록하지 않는 사실은 PreCompact 페이로드(payload) 내의 transcript_path가 훅(hook)이 실행되는 시점에 항상 채워져 있지는 않다는 점입니다. 이 경로를 중심으로 전체 저장 로직을 구축하고 배포했다가, 설명할 수 없는 조용한 실패(silent failures)를 겪게 됩니다. 저희가 정확히 그렇게 했습니다. 해결책은 Stop이 세션 종료 시점에만 기록하는 것이 아니라, 매 턴(turn)마다 체크포인트(checkpoint)를 작성해야 한다는 것입니다. 그렇게 하면 PreCompact가 실행될 때 어떤 상황에서도 항상 최신의 데이터를 백업으로 사용할 수 있습니다.
그다음 SessionStart가 source 필드를 읽습니다. "compact"는 압축(compaction)이 방금 실행되었음을 의미하고, "resume"은 앱이 재시작되었음을, "startup"은 새로운 세션임을, "clear"는 의도적인 삭제를 의미합니다. 각각은 서로 다른 동작을 수행합니다. 이 중 어느 것도 문서화되어 있지 않으며, 직접 알아내야만 합니다.
결과적으로: 압축(compaction)은 더 이상 하드 리셋(hard reset)이 아닙니다. 그것은 캐시 미스(cache miss)입니다.
저희는 또한 anthropics/claude-code#47023에서 업스트림(upstream) 논의에 참여하고 있습니다. 서로 다른 사람들이 만든 7개의 독립적인 메모리 프로젝트들이 모두 동일한 벽에 부딪히고 있으며, 정확히 동일한 훅(hook) 요구 사항에 도달하고 있습니다. Bella, NEXO Brain, Cozempic, world-model-mcp 등이 그 예입니다. 저희 중 누구도 서로 조율하지 않았습니다. 우리는 그저 똑같은 것들이 필요했을 뿐입니다. 추적하고 싶으시다면 그곳에서 공식적인 훅(hook) 사양(spec)이 정리되고 있습니다.
Repo: https://github.com/Haustorium12/continuity-v2 — MIT 라이선스이며, 훅(hooks) 설정에는 약 5분이 소요됩니다. MCP 서버는 단 하나의 Python 파일로 구성되어 있습니다. 질문이 있다면 기꺼이 답변해 드리겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/ClaudeAI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기