Conversation Exporter (SQLite)
Claude Codeの会話セッションデータをSQLiteにエクスポートする。
概要
全プロジェクト・全セッションのデータを単一のSQLiteファイル ~/.claude/exports/conversations.db に蓄積する。
Upsert方式により、同じセッションを複数回エクスポートしても重複せず差分のみが追加・更新される。
テーブル構成
| テーブル | 内容 | 主キー | 親テーブル |
|---------|------|--------|-----------|
| projects | プロジェクト情報 | project_path | - |
| sessions | セッションメタデータ | session_id | projects |
| messages | user/assistant/systemメッセージ(hook実行サマリ含む) | uuid | sessions |
| tool_uses | ツール呼び出し(assistantメッセージから抽出) | id | messages, sessions |
| tool_results | ツール実行結果(stdout/stderr/interrupted/isImage等) | tool_use_id | messages, sessions |
| subagents | サブエージェント情報 | agent_id | sessions |
| subagent_messages | サブエージェントの会話履歴 | uuid | subagents, sessions |
| memory_files | メモリファイル(frontmatter解析済み) | file_path | projects |
| file_history | ファイル編集スナップショットの実体 | id | sessions |
| file_history_snapshots | file-history-snapshotレコード(trackedFileBackups) | message_id | sessions |
| attachments | attachmentレコード(skill_listing/hook_success/output_style/deferred_tools_delta等) | uuid | sessions |
| permission_modes | permission-modeレコード(モード変更履歴) | id | sessions |
| last_prompts | last-promptレコード(最終プロンプトのスナップ) | leaf_uuid | sessions |
| ai_titles | ai-titleレコード(セッションごと最新値) | session_id | sessions |
| queue_operations | queue-operationレコード(バックグラウンドタスクのキュー操作) | id | sessions |
| modes | modeレコード(セッション動作モード変更履歴。permission-modeとは別系統) | id | sessions |
| bridge_sessions | bridge-sessionレコード(クラウド/Webセッション連携) | bridge_session_id | sessions |
| pr_links | pr-linkレコード(作成したPRへのリンク) | id | sessions |
messages / subagent_messages の主要カラム
基本メタ:
uuid,session_id,parent_uuid,type(user/assistant/system),role,model,timestamp,cwd,git_branchis_sidechain,is_meta,user_type,subtypeentrypoint,claude_version,slug(セッション別の人間可読エイリアス),prompt_id,permission_modesource_tool_assistant_uuid,source_tool_use_id,interrupted_message_id
帰属情報(プラグイン/スキル/MCP起動の追跡):
attribution_plugin,attribution_skillattribution_mcp_server,attribution_mcp_tool(MCPサーバ/ツール由来の応答追跡)
API識別子・停止情報:
message_api_id(Anthropic APIのmessage ID),request_id,service_tierstop_reason,stop_sequence,stop_details(JSON)diagnostics(JSON。cache_miss_reason等の診断情報),context_management(JSON。compact適用記録applied_edits)is_api_error_message,api_error_status(APIエラーメッセージ識別)
トークン使用量(usage 配下):
usage_input_tokens: 非キャッシュのfresh入力usage_output_tokens: 出力usage_cache_creation_input_tokens: キャッシュ書込(新規キャッシュ化)usage_cache_read_input_tokens: キャッシュヒット(再利用)usage_cache_creation_5m: 5分TTLキャッシュ書込内訳usage_cache_creation_1h: 1時間TTLキャッシュ書込内訳usage_web_search_requests/usage_web_fetch_requests: server_tool_use 内訳usage_speed,usage_inference_geo: モデル速度ティアと推論リージョンusage_iterations: メッセージ生成のイテレーション履歴(JSON文字列)
systemメッセージ専用(hookやローカルコマンドの実行サマリ):
level(info/error等),subtype(turn_duration/stop_hook_summary/local_command/api_error/scheduled_task_fire/bridge_status),tool_use_idduration_ms,has_output,hook_count,hook_infos(JSON配列),hook_errors(JSON配列)prevented_continuation,message_count- api_errorサブタイプ用:
error_data(JSON),retry_in_ms,retry_attempt,max_retries
注:
slug/attribution_mcp_server/attribution_mcp_tool/stop_sequence/stop_details/diagnostics/context_managementはsubagent_messagesにも同様に格納される。tool_resultsにはresult_type(toolUseResultのtype)・file_path(編集/読込対象パス)・user_modified(ユーザー手動編集フラグ) を構造化カラムとして保持。
スキーマ自動マイグレーション: 既存DBは初回実行時に
ALTER TABLE ADD COLUMNで非破壊的に新カラムが追加される。過去メッセージの新フィールド値はNULLのまま(再エクスポートで埋まる)。新規テーブルはCREATE TABLE IF NOT EXISTSで安全に追加される。
ER構造
projects 1──N sessions 1──N messages 1──N tool_uses
1──N tool_results
1──N subagents 1──N subagent_messages
1──N file_history
1──N file_history_snapshots
1──N attachments
1──N permission_modes
1──N last_prompts
1──N ai_titles
1──N queue_operations
1──N modes
1──N bridge_sessions
1──N pr_links
1──N memory_files
実行方法
エクスポートスクリプトを実行する:
python3 scripts/export.py --project-path <cwd>
オプション
| フラグ | 説明 | デフォルト |
|--------|------|----------|
| --project-path | プロジェクトのパス(cwdを渡す) | 必須 |
| --session-id | 特定のセッションIDを指定 | 最新セッションを自動検出 |
| --output | SQLiteファイルの出力パス | ~/.claude/exports/conversations.db |
| --no-memory | メモリファイルを含めない | false |
| --no-file-history | ファイル編集履歴を含めない | false |
ワークフロー
- セッション特定: ディスク上の最新の.jsonlファイルから現在のセッションを特定
- プロジェクト登録: projectsテーブルにUpsert
- トランスクリプト解析: JSONL形式のトランスクリプトをパース(
typeフィールドで分岐) - メッセージ抽出:
user/assistant/systemをmessagesに保存 - ツール使用抽出: assistantメッセージのcontent blocksから
tool_useを抽出 - ツール結果抽出: userメッセージの
tool_resultブロック+toolUseResultメタをtool_resultsに保存 - 新規レコード抽出:
attachment/permission-mode/last-prompt/file-history-snapshot/ai-title/queue-operationを各テーブルに保存 - サブエージェント解析: サブエージェントのメタデータとトランスクリプトをパース
- メモリ収集: プロジェクトのmemoryディレクトリからファイルを読み取り
- ファイル履歴収集: file-historyディレクトリからセッション中の編集履歴を収集
- SQLiteにUpsert: 全データを書き込み
対応するJSONLレコードタイプ
Claude Code (v2.1.x系) の ~/.claude/projects/<encoded>/<session>.jsonl に出現する以下のタイプを処理する:
| type | 格納先テーブル | 備考 |
|--------|---------------|------|
| user | messages (+ tool_results) | toolUseResultメタを別テーブル化。sourceToolUseID/interruptedMessageIdも保存 |
| assistant | messages (+ tool_uses) | attributionPlugin/Skill/McpServer/McpTool, diagnostics, usage.iterations等を保存 |
| system | messages | hookInfos/hookErrors/durationMs等hookサマリ+api_errorのリトライ情報を保存 |
| attachment | attachments | skill_listing/hook_success/output_style/deferred_tools_delta等 |
| permission-mode | permission_modes | モード変更履歴(タイムスタンプ無いため出現順を sequence で保存) |
| mode | modes | セッション動作モード変更履歴(同上、sequenceで保存) |
| last-prompt | last_prompts | leafUuidをキーに最終プロンプトを保存 |
| file-history-snapshot | file_history_snapshots | trackedFileBackupsを構造化保存 |
| ai-title | ai_titles | セッションごと最新値で上書き |
| queue-operation | queue_operations | バックグラウンドタスクのキュー操作 |
| bridge-session | bridge_sessions | クラウド/Webセッション連携(bridgeSessionIdをキー) |
| pr-link | pr_links | 作成したPRへのリンク(prNumber/prUrl/prRepository) |
slug(セッション別エイリアス)は任意のレコードから収集し sessions.slug に格納する。
未知のタイプは警告無くスキップされる(破壊的でない)。
出力
エクスポート完了後、以下を報告する:
- SQLiteファイルのパス
- 保存されたレコード数(テーブルごと)
- セッションID
注意事項
- 会話本文・ツール入力・メモリ・ファイル履歴には、APIキーや個人情報などの機密情報が含まれる可能性がある。共有・バックアップ・外部分析の前に保存範囲を確認し、不要なら
--no-memory/--no-file-historyを使う。DB自体もアクセス権を制限して保管する。 - 現在実行中のセッションのトランスクリプトはリアルタイムで書き込まれているため、エクスポート時点までのデータが保存される
- assistantメッセージのcontentはJSON配列として保存される(テキスト、ツール呼び出し、ツール結果などの複合構造)
attachments.attachment_data/messages.hook_infos/messages.usage_iterationsなどはJSON文字列として保存。SQLiteのjson_*関数で展開可能- 大きなセッションの場合、ファイルサイズが数十MBになることがある
- プロジェクト横断のクエリが可能(例:
SELECT tool_name, COUNT(*) FROM tool_uses JOIN sessions USING(session_id) GROUP BY tool_name) - スキル/プラグイン起動の追跡:
SELECT attribution_skill, COUNT(*) FROM messages WHERE attribution_skill IS NOT NULL GROUP BY attribution_skill