Toolpath

The open session format. What your coding agent did, why, what it tried, and what it cost, in one portable schema. Read it, query it, share it, resume it in any harness.

Quick install the path CLI
$ curl --proto '=https' --tlsv1.2 -fsS \ https://toolpath.net/install.sh | bash
From crates.io
$ cargo install path-cli

The problem

Every coding agent writes its own undocumented session log. Claude Code keeps rotating JSONL chains, Codex writes rollout files, Gemini has chat directories, Copilot an event stream. The session that produced a change is locked inside the harness that ran it, and that harness can change its format at any time.

One format for everyone's tools

Toolpath is the open session format: every harness's sessions in one portable schema that records who changed what, why, what they tried that didn't work, and what it cost.

One schema means tooling stops being per-agent. A cost dashboard, a review surface, a search index, an archive: build it once against the format and it works with sessions from every supported harness. And when the next agent ships, one new parser brings it into every tool you already have.

When you need it

Reduce review time

An agent wrote the diff, and the diff can't say why. Share the session to Pathbase and link it from the PR: reviewers see what was asked, what was tried and rejected, and how the result was verified. The questions that stall a merge get answered before they're asked.

One query, every agent

Which sessions burned the most tokens? What did the agent try before the fix that worked? path query answers it with one jq filter across every session on the machine, whichever agents wrote the logs.

Pick up where anyone left off

Start on your laptop, push the agent to a server. Hand a stuck session to a teammate. Move a Claude Code session into Codex. Wherever it lands, the next agent starts with everything the last one knew: the intent, the state, the dead ends already ruled out.

Parse in, project out

Toolpath is open and versioned: the schema is published, and a document that validates today will validate tomorrow. Harness formats are neither. They are undocumented, proprietary, and change without notice. So Toolpath treats them as boundaries around a stable center, and everything it does is one of three moves across that boundary:

Three core objects

Step

A single change to artifact(s) by one actor. One commit, one edit, one format pass.

Path

A DAG of steps with a base context. A PR, a coding session, a branch.

Graph

A collection of related paths. A release, a sprint, a project.

Steps form a DAG via parent references. Dead ends are implicit: steps not in the ancestry of path.head.

FIG_001   STEP DAG step-1 human:alex step-2 agent:claude step-3a agent:claude step-4a agent:claude step-3b tool:rustfmt step-4b human:alex step-5b human:alex DEAD END HEAD

Supported harnesses

Parsing captures the full session: prompts, tool calls, reasoning, file changes, sub-agent work, token usage. Projecting writes a session the harness accepts as its own, so it resumes natively. Where a harness's log genuinely doesn't record something, the gap is documented in the format notes rather than papered over.

Git history and GitHub pull requests parse into the same schema, so a session, the PR it became, and the release that shipped it can share one graph.

What Toolpath adds

What Git Toolpath
Who made the change Single author per commit Typed actors: human:, agent:, tool:, ci:
Why they changed it Unstructured commit message meta.intent + linked refs
Abandoned approaches Lost when branch is deleted Dead ends preserved in the DAG
Multi-actor provenance Collapsed into one commit Each actor gets their own step
Verification GPG on whole commit Scoped signatures: author, reviewer, CI
Granularity Commit-level Sub-commit: multiple steps between commits

Minimal example

A valid Toolpath document can be tiny:

{
  "graph": { "id": "graph-step-001" },
  "paths": [
    {
      "path": { "id": "path-step-001", "head": "step-001" },
      "steps": [
        {
          "step": {
            "id": "step-001",
            "actor": "human:alex",
            "timestamp": "2026-01-29T10:00:00Z"
          },
          "change": {
            "src/main.rs": {
              "raw": "@@ -12,1 +12,1 @@\n-    println!(\"Hello world\");\n+    println!(\"Hello, world!\");"
            }
          }
        }
      ]
    }
  ]
}

No parents (it's the first step). No meta. One file, one perspective. Every document is a Graph at the root — single-step documents like this one are a Graph holding one Path holding one Step.

Quick start

# Install
cargo install path-cli

# Archive every agent session on this machine (all harnesses, incremental)
path p cache sync

# Query across all of them with a jq filter, whichever agent produced them
path query 'map(select(.dead_end))'
path query 'map(select(.step.actor | startswith("agent:")))'

# Share a session, then resume it in the original harness or a different one
path share
path resume https://pathbase.dev/alex/pathstash/path-pr-42 --harness codex

# Derive provenance from git history and visualize it
path p import git --repo . --branch main --no-cache | path p render dot | dot -Tpng -o graph.png

Go deeper

Read the spec

The format stands alone: an RFC, a JSON Schema, and a dozen example documents. If Rust isn't your language, implement the schema in yours.

Build on the crates

Everything the CLI does is a library call: core types, a provider crate per harness, renderers for DOT and Markdown. See the crates or the API reference.

Stay in Claude Code

/plugin install path@toolpath adds /path:share and /path:query as slash commands and installs the CLI on first use. See the plugin.