Exact files, lines and callers for your agent.
Sieve indexes a repo into a symbol graph and answers with the file and the line. It runs on your machine. No API key.
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/iamalvisng/sieve/releases/latest/download/sieve-cli-installer.sh | shbrew install iamalvisng/tap/sievecargo binstall sieve-climacOS and Linux.macOS and Linux only for now.
sieve ask "how does the dev server handle hot module replacement"ask how does the dev server handle hot module replacement · 8 hits 1 [packages/vite/] createServerModuleRunner fn packages/vite/src/node/ssr/runtime/serverModuleRunner.ts:143-160 function createServerModuleRunner( environment: DevEnvironment, options: ServerModuleRunnerOptions = {}, ): ModuleRunner 2 [packages/vite/] handleHMRUpdate fn packages/vite/src/node/server/hmr.ts:411-679 async function handleHMRUpdate( type: 'create' | 'delete' | 'update', file: string, server: ViteDevServer, ): Promise<void> 3 [packages/vite/] _createServer fn packages/vite/src/node/server/index.ts:513-1148...Three commands you will use every day.
Each answer names a symbol, its kind and an exact span. Your agent opens the span and reads nothing else.
Ask in plain words. Get ranked symbols with the file and the line.
sieve ask "how does the dev server handle hot module replacement" --sourceask how does the dev server handle hot module replacement · 8 hits 1 [packages/vite/] createServerModuleRunner fn packages/vite/src/node/ssr/runtime/serverModuleRunner.ts:143-160 function createServerModuleRunner( environment: DevEnvironment, options: ServerModuleRunnerOptions = {}, ): ModuleRunner ```export function createServerModuleRunner( environment: DevEnvironment, options: ServerModuleRunnerOptions = {},): ModuleRunner { const hmr = createHMROptions(environment, options) return new ModuleRunner(...See who calls a symbol, to the depth you choose. Each edge says exact or inferred.
sieve callers handleHMRUpdate --depth 2handleHMRUpdate fn packages/vite/src/node/server/hmr.ts:411-6792 callers · 5 within 2 hops├─ testRestartDuringHotUpdate fn packages/vite/src/node/server/__tests__/hmr.spec.ts:6-40│ │ 34: handleHMRUpdate(│ └─ hmr.spec.ts file packages/vite/src/node/server/__tests__/hmr.spec.ts:1-56└─ onHMRUpdate fn packages/vite/src/node/server/index.ts:908-915 │ 913: await handleHMRUpdate(type, file, server) ├─ onFileAddUnlink fn packages/vite/src/node/server/index.ts:917-953 └─ onFileChange fn packages/vite/src/node/server/index.ts:955-969[sieve] saved ≈ 20,282 tokensRun it on a diff. See what depends on the changed lines, and whether a test reaches them.
sieve blastyour diff changes handleHMRUpdate · 1 symbol in 2 files · 1 of 1 reached by a test · working tree vs HEAD3 callers affected within 2 hops└─ onHMRUpdate fn packages/vite/src/node/server/index.ts:908-915 ├─ onFileAddUnlink fn packages/vite/src/node/server/index.ts:917-953 └─ onFileChange fn packages/vite/src/node/server/index.ts:955-9691 test suite also references this code (not listed)tests for handleHMRUpdate were not updatedask for review 翠 (80 commits, 11d ago) · btea (4 commits, 28d ago)not indexed 1 file: .gitignoreCode says what. Records say why.
sieve why links a symbol to the decision records that explain it, plus the tests that cover it. A record is an ADR file or a LEDGER.md entry with a - **Code:** line. Your existing ADR folder works as it is.
sieve why savings_linewhy savings_line crates/sieve-savings/src/lib.rs:96decision docs/adr/adr-0004-savings-header.md:1 ADR 0004: Each query result opens with one savings line link: Code anchortest crates/sieve-savings/src/lib.rs:236 savings_line_names_the_given_producttest crates/sieve-savings/src/lib.rs:248 test_savings_sieve_header_has_no_tally_instruction...Real output from the Sieve repo.
How why reads your recordsA pane for Claude Code, and six small friends.
Run sieve init --mod, then /sieve-pane. The pane shows callers, impact, decision records and saved tokens next to your session.
A status line keeps a pixel mascot in view. Sieve, the kitchen sieve, is the default. Run /sieve-mascot soya if you prefer the poodle.
Pick a mascot
/sieve-mascot sieveIt stays on your machine.
- No network call. A query never leaves your laptop.
- No API key. No model pass. Your code is not sent to a provider.
- No telemetry.
sieve initwrites only inside the repo unless you pass--global.
Numbers you can repeat.
- Index 1,583 files from scratch
- 1.83s
- Re-index with no change
- 0.80s
- Median answer to a question (185 ms max)
- 158ms
- of exact cross-file calls match the TypeScript compiler (1,232 of 1,232, name‑level)
- 100%
vite · 1,583 files · Apple M1 Pro · Sieve 0.1.0 · method →
Limit Sieve prints a token estimate after each query. Token savings in a real agent session are not measured yet.
Any MCP host.
sieve mcp serves the index over stdio with seven tools: find code, find all, trace calls, file API, repo map, check freshness and why.
{ "mcpServers": { "sieve": { "command": "sieve", "args": ["mcp"] } } }Three lines to your first answer.
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/iamalvisng/sieve/releases/latest/download/sieve-cli-installer.sh | shbrew install iamalvisng/tap/sievecargo binstall sieve-climacOS and Linux.macOS and Linux only for now.
sieve build .sieve ask "how does login work"