Skip to main content

agsearch

Find the session you remember,
even when you don't remember its title.

Ranked full-text search across the coding-agent sessions already on your machine.
Claude Code, Codex, Cursor, opencode and Gemini CLI.

ci license: MIT

agsearch indexes the local transcripts your coding agents already write. Search them in one ranked list, preview the matching lines, and resume the original session in the tool it came from. Everything stays on your machine.

Searching 52 sessions; the second query is misspelled and still lands on the right one

Quick start

brew install devcodes9/tap/agsearch
agsearch

Type anything you remember from a past conversation. Select a result to resume it.

Homebrew also installs fzf, which the interactive interface needs.

To run one search without installing anything:

uvx agsearch -n "stripe tax id"

Features

  • Full-conversation search. Search user prompts and assistant replies, not only titles and session metadata.
  • One list for every tool. Sessions from all five agents appear together, each row named after the tool it came from. Adding another agent is a parser plus one entry in the source table, with no change to search or ranking.
  • Ranked results. BM25 ranking favors focused sessions and shows matching lines in context.
  • Preview, read, or resume. Inspect a match, open the transcript in a pager, or return to the original session.
  • Your agent can search too. A Claude Code skill, so Claude finds the earlier conversation itself instead of answering that it has no record of it.
  • Fully local. No uploads, API keys, hosted index, or network calls.
  • Fast warm searches. A per-file cache reparses only transcripts that changed.

Installation

Homebrew

Recommended because it installs both agsearch and the fzf dependency:

brew install devcodes9/tap/agsearch

Python tool installers

uv tool install agsearch
# or
pipx install agsearch

The interactive interface needs fzf 0.35 or newer — that is the release which added the start event agsearch binds. Some distributions package an older one; fzf's own install script is the fallback. Without fzf, agsearch -n "query" still prints ranked sessions.

Install script

curl -fsSL https://raw.githubusercontent.com/devcodes9/agsearch/main/install.sh | sh

This installs the latest release to ~/.local/bin. Set PREFIX to change the destination or AGSEARCH_VERSION to pin a release.

agsearch requires Python 3.9 or newer and has no Python package dependencies.

Usage

agsearch                       # browse all sessions in the interactive interface
agsearch "stripe tax id"       # open with an initial query
agsearch -n "stripe tax id"    # print ranked sessions as plain text, no fzf
agsearch read <session-id>     # print a whole session, without resuming it
agsearch --here "webhook"      # search only the current project
agsearch -p myapp "migration"  # search projects whose path contains "myapp"
agsearch --thinking "query"    # include assistant thinking blocks
agsearch --no-resume "query"   # print the selected resume command
agsearch --reindex             # rebuild the transcript cache
agsearch --version             # print the installed version

Scripts and coding agents

-n prints one entry per session as plain text, led by the session id, and drops colour whenever it is not writing to a terminal. That makes the search loop scriptable:

agsearch -n "webhook retry backoff"        # ranked sessions, one entry each
agsearch read 3f2a1c4e-...                 # the whole conversation, no resume, no tokens

Ranking is the same as the interactive list, so a term you half-remember or mistype finds the same session either way. Piped, the session ids shorten to a unique prefix, the columns lose their padding, and read prints the start and end of a long session rather than all of it. A terminal sees none of that.

Let Claude search for you

agsearch ships a Claude Code skill. Install it from inside Claude Code:

/plugin marketplace add devcodes9/agsearch
/plugin install agsearch@agsearch

From the next session on, Claude searches your transcripts itself when you refer to work from an earlier conversation:

you: what did we decide about the webhook retry backoff?

Claude: runs agsearch -n "webhook retry backoff", reads the top hit, answers from it

It also covers handoff, which resuming cannot do. claude --resume moves you back into the old session in its own directory; the skill carries that session's context forward into the one you are in now, so you can pick the work up in a different repository or on a different branch.

The skill is a single markdown file. Read it before installing. If you would rather not add a marketplace, copy it instead:

mkdir -p ~/.claude/skills && cp -r skills/agsearch ~/.claude/skills/

Either way it needs the agsearch binary, which the installation section above covers.

Interactive keys

Key Action
Enter Resume the selected session
Ctrl-O Read the full conversation in your pager
Ctrl-Y Copy the resume command
Ctrl-/ Toggle the preview pane

Selecting a result resumes the session in the tool that created it, from that session's project directory. The current query is copied to the clipboard so you can find the same text after resuming.

For a global shortcut, see the hotkey guide.

Why not just /resume?

Claude Code's /resume picker and codex resume are good when you remember a session's title, branch, directory, or first prompt. They search metadata about the session.

agsearch searches the conversation itself. It also combines both tools in one list and includes Claude Code SDK and -p sessions that do not appear in the native picker.

Use the native picker when you remember what the session was called. Use agsearch when you remember what was said.

Search and ranking

agsearch drops common stopwords, applies conservative stemming, and ranks matching sessions with BM25 across three weighted fields: title and project, first prompt, and full transcript. Sessions covering more query terms rank first; relevance, recency, and previous resumes break close ties. Rare long typos fall back to subsequence matching, so conection pool still finds the session about connection pools.

Search is lexical, not semantic. It will not match concepts expressed with completely different words, and the first result is not guaranteed to be the session you intended.

Privacy and storage

agsearch reads:

Agent Read from Resumed with
Claude Code ~/.claude/projects/**/*.jsonl claude --resume <id>
Codex ~/.codex/sessions/**/*.jsonl codex resume <id>
cursor-cli ~/.cursor/projects/**/agent-transcripts/ cursor-agent --resume <id>
opencode ~/.local/share/opencode/opencode.db opencode --session <id>
Gemini CLI ~/.gemini/tmp/**/chats/*.json gemini --session-file <path>

opencode keeps sessions in SQLite; agsearch opens it read-only and reads message records only. Gemini's --resume takes a project-scoped index number rather than a stable id, so resume goes through the transcript file instead.

Cursor and Gemini are read from their CLI's storage. Chats made in the Cursor IDE are kept elsewhere and are not indexed, which is why the column names the CLI.

Its cache lives under ~/.cache/agsearch/. Transcript parsing and ranking happen locally, and only changed files are reparsed.

[!IMPORTANT] Claude Code deletes transcripts after 30 days by default. To keep a longer searchable history, set cleanupPeriodDays in ~/.claude/settings.json:

{ "cleanupPeriodDays": 365 }

agsearch never changes this setting.

Session handling

  • Claude Code subagent transcripts are folded into their resumable parent session.
  • SDK and other automated sessions remain searchable but rank below user-started sessions.
  • Sessions from deleted worktrees resume from the nearest existing parent directory.
  • Recently active sessions are marked ● and require confirmation before reattaching.
  • Forked Claude Code sessions are marked fork, and name the branch they split from.

Development

git clone https://github.com/devcodes9/agsearch.git
cd agsearch
python3 -m unittest discover -s tests

Changes to ranking should include a regression case in tests/. See the changelog and open issues.

License

MIT

Metadata

Release files for agsearch 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agsearch 0.2.0
File Size Uploaded
agsearch-0.2.0.tar.gz 71.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for agsearch 0.2.0
File Interpreter ABI Platform
agsearch-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 109.2 kB

Release files / agsearch-0.2.0.tar.gz

Download URL agsearch-0.2.0.tar.gz
Size 71.8 kB
Tags Source
SHA-256 checksum
How to use checksums
f856b41d62b9e731d1e69615f2e682393b5c00aad7ee596495e4c06b5bd14a83
BLAKE2b-256 checksum
How to use checksums
9e4e3a4ab13dae029765b3eabe04709313bf5208adcb8ef8ce46bf6fa00ab425
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release files / agsearch-0.2.0-py3-none-any.whl

Download URL agsearch-0.2.0-py3-none-any.whl
Size 37.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c4ed4c2fbdc714c23fead48e2b6da98bdec49fca0e738372c6002071869eb78c
BLAKE2b-256 checksum
How to use checksums
a80fee02eabbd27b502dad0eefbab090dd3bfe173a4f0a242b1d722fdebd68bc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page