Aggregate AI coding sessions across Claude Code, Cursor, Codex, and GitHub Copilot CLI — search, list, and detect active sessions from one place.
go install github.com/psacc/omnisess@latestThe binary is named omnisess. Or build from source:
git clone https://github.com/psacc/omnisess.git
cd omnisess
go build -o omnisess .
make install # installs binary to ~/go/bin/omnisess
make smoke # verifies the installed binary is reachable and functionalUse omnisess directly from Claude Code via slash commands — no context switching needed.
The omnisess binary must be installed and in your PATH before installing the plugin:
go install github.com/psacc/omnisess@latestIn Claude Code, run:
/plugin marketplace add psacc/omnisess
/plugin install omnisess@psacc
The marketplace identifier is
omnisess@psacc—omnisessis the plugin name,psaccis the marketplace source added in the first command.
Once installed, ten slash commands are available:
| Command | Description | Example |
|---|---|---|
/omnisess:list |
List all sessions across all sources | /omnisess:list --tool claude --limit 10 |
/omnisess:search |
Full-text search across sessions | /omnisess:search "database migration" |
/omnisess:active |
Show currently running sessions | /omnisess:active |
/omnisess:show |
Show full detail for a session | /omnisess:show claude:5c3f2742 |
/omnisess:recap |
Structured markdown briefing of sessions for a time window | /omnisess:recap today |
/omnisess:digest |
Print a calendar day's sessions as Obsidian-compatible markdown with full Q&A | /omnisess:digest --date 2026-05-09 |
/omnisess:stats |
Tool-call counts and file-I/O activity from the transcript index | /omnisess:stats --window 7d |
/omnisess:index |
Bulk-populate the transcript SQLite cache used by stats |
/omnisess:index --all |
/omnisess:ps |
Live Claude + Codex process tree with ancestor lineage (macOS) | /omnisess:ps |
/omnisess:skills-audit |
Classify Claude Code skills by usage (Keep / Borderline / Archive) | /omnisess:skills-audit --window 90d |
Each command checks for the omnisess binary at invocation time and prints clear install instructions if it is not found.
# List all sessions, most recent first
$ omnisess list
TOOL ID PROJECT MESSAGES LAST ACTIVE
claude 5c3f2742 ~/prj/myapp 42 2h ago
cursor a1b2c3d4 ~/prj/api 18 5h ago
# Sessions from a specific calendar day (local time)
$ omnisess list --date 2026-04-22
# Search across all sources
$ omnisess search "database migration"
claude:5c3f2742 ~/prj/myapp "...ran the database migration script..."
# Show currently active sessions
$ omnisess active
claude:5c3f2742 ~/prj/myapp (process alive, modified 47s ago)
| Source | Status |
|---|---|
| Claude Code | Full |
| Cursor | Full |
| Codex | Full |
| GitHub Copilot CLI | Full |
| Command | Description |
|---|---|
omnisess list |
List all sessions across all sources |
omnisess search <query> |
Full-text search across sessions |
omnisess active |
Show sessions detected as currently running |
omnisess show <tool:id> |
Show full detail for a single session |
omnisess digest |
Print a calendar day's sessions as Obsidian-compatible markdown |
omnisess index --all |
Bulk-populate the transcript SQLite index (Claude only in v1) |
omnisess stats |
Tool counts + file activity stats from the transcript index |
omnisess ps |
Live Claude + Codex process tree with ancestor lineage (macOS) |
omnisess tui |
Interactive terminal UI for browsing sessions |
omnisess version |
Print the installed omnisess version |
omnisess skills audit |
Classify skills by usage (Keep/Borderline/Archive); see docs/skills-audit.md |
These flags are accepted by every subcommand:
| Flag | Description |
|---|---|
--json |
Output as JSON instead of a table |
--axi |
Agent-ergonomic output for list/active: a minimal 5-field session projection wrapped in an aggregate summary + next-step hints, as compact JSON (also via OMNISESS_AXI env var). search/show treat it as --json; other commands are unaffected |
--tool <name> |
Filter by source (claude, cursor, codex, copilot) |
--since <duration> |
Only sessions updated within duration (Go duration, plus Nd for days, Nw for weeks) |
--date YYYY-MM-DD |
Only sessions updated on this calendar day (local time). Combines with --since by intersection |
--limit N |
Max results (0 = unlimited) |
--project <substring> |
Filter by project path substring |
--exclude-project <substring> |
Exclude project path substring (repeatable; also via OMNISESS_EXCLUDE_PROJECTS env var, comma-separated) |
omnisess maintains a derived SQLite cache of per-tool-call metadata
(Read/Write/Edit file paths, line counts, token usage, error flags).
The cache is OpenTelemetry GenAI-aligned: column names map 1:1 to OTel
attributes (tool_call_id, provider_name, request_model, …).
# Bulk-populate the cache once (also runs lazily on first stats call):
omnisess index --all
# Tool counts + file activity for the last 7 days (default window):
omnisess stats
# Aggregate over a different window:
omnisess stats --window 30d
# Per-session detail:
omnisess stats --session claude:5c3f2742
# Machine-readable:
omnisess stats --window 7d --json | jq .
# Capture full arguments + result payloads (privacy-sensitive — Bash commands
# and Write/Edit content may contain secrets):
omnisess index --all --full
omnisess stats --session claude:5c3f2742 --fullEven without --full, the index records file paths touched by Read/Write/Edit
tool calls (and your home directory often appears in them) — treat the cache
file as user-private data.
The index file lives at os.UserCacheDir() + /omnisess/index.sqlite by
default; override via OMNISESS_INDEX_PATH.
Caveat for v0.7+: the index is currently used only by omnisess stats.
list/active/digest/search still re-parse JSONL on every invocation;
PR2 will route them through the index (issue #54).
Versioned releases are published to the GitHub releases page.
Install a specific version:
go install github.com/psacc/omnisess@v0.4.1Install the latest tagged release:
go install github.com/psacc/omnisess@latestVerify the installed version:
omnisess --versionBinaries installed via go install github.com/psacc/omnisess@vX.Y.Z embed the
module version automatically. Binaries built locally with go build report
(devel).
See docs/process/release.md for the release process.
- Fork the repository and create a feature branch (
git checkout -b feat/my-change). - Run
make setup(one-time) — installs git hooks and golangci-lint at the pinned version. Or runmake install-lintto install/upgrade the linter alone. - Make your changes and run
make check(fmt + vet + lint + test) — must pass clean. - Open a pull request against
main.
All source packages under internal/source/<name>/ must remain isolated (no cross-imports).
Pure Go only — no CGO.
MIT — see LICENSE.