
이 프로젝트의 기능
AI Coding Assistant Data Extraction은 여러 코딩 어시스턴트에 로컬로 저장된 대화를 수집하여 일관된 JSONL 형식으로 기록합니다. 채팅 기록 백업, 개인 분석, 파인튜닝 데이터 준비 또는 애플리케이션이 로컬 데이터베이스를 삭제하기 전에 대화를 보존하는 데 유용합니다.
이 툴킷은 macOS, Linux, Windows에서 저장 위치를 자동으로 검색합니다. 타사 Python 종속성 없이 JSONL 파일, JSON 세션 파일, Markdown 대화 기록, SQLite 데이터베이스 및 중첩된 JSON 저장소 트리를 읽을 수 있습니다.
지원되는 소스
현재 다음 도구를 지원합니다.
- Claude Code:
~/.claude/projects/아래의 JSONL 세션 파일. - Codex CLI:
~/.codex/sessions/아래의 JSONL 롤아웃 파일. - Cursor: 전역 및 작업 공간 저장소의 SQLite
state.vscdb파일. - Windsurf: 최선의 추정 휴리스틱으로 파싱하는 SQLite 저장소.
- Trae: 최선의 추정 휴리스틱으로 파싱하는 SQLite 및 JSONL 저장소.
- Continue:
~/.continue/sessions/의 JSON 파일. - Gemini CLI:
~/.gemini/tmp/아래의 JSON 채팅 파일. - OpenCode: JSON 세션, 메시지 및 파트 트리.
- Cline 및 Roo Code: 편집기 확장이 저장하는 JSON 작업 폴더.
- Aider: 프로젝트 디렉터리 내부에서
.aider.chat.history.md라는 이름으로 저장되는 Markdown 대화 기록.
설치 및 설정
저장소를 복제하거나 다운로드한 다음 프로젝트 루트에서 스크립트를 실행합니다. 추출기는 Python 표준 라이브러리만 사용합니다. Python 3.9 이상이 필요하며, Python 3.10 이상을 권장합니다.
python --version
핵심 추출기에는 가상 환경이나 종속성 설치가 필요하지 않습니다. 추출하기 전에 관련 AI 코딩 도구를 해당 컴퓨터에서 사용하여 로컬 대화 파일 또는 데이터베이스가 존재하도록 하세요.
첫 번째 추출 실행
대화형으로 실행하려면 인수 없이 기본 스크립트를 실행합니다. 번호가 매겨진 메뉴가 표시되며, 여기서 추출할 소스를 선택할 수 있습니다.
python extract.py
메시지 없이 지원되는 모든 소스를 추출하려면 --all을 사용합니다.
python extract.py --all
쉼표로 구분한 목록을 사용하여 특정 소스를 선택할 수도 있습니다. 소스 ID는 저장소의 소스 표 또는 --list를 사용하여 확인할 수 있습니다.
python extract.py --sources cursor,claude_code,aider
대화를 추출하지 않고 검색된 설치 항목을 확인하려면 다음을 실행합니다.
python extract.py --list
포함된 셸 단축 명령은 사용 가능한 시스템에서 모든 소스를 추출합니다.
./extract_all.sh
출력 및 검색 경로 선택
기본적으로 타임스탬프가 포함된 JSONL 파일은 ./extracted_data에 기록됩니다. 다른 위치를 선택하려면 --output-dir을 사용합니다.
python extract.py --all --output-dir ./chat-backup
대부분의 도구는 예측 가능한 애플리케이션 데이터 디렉터리를 사용하므로 추출기가 일반적인 운영 체제 위치를 자동으로 검색합니다. Aider는 중앙 애플리케이션 데이터 폴더를 사용하지 않고 각 프로젝트 디렉터리에 하나의 Markdown 대화 기록을 저장하므로 다릅니다.
프로젝트 또는 애플리케이션 데이터가 일반적인 위치 외부에 있다면 하나 이상의 --search-path 옵션을 사용합니다.
python extract.py --sources aider \
--search-path ~/client-work \
--search-path /mnt/data/repos
추가 검색 경로는 지원되는 다른 도구를 비표준 위치에 설치한 경우에도 유용합니다.
대화를 하나의 파일로 병합
선택한 각 소스에는 일반적으로 자체 타임스탬프 출력 파일이 생성됩니다. 모든 추출된 대화를 all_conversations.jsonl에 추가로 연결하려면 --merge를 사용합니다.
python extract.py --all --merge
일반적인 출력 디렉터리에는 다음과 같은 파일이 포함될 수 있습니다.
extracted_data/
├── claude_code_conversations_20260816_143022.jsonl
├── cursor_conversations_20260816_143022.jsonl
├── aider_conversations_20260816_143022.jsonl
├── cline_conversations_20260816_143022.jsonl
└── all_conversations.jsonl
정규화된 형식 이해
출력 파일의 각 줄은 하나의 대화를 나타냅니다. 공통 구조에는 messages 배열, source 식별자 및 session_id가 포함됩니다. 그 밖의 필드는 원래 도구가 기록한 내용에 따라 달라집니다.
{
"messages": [
{
"role": "user",
"content": "How do I fix this TypeScript error?",
"code_context": [
{
"file": "/Users/you/project/index.ts",
"code": "const x: string = 123;"
}
],
"timestamp": "2026-01-16T14:30:22Z"
},
{
"role": "assistant",
"content": "The error occurs because a number is assigned to a string type.",
"tool_use": [
{
"name": "edit_file",
"input": {"path": "src/index.ts"}
}
],
"timestamp": "2026-01-16T14:30:25Z"
}
],
"source": "cursor-composer",
"session_id": "c1a2b3...",
"project_path": "/Users/you/project",
"name": "TypeScript Type Error Fix",
"created_at": 1705414222000
}
code_context, 토큰 사용량, 프로젝트 경로, 타임스탬프, 도구 호출 및 diff와 같은 필드는 소스에 저장되어 있는 경우 포함됩니다. 일관되게 신뢰할 수 있는 필드는 messages, source 및 session_id입니다.
추출 작동 방식
- 프로그램은 운영 체제를 감지하고
Application Support,.config,.local/share,%APPDATA%,%LOCALAPPDATA%와 같은 위치를 포함해 데이터 루트 후보 목록을 만듭니다. - 각 소스는 해당 루트에서 알려진 폴더 및 파일 이름을 검색합니다.
- 적절한 리더가 JSONL, JSON, SQLite, Markdown 또는 중첩된 JSON 저장소를 불러옵니다.
- 추출기는 검색된 레코드를 공용 메시지 스키마에 맞게 정규화합니다.
- 타임스탬프가 포함된 JSONL 파일이 출력 디렉터리에 기록됩니다.
SQLite 데이터베이스는 읽기 전용으로 열리므로 실행 중인 편집기의 작업이 차단되는 것을 방지하는 데 도움이 됩니다. 또한 리더가 격리되어 있어 손상되었거나 잠긴 파일이 발견되어도 전체 추출이 중단되지 않고 일부 결과를 생성합니다.
문서화되지 않은 저장 형식 처리
Cursor, Windsurf, Trae는 안정적인 저장 스키마를 공개하지 않습니다. Cursor 추출기는 워크스페이스 ItemTable 채팅, 인라인 컴포저 데이터, 분할된 bubbleId 컴포저 데이터 등 알려진 여러 형식을 명시적으로 처리합니다.
Windsurf와 Trae는 extractors/common.py에서 일반 휴리스틱을 사용합니다. 채팅 관련 키를 검색하고, 파싱된 JSON을 순회하면서 역할과 텍스트로 구성된 메시지 쌍과 유사한 객체를 찾습니다. 이는 의도적으로 최선의 추정을 기반으로 동작합니다. 향후 애플리케이션 업데이트로 저장 형식이 변경되면 관련 KEY_HINTS 값을 업데이트해야 할 수 있습니다.
학습 데이터에 출력 사용
정규화된 JSONL 파일은 Hugging Face datasets 라이브러리로 불러올 수 있습니다. 다음 예제는 추출된 모든 파일을 불러오고, 어시스턴트 메시지가 포함된 대화만 유지한 다음, 토크나이저의 채팅 템플릿으로 형식을 지정합니다.
from datasets import load_dataset
dataset = load_dataset(
"json",
data_files="extracted_data/*.jsonl",
split="train"
)
dataset = dataset.filter(
lambda x: any(m["role"] == "assistant" for m in x["messages"])
)
def format_chat(example):
return {
"text": tokenizer.apply_chat_template(
example["messages"],
tokenize=False
)
}
dataset = dataset.map(format_chat)
모델의 요구 사항에 따라 레코드를 추가로 검토하고 변환하세요. 소스마다 서로 다른 선택적 필드가 포함될 수 있으므로 학습 파이프라인은 기본적으로 공용 메시지 구조에 의존해야 합니다.
새 소스로 추출기 확장
각 소스 추출기는 두 함수로 구성된 간단한 인터페이스를 따릅니다. continue_ext.py를 복사하면 간단한 시작점으로 사용할 수 있습니다.
DISPLAY_NAME = "My Tool"
SOURCE_ID = "my_tool"
def find_installations(extra_paths: list[Path] | None = None) -> list[Path]:
"""검색할 가치가 있는 디렉터리 또는 파일을 반환합니다."""
def extract(installations: list[Path]) -> list[dict]:
"""정규화된 대화 딕셔너리를 반환합니다."""
모듈을 만든 후 extract.py의 REGISTRY 목록에 등록하세요. 공용 리더와 일반 휴리스틱은 extractors/common.py에서 사용할 수 있습니다.
민감한 대화 데이터 보호
로컬 채팅 기록에는 API 키, 독점 코드, 개인 경로, 고객 정보 및 도구 입력이 포함될 수 있습니다. 추출한 파일을 공유하거나 학습에 사용하기 전에 검토하세요.
- 출력에서 비밀 정보를 검사합니다.
code_context및tool_use필드를 주의 깊게 검토합니다.- 공개 저장소에
extracted_data/를 커밋하지 않습니다. - 민감한 백업은 암호화된 저장소에 보관합니다.
pip install detect-secrets --break-system-packages
detect-secrets scan extracted_data/*.jsonl
프로젝트는 .gitignore에 extracted_data/를 포함하고 있지만, 무엇이든 게시하기 전에 저장소 및 백업 관행을 다시 확인해야 합니다.
문제 해결
설치 항목을 찾을 수 없음
도구가 설치되지 않았거나 저장된 채팅 기록이 없거나 표준이 아닌 위치를 사용할 수 있습니다. 먼저 --list를 실행한 다음 --search-path로 관련 디렉터리를 지정하세요. 소스 추출기의 SEARCH_DIRS 또는 APP_DIR_NAMES 상수를 직접 확인할 수도 있습니다.
Cursor 또는 Windsurf에서 데이터베이스가 잠겼다고 보고함
추출기는 읽기 전용 SQLite 연결을 사용하므로 일반적으로 실행 중인 애플리케이션이 추출을 차단하지 않습니다. 오류가 계속되면 애플리케이션을 닫고 추출을 다시 실행하세요.
Windsurf 또는 Trae에서 대화가 0개 생성됨
--list로 애플리케이션 디렉터리를 찾았는지 확인하세요. 찾았지만 채팅이 추출되지 않았다면 관련 state.vscdb 키를 확인하고 적절한 추출기의 KEY_HINTS에 일치하는 패턴을 추가하세요.
결론
AI Coding Assistant Data Extraction은 다양한 저장 형식과 운영 체제에서 로컬 코딩 대화를 보존하고 정규화할 수 있는 종속성 없는 방법을 제공합니다. python extract.py --list로 시작하고 필요한 소스를 선택한 다음, 생성된 JSONL에서 민감한 정보를 검토하세요. 이후 정규화된 레코드를 백업, 분석 또는 신중하게 준비한 학습 작업에 사용할 수 있습니다.
이 도구 모음은 사용자의 컴퓨터에 직접 설치된 AI 도구의 데이터를 대상으로 합니다. 데이터를 추출할 권리의 보유 여부, 민감한 정보 보호, 각 도구의 약관 준수, 결과를 공유하거나 학습에 사용하기 전 비밀 정보 검사는 모두 사용자의 책임입니다.
