toolpath-claude
Derive Toolpath provenance documents from Claude conversation logs.
When Claude Code writes your code, the conversation — the reasoning, the tool calls, the abandoned approaches — is the provenance. This crate reads those conversations directly and maps them to Toolpath documents so every AI-assisted change has a traceable origin.
Overview
Reads Claude Code conversation data from ~/.claude/projects/ and provides:
- Conversation reading: Parse JSONL conversation files into typed structures
- Query: Filter and search conversation entries by role, tool use, text content
- Derivation: Map conversations to Toolpath Path documents
- Watching: Monitor conversation files for live updates (feature-gated)
Derivation
Convert Claude conversations into Toolpath documents:
use ;
let manager = new;
let convo = manager.read_conversation?;
let config = default;
let path = derive_path;
# Ok::
Mapping
| Claude concept | Toolpath concept |
|---|---|
| Session (JSONL file) | Path |
| Project path | path.base.uri as file:///... |
| User message | Step with actor: "human:user" |
| Assistant message | Step with actor: "agent:{model}" |
| Tool use (Write/Edit) | change entry keyed by file path |
| Assistant text | meta.intent |
| Sidechain entries | Steps parented to branch point |
Reading conversations
use ClaudeConvo;
let manager = new;
// List projects
let projects = manager.list_projects?;
// Read a conversation
let convo = manager.read_conversation?;
println!;
// Most recent conversation
let latest = manager.most_recent_conversation?;
// Search
let matches = manager.find_conversations_with_text?;
# Ok::
Querying
use ;
let query = new;
let user_msgs = query.by_role;
let tool_uses = query.tool_uses_by_name;
let errors = query.errors;
let matches = query.contains_text;
Watching
With the watcher feature (enabled by default):
use ;
let config = new;
let mut watcher = new?;
let handle = watcher.start.await?;
// New entries arrive via the handle
while let Some = handle.recv.await
Feature flags
| Feature | Default | Description |
|---|---|---|
watcher |
yes | Filesystem watching via notify + tokio |
Provider-agnostic usage
This crate implements toolpath_convo::ConversationProvider, so consumers can
code against the provider-agnostic types instead of Claude-specific structures.
Tool results are automatically assembled across entry boundaries — Claude's JSONL
writes tool invocations and their results as separate entries, but
load_conversation pairs them by tool_use_id so ToolInvocation.result is
populated and tool-result-only user entries are absorbed (no phantom empty turns):
use ClaudeConvo;
use ConversationProvider;
let provider = new;
let view = provider.load_conversation?;
for turn in &view.turns
The ConversationWatcher trait impl emits WatcherEvent::Turn eagerly and
follows up with WatcherEvent::TurnUpdated when tool results arrive:
use ;
for event in watcher.poll?
Enrichment
Beyond basic conversation reading, the provider populates
toolpath-convo enrichment fields:
Tool classification — Claude Code tool names are mapped to ToolCategory:
| Claude Code tool | ToolCategory |
|---|---|
Read |
FileRead |
Glob, Grep |
FileSearch |
Write, Edit, NotebookEdit |
FileWrite |
Bash |
Shell |
WebFetch, WebSearch |
Network |
Task |
Delegation |
Unrecognized tools get category: None — consumers still have name and input.
Environment context — each turn's EnvironmentSnapshot is populated from the
log entry's cwd (working directory) and git_branch (VCS branch).
Delegation tracking — Task tool invocations are extracted as DelegatedWork
on the parent turn, with agent_id, prompt, and result populated. Sub-agent
turns are stored in separate session files and not yet cross-referenced (turns
is empty).
Token usage — per-turn TokenUsage includes cache_read_tokens and
cache_write_tokens from Claude's prompt caching.
ConversationView.total_usage sums all per-turn token counts (input, output,
cache read, cache write) into a single aggregate.
Session summary — ConversationView.provider_id is "claude-code".
ConversationView.files_changed lists all files mutated during the session
(deduplicated, first-touch order), derived from FileWrite-categorized tool inputs.
See toolpath-convo for the full trait and type definitions.
Part of Toolpath
This crate is part of the Toolpath workspace. See also:
toolpath-- core types and query APItoolpath-convo-- provider-agnostic conversation abstractiontoolpath-git-- derive from git historytoolpath-dot-- Graphviz DOT renderingtoolpath-cli-- unified CLI (cargo install toolpath-cli)- RFC -- full format specification