A DuckDB extension written in Rust for querying, analysing and inspecting AI coding agents history. Read conversations, plans, todos, history, and usage stats directly from your local agent data directories.
Maintainer(s):
axsaucedo
Installing and Loading
INSTALL agent_data FROM community;
LOAD agent_data;
Example
-- How many conversations have I had with Claude?
SELECT COUNT(DISTINCT session_id) AS sessions,
COUNT(*) AS total_messages
-- Calling the functions without params defaults to Claude folder.
FROM read_conversations();
-- What did I work on this week?
SELECT date, message_count, tool_call_count
FROM read_stats()
ORDER BY date DESC
LIMIT 7;
-- Which tools does github copilot use most?
SELECT tool_name, COUNT(*) AS uses
FROM read_conversations('~/.copilot')
WHERE tool_name IS NOT NULL
GROUP BY tool_name
ORDER BY uses DESC
LIMIT 10;
-- What are my active todos in my custom claude path?
SELECT content, status
FROM read_todos('~/work_folder/.claude')
WHERE status != 'completed'
ORDER BY item_index;
-- Compare activity across Claude and Copilot
SELECT source, COUNT(DISTINCT session_id) AS sessions, COUNT(*) AS messages
FROM (
SELECT * FROM read_conversations(path='~/.claude')
UNION ALL
SELECT * FROM read_conversations(path='~/.copilot')
)
GROUP BY source;
About agent_data
Supported agents: Claude Code (~/.claude) and GitHub Copilot CLI (~/.copilot).
OpenAI Codex and Gemini CLI Coming Soonβ’.
Written in π¦ Rust.
Default Behavior
When called without arguments, each function reads from its provider's default path:
| Function | Default path | Detected as |
|---|---|---|
read_conversations() |
~/.claude |
Claude Code |
read_plans() |
~/.claude |
Claude Code |
read_todos() |
~/.claude |
Claude Code |
read_history() |
~/.claude |
Claude Code |
read_stats() |
~/.claude |
Claude Code |
To read Copilot data, pass the path explicitly:
FROM read_conversations(path='~/.copilot');
Available Functions
All functions accept two optional parameters:
pathβ data directory path (default:~/.claude). Auto-detected from folder structure (projects/β Claude,session-state/β Copilot).sourceβ explicit provider override:'claude'or'copilot'. Use when auto-detection fails or for non-standard directory layouts.
Every table includes a source column ('claude' or 'copilot') as the first column.
read_conversations([path (opt)], [source (opt)])
Join Keys
Tables can be joined within the same source:
-- Conversations β History (via session_id)
SELECT c.*, h.display
FROM read_conversations(path='~/.claude') c
JOIN read_history(path='~/.claude') h ON c.session_id = h.session_id;
-- Cross-source: always filter by source
SELECT * FROM (
SELECT * FROM read_conversations(path='~/.claude')
UNION ALL
SELECT * FROM read_conversations(path='~/.copilot')
) WHERE source = 'copilot';
| Join | Left Key | Right Key | Notes |
|---|---|---|---|
| conversations <-> history | session_id |
session_id |
Same source only |
| conversations <-> todos | session_id |
session_id |
Same source only |
| conversations <-> plans | slug |
plan_name |
Claude only |
| conversations <-> history | project_path |
project |
Claude only |
For full documentation, see the GitHub repository.
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| read_conversations | table | Read conversation messages and tool calls from AI coding agent sessions | Supports Claude Code and GitHub Copilot CLI with auto-detection | [SELECT * FROM read_conversations(path='~/.claude') LIMIT 10;] |
| read_plans | table | Read plan and strategy markdown files from agent sessions | Claude: plans/.md, Copilot: session-state//plan.md | [SELECT plan_name, file_size FROM read_plans();] |
| read_todos | table | Read todo and checklist items with status tracking | Claude: todos/*.json, Copilot: checkpoint markdown checklists | [SELECT content, status FROM read_todos() WHERE status != 'completed';] |
| read_history | table | Read command and prompt history | Claude: history.jsonl, Copilot: command-history-state.json | [SELECT display FROM read_history() ORDER BY line_number DESC LIMIT 10;] |
| read_stats | table | Read daily activity statistics (message, session, and tool call counts) | Currently Claude only β returns empty for Copilot | [SELECT date, message_count FROM read_stats() ORDER BY date DESC;] |