Skip to main content

Standalone real-time code index — live local directories and registered git repos

Project description

eulerian

Real-time code navigation for AI agents and editors. eulerian keeps a live symbol index — files, classes, functions, methods, constants, with line ranges — so an agent can jump straight to a definition instead of grepping or reading whole files.

Two ways to point it at code:

  • Local mode — watch a real working directory. A filesystem watcher re-parses files the moment they're saved; the index never goes stale and there's no explicit re-index step. Every query also runs a synchronous, cheap mtime-diff catch-up first (LocalWatcher.sync()), so a query issued immediately after a save — with no delay — never races ahead of the watcher's debounce window and returns pre-edit state.
  • Repo mode — register a git remote, check out a (user, repo, ref) worktree, and browse it without touching your actual working tree. Freshness is checked against the remote on each call instead of pushed live, since nothing is editing the worktree directly.

Both modes share one in-memory symbol index and the same tree-sitter parser. Python only for now (multi-language grammars are straightforward to add — see parser.py).

Install

uv tool install eulerian
# or
pip install eulerian

No other runtime dependencies beyond tree-sitter, tree-sitter-python, rapidfuzz, watchfiles, fastmcp, and typer — all pulled in automatically.

CLI

# Local mode: one-shot queries against a directory, no persistent watcher
eulerian status [PATH]
eulerian outline QUERY [PATH] [-k N]
eulerian find SYMBOL [PATH]

# Local mode: live watch + MCP server (stdio by default, for an MCP client)
eulerian watch [PATH] [--http --host HOST --port PORT]

# Repo mode: register, checkout, browse
eulerian repo add URL
eulerian repo list
eulerian repo fetch REPO
eulerian repo checkout REPO REF [--user NAME]
eulerian repo outline REPO REF QUERY [--user NAME] [-k N]

MCP server

eulerian watch [PATH] starts a FastMCP server (stdio or --http) exposing:

Local modewatch(path), unwatch(path), outline(query, paths, root, k, format), find(symbol, root), read(path, start, end, root, segments), status(root).

Repo moderepo_add(url), repo_fetch(repo), repo_list(), repo_pubkey(), checkout(repo, ref, user), checkout_close(repo, ref, user), git_log(repo, ref, user, n), repo_outline(repo, ref, query, paths, user, k, format, reset_head), repo_read(repo, ref, path, user, start, end, segments, reset_head), repo_references(repo, ref, symbol, user, regex, max_results, reset_head).

Point any MCP-capable client (Claude Code, etc.) at eulerian watch <path> to get instant, line-precise code navigation without burning tool calls on grep/read round-trips.

repo_references complements repo_outline/find, which only match definitions in the symbol index: it greps the worktree's file contents directly for call sites, imports, type hints, decorators, and any other textual mention of a symbol, defaulting to whole-word matching (pass regex=True for a raw pattern instead).

Indexing scope and .gitignore

Every file walk — the initial full scan, the local watcher's live filter, and repo_references's grep — honors .gitignore recursively (nested .gitignore files and global excludes included) whenever the root is a git working tree, via git ls-files/git check-ignore. Registered-repo worktrees always qualify; a locally watched directory only gets this treatment if it's itself a git repo. On top of that, a fixed set of noise directories (.venv, node_modules, __pycache__, build, dist, etc. — see parser.SKIP_DIRS) is always excluded, gitignored or not.

Repo-mode configuration

Bare clones and worktrees live under ~/.eulerian/ by default:

Env var Default Purpose
EULERIAN_GIT_REPOS_PATH ~/.eulerian/repos/ Bare clone + worktree storage
EULERIAN_GIT_SSH_KEY ~/.eulerian/ssh/id_ed25519 Deploy key for private remotes
EULERIAN_GIT_WORKTREE_MAX_IDLE_SEC 3600 Idle worktree eviction threshold

Architecture

parser.py        tree-sitter Python parser -> Symbol / CallEdge / ImportEdge
index.py         in-memory Index, keyed by an opaque handle, rapidfuzz search
sources/local.py watchfiles watcher  -> handle = resolved root Path
sources/repo.py  bare clone + worktree lifecycle -> handle = (user, repo, ref)
mcp/             FastMCP server exposing both modes as tools
cli.py           typer CLI

Index doesn't care what a handle is — local mode and repo mode just pick different shapes for it. Both feed the same outline/find query surface.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

eulerian-0.1.4.tar.gz (26.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

eulerian-0.1.4-py3-none-any.whl (32.1 kB view details)

Uploaded Python 3

File details

Details for the file eulerian-0.1.4.tar.gz.

File metadata

  • Download URL: eulerian-0.1.4.tar.gz
  • Upload date:
  • Size: 26.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for eulerian-0.1.4.tar.gz
Algorithm Hash digest
SHA256 9da5a3f31d80d591acf7916382e7d1a5ae7d3c15ade393553788869fd99f9a64
MD5 63d26c8a95ccb69837d9720435102c37
BLAKE2b-256 541cbe2e50555235e684bc25a06e3805d301bcf4f64057c93b68310580aa1600

See more details on using hashes here.

File details

Details for the file eulerian-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: eulerian-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 32.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for eulerian-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 db4f451c09192b508496a311b884b8bd4c0f091aa421729bd8d7b5e703ec2f51
MD5 503868ed8a62b2f4b879aaa73e73eff2
BLAKE2b-256 f6cb22b3075da52e23038f5df693685290994630ce82f2886a3ba8c9e34347b9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page