๐ฎ clustervision
Vibecoding is a clusterfuck. When it gets hazy, you need clustervision.
Your AI coding sessions are gold. Stop letting them rot in scattered folders.
Find, search, port, prune, and even resurrect every AI coding-agent session you've ever run โ across 21 harnesses, through one unified format.
claude ยท codex ยท grok ยท opencode ยท gemini ยท hermes ยท openclaw ยท cursor ยท โฆ
search by meaning ยท read behind every compaction ยท port across harnesses ยท resurrect a maxed-out session ยท pack a new task from your whole history
No database server, no import step, no telemetry: clustervision reads your real local session storage. cv index builds full-text search, cv index --semantic search by meaning.
the desktop app reading 2,245 real local sessions across 8 harnesses โ heatmap, harness legend, and a live feed
The problem (you've felt this)
You spent three hours teaching an agent your codebase: the dead ends, the decisions, the understanding. Then:
- ๐ You can't find it. It's one of hundreds of
.jsonlfiles in a folder named after a path. - โ๏ธ It's trapped. Most harnesses resume a session only from the exact directory it ran in.
- ๐๏ธ It's stranded. Started in Claude Code, want to continue in Codex? Every tool speaks its own dialect.
clustervision means you never restart from scratch.
What you can actually do with it
# ๐ find that session from last week by what it was ABOUT, not where it lived
# ๐ take a Claude session and continue it in Codex. for real.
# โฆ wrote ~/.codex/sessions/2026/โฆ/rollout-โฆ.jsonl
# โณ codex resume 019e75e0-โฆ
# ๐งณ break a session out of its directory jail (brings CLAUDE.md / MEMORY.md along)
# ๐ชฆ a session hit the context wall and won't reopen? prune the bulk and revive it
# โฆ recorded context 976k โ 149k ยท resume with: claude --resume <new-id>
# ๐ the orchestrator crashed mid-swarm? move its lanes into your live session, context intact
# โณ resume, from session 945e6fa2: SendMessage {"to": "a5d8fd7aa0b73f0e7", โฆ}
# ๐๏ธ watch every agent on your machine work, live, in one feed
โฆand a couple that didn't exist before:
- ๐ง An MCP server: a running agent reads other agents' sessions mid-task โ "what happened here before?", "what is my sibling doing?", "have I solved this before?"
- ๐ A zero-install web viewer: drop a zip of any harness folder into your browser. Nothing uploaded, all WASM.
๐ช 21 harnesses, one IR
| Harness | Parse | Port to | Harness | Parse | Port to | |||
|---|---|---|---|---|---|---|---|---|
| โ | Claude Code | โ | โ | โ | Cursor | โ | โ | |
| โ | Codex CLI | โ | โ | โ | Kimi CLI | โ | โยฒ | |
| โ | Grok CLI | โ | โ | โ | Qwen Code | โ | โ | |
| โ | OpenCode | โ | โ | โ | LM Studio | โ | โ | |
| โ | Gemini / Antigravity | โ | โ | โ | Cline | โ | โ | |
| โ | Hermes (Nous) | โ | โ | โ | Roo Code | โ | โ | |
| โ | OpenClaw | โ | โ | โ | Continue | โ | โ | |
| โ | Zed (agent panel) | โ | โ | โ | Goose (Block) | โ | โ | |
| โ | Devin CLI (Cognition) | โ | โ | โ | Kimi Code | โ | โ | |
| โ | OpenSession (cv export --format json) |
โ | โ | โ | ChatGPT / Claude.ai exports | โ | โ |
The Claude and ChatGPT desktop apps are not harnesses: one keeps transcripts server-side, the other encrypts them at rest; why neither is readable is recorded in docs/FORMATS.md. ยฒ Kimi CLI's ~/.kimi store has been frozen since 2026-06 (kimi-cli migrates it to ~/.kimi-code), so cv stopped writing there in 0.14.
Conversion is N-way among the 12 emit-capable harnesses, through one IR. Every format is reverse-engineered in docs/FORMATS.md. Bringing your own? โ Adding a harness ๐
โจ More than a viewer
- ๐งต Splice & loom โ compose a session from spans of others (
cv splice A:0..12 B:6..), fork a lane (cv splice A:..40 --session), graft branches (cv splice A:..20 B:35..), or generate a continuation (--generate: OpenRouter, Anthropic, or LM Studio, free and local). A Janus loom for agent transcripts, across harnesses. - ๐ฎ Semantic search โ "have I solved this before?" by meaning:
cv search --semantic <query>, and the same ranking behind the MCPsearchtool. - ๐งฌ Provenance โ the event catalog classifies every tool call in every session.
cv touched <file>lists every session that edited a file;cv blame <file>ties each commit to the conversation that wrote it, with acv show --rangejump to the edit, and an exact match when the session's tool output shows the commit. - ๐ณ Anatomy of a run โ
cv workflow <id>renders aWorkflow-tool run: phase tree, agents per phase, their outcomes, tokens and tool calls, and the driving script.cv tools <id>gives per-agent tool histograms and a timeline over the whole forest.cv show <id> --kind compaction_boundary,compaction_summaryfinds every compaction seam;cv show --pre-compactionreads back what the continued agent lost.cv dataset --subagentsexports the forest. - โ๏ธ Prune โ custom compaction:
cv prune <id>moves bulky old tool payloads (file reads, logs, screenshots) into a sidecar behind a[PRUNED id=โฆ]marker and writes a new, resumable session. Prompts stay verbatim, recent turns intact;cv cat <new-id> <tool_use_id>restores any payload.--drop-thinkinglifts the oldest reasoning too. It also revives a session stuck at the context wall by rewriting the stale recordedusageClaude Code's resume gate trusts (--no-reviveopts out). (Adapted from flatten-mcp.) - โช Rewind โ
cv rewind <id> --at <sha>rebuilds an agent as it was when it landed a commit: from the last compaction before it to the tool result showing the commit, under a new id, soclaude --resume <new-id> --fork-sessionwakes up as the author. Works on sub-agents and message indexes; leaves a provenance sidecar.cv blameranks such sessions first (exact: commit created here) with thecv rewindline to paste. - ๐ Adopt โ a Claude Code session crashed with lanes in flight?
cv adopt <agent-id>โฆ [--into <live-session>]moves each sub-agent into a live session, whereSendMessageresumes it with its whole transcript. The transcript is copied withsessionIdrestamped (no other byte changes) and.meta.jsonverbatim.--intodefaults to the project's newest session;--fromnames the dead one;--dry-runprints the plan;--forceoverwrites.cv lanes --recent N --unfinishedlists candidates. Only the transcript moves: keep the dead session's directory, which holdstool-results/and any prune sidecar. Workflow-run agents are not adoptable. - ๐ Redact โ
cv export <id> --redactscrubs secrets and PII. - ๐ Share โ
cv share <id>writes one self-contained, redacted-by-default HTML file: collapsible thinking and tool folds, opens offline, CSP-pinned so it can't upload. - ๐ฆ Pack โ
cv pack "<task>"compiles relevant past spans and the files those sessions touched into a CLAUDE.md digest, a system prompt, or a resumable session in any harness. - ๐ฅ๏ธ Desktop app + ๐ web viewer โ the Tauri app reads all your local sessions natively, zero setup:
- a Projects lens: every repo and every agent that touched it, over time;
- an activity heatmap timeline;
- Compare, Stats, and a visual splice composer (OpenRouter or local LM Studio);
- sub-agent trees, nested inline and labeled with their task prompts;
- a Structure explorer (
<cv-forest>): Overview, Forest, Workflows, Tools and Compaction tabs.
- ๐ Hooks โ
cv hooks install claude(orcodex) installs five hooks: compactions become visible and reversible, a new session starts knowing this directory's history, lanes land in a ledger, owed decisions surface, and an edit to a file another live session holds asks first (Codex: denies). See hooks.
๐ Manual
Every CLI command, the MCP tools, the HTTP API, the app, conversion and the harness table: the user manual (mdBook, under manual/).
๐ ๏ธ Install
Prebuilt binaries for macOS, Linux and Windows (arm64 ยท x64 ยท x86) are on Releases, or:
|
Or from source:
๐ง Let agents read each other's minds (MCP)
The MCP tools are generated from the CLI: same names, flags and JSON. Plus await_omen (block until a sibling agent's message matches a regex), observe_stream (poll a live message tail without blocking) and the task tools. Roster: the MCP chapter or cv schema --commands.
๐ Dispatch work you can trust (cv task)
If you are the human the fleet is waiting on:
export CV_ENDPOINT=ember implies --from. cv task inbox ember --md renders the inbox as Markdown;
--unread keeps items someone else touched last. Bare list/inbox show 14 days (or anything
involving you) and count what they hid: --all or --since 90d.
Decisions are tasks with a default that stands if you say nothing, alternatives, and an
optional deadline; resolve records who chose.
For agents: cv never claims to have observed what it has not. A completion is labeled
self-reported; what git suggests (a merged branch, a vanished issue file) is a sweep candidate, never a close.
The same over MCP (task_open โฆ task_inbox) and cv serve (/api/tasks, /api/tasks/inbox/{who},
/api/inbox, /api/task/<id>/{resolve,done,note,discuss,claim,release}, /api/events). State is an
append-only event log, ~/.clustervision/tasks/events.jsonl, that refuses events its reducer would reject.
๐ก Archive your whole fleet (cv watch)
๐งฌ The OpenSession standard
OpenSession is the format seven harnesses should have agreed on: small, harness-neutral, and cwd is metadata, not identity. clustervision's IR is its reference implementation. Ship a harness? Emit OpenSession and its sessions are portable by construction. ๐ค
๐๏ธ Under the hood
One IR (Session โ Message โ Block{Text|Thinking|ToolUse|ToolResult|File|Image}), one Adapter per harness (roots + discover + stream, reading through one record codec per wire format) with an emitter beside the twelve that are port targets, plus splice / redact / prune / watch / ingest modules โ and small crates on top: cv (the one binary: the CLI, cv mcp, cv serve, cv watch, and the LLM digests for pack and splice --generate) ยท cv-search (tantivy + model2vec) ยท cv-web (WASM) ยท app/ (Tauri desktop).
parse(any harness) โ ๐ฎ unified IR โ search ยท port ยท prune ยท splice ยท pack ยท archive ยท view
๐งช Status
Built largely by swarms of agents. โจ The edges:
- 21 harnesses parse; 12 also emit (N-way conversion). The rest โ Cursor, Goose, Zed, Devin CLI, Kimi CLI (frozen store), Kimi Code, OpenSession, and the ChatGPT/Claude.ai account data exports (
chatgpt-export/claude-exportโ register their location withcv config --add-export <path>) โ are parse-only for now. - Robustness: the maintainer's fleet (about 7,000 sessions, 95 GB) lists and indexes without a panic; a per-version corpus of real harness output is golden-tested; parsers are checked against malformed input (
crates/cv-core/tests/robustness.rs). - The full-text index trades disk for speed; Gemini's protobuf
.pbis opaque; a few sidecar tool-call streams aren't merged yet. - Historical format variants are a goal: see Adding a harness, and please send your harness logs.
PRs and weird old transcripts deeply welcome. ๐