{"id":46933153,"url":"https://github.com/bvolpato/ivygrep","last_synced_at":"2026-06-30T14:00:58.608Z","repository":{"id":343551121,"uuid":"1178143922","full_name":"bvolpato/ivygrep","owner":"bvolpato","description":"Semantic Grep - Superpower Your LLM","archived":false,"fork":false,"pushed_at":"2026-06-24T02:13:25.000Z","size":9201,"stargazers_count":5,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T02:23:08.450Z","etag":null,"topics":["embedding","fastgrep","ivygrep","llm","mcp","mit","productivity","ripgrep"],"latest_commit_sha":null,"homepage":"https://bvolpato.github.io/ivygrep/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bvolpato.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-10T18:23:55.000Z","updated_at":"2026-06-19T18:40:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bvolpato/ivygrep","commit_stats":null,"previous_names":["bvolpato/ivygrep"],"tags_count":114,"template":false,"template_full_name":null,"purl":"pkg:github/bvolpato/ivygrep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bvolpato%2Fivygrep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bvolpato%2Fivygrep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bvolpato%2Fivygrep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bvolpato%2Fivygrep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bvolpato","download_url":"https://codeload.github.com/bvolpato/ivygrep/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bvolpato%2Fivygrep/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34969682,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["embedding","fastgrep","ivygrep","llm","mcp","mit","productivity","ripgrep"],"created_at":"2026-03-11T05:09:46.868Z","updated_at":"2026-06-30T14:00:58.568Z","avatar_url":"https://github.com/bvolpato.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"ivygrep logo\" width=\"180\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eSemantic code search that never uploads your code.\u003c/strong\u003e\u003cbr/\u003e\n  Ask questions in English. Get answers in code. Local inference.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/actions\"\u003e\u003cimg src=\"https://github.com/bvolpato/ivygrep/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/actions/workflows/security.yml\"\u003e\u003cimg src=\"https://github.com/bvolpato/ivygrep/actions/workflows/security.yml/badge.svg\" alt=\"Security\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/actions/workflows/relevance.yml\"\u003e\u003cimg src=\"https://github.com/bvolpato/ivygrep/actions/workflows/relevance.yml/badge.svg\" alt=\"Relevance\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/bvolpato/ivygrep?color=%2334d058\u0026label=release\" alt=\"Latest Release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/bvolpato/ivygrep/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/bvolpato/ivygrep/total?color=%23ff6f00\" alt=\"Downloads\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/hero-banner.png\" alt=\"ivygrep semantic code search\" width=\"600\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://bvolpato.github.io/ivygrep/\"\u003eWebsite\u003c/a\u003e ·\n  \u003ca href=\"https://bvolpato.github.io/ivygrep/benchmarks/\"\u003eBenchmarks\u003c/a\u003e ·\n  \u003ca href=\"AGENT_INTEGRATION.md\"\u003eAI Agents\u003c/a\u003e ·\n  \u003ca href=\"ARCHITECTURE.md\"\u003eArchitecture\u003c/a\u003e ·\n  \u003ca href=\"CONTRIBUTING.md\"\u003eContributing\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## ⚡ Quick Start\n\n**Install via Homebrew (recommended):**\n```bash\nbrew install bvolpato/tap/ivygrep\n```\n\n**Linux / macOS:**\n```bash\ncurl -fsSL https://raw.githubusercontent.com/bvolpato/ivygrep/main/install.sh | sh\n```\n\n**Windows PowerShell:**\n```powershell\nirm https://raw.githubusercontent.com/bvolpato/ivygrep/main/install.ps1 | iex\n```\n\nInstallers pick the right archive, verify its SHA-256 checksum, install `ig`,\nand print the installed version. PowerShell also updates the user `PATH`.\nWindows uses the same USearch ANN backend as Linux and macOS, Rust-managed\npersistence, long-path support, and a statically linked Visual C++ runtime.\n\nEvery release ships checksums, SPDX JSON SBOMs, and provenance sidecars. CI\nextracts and runs the exact archive bytes before publishing:\n\n| Target | Release behavior | Offline fallback |\n|---|---|---|\n| Linux x86_64 musl | Static binary, baseline x86-64 exercised under QEMU `qemu64` | Hash search, no model or service |\n| Linux aarch64 musl | Static binary exercised under ARM64 QEMU in Alpine | Hash search, no model or service |\n| macOS Intel | Native archive with Accelerate-backed local neural inference | Hash search |\n| macOS Apple Silicon | Native archive with Accelerate-backed local neural inference | Hash search |\n| Windows x86_64 | Native USearch ANN plus local CPU neural inference | Hash search |\n\nArchive checks cover startup, indexing, hybrid/hash/literal/regex search,\ndaemon equivalence, status/doctor, stale-index rebuild, and removal. `ig`\nneeds no Python, compiler, system database, or external service. Neural mode\nmay download its pinned model once; `--hash` and hash-only builds do not.\n\nQuality, latency, footprint, release size, unavailable comparisons, and the\nclaim policy live in the\n[evidence dashboard](https://bvolpato.github.io/ivygrep/benchmarks/evidence-dashboard.html).\n\n**Build from source:**\n```bash\ngit clone https://github.com/bvolpato/ivygrep.git \u0026\u0026 cd ivygrep\n./build.sh\ninstall -m 0755 ./target/release/ig ~/.local/bin/ig\n```\n\n**Developer targets:**\n```bash\n./build.sh --help\n./test.sh --help\n./bench.sh --help\n\n./build.sh          # release binary\n./build.sh --features accelerate,metal  # opt-in macOS Metal neural inference\n./build.sh --features cuda  # opt-in Linux CUDA neural inference\n./test.sh --quick   # fast local check\n./test.sh           # fmt, clippy, unit/integration tests\n./bench.sh          # critical Criterion benchmark, no stale local baseline comparison\n```\n\n**Your first search:**\n```bash\nig \"authentication flow\"            # auto-indexes on first run, then searches\nig \"error handling\" src/api/         # scope to a directory\nig --all \"database migrations\"      # search across all indexed projects\n```\n\nNo config, prompts, or API keys. First run auto-indexes the workspace and\nstarts a background daemon for incremental updates. Neural mode may download\nmodel artifacts once; `--hash` and hash-only builds do not.\n\n\u003cp\u003e\n  \u003cimg src=\"assets/ig-demo.gif\" alt=\"ivygrep demo: searching the opencode repo\" width=\"700\" /\u003e\n\u003c/p\u003e\n\n---\n\n## 🤖 MCP server for AI agents\n\nUse `ig --mcp` when an agent needs code search without loading whole files into\ncontext.\n\n```bash\nig --mcp    # starts MCP server on stdio\n```\n\nBefore connecting an agent, run `ig --version` in the same environment that\nlaunches it. GUI applications may not inherit your interactive shell's `PATH`;\nuse the absolute path to `ig` or `ig.exe` in that case.\n\n### Setup for coding agents\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eClaude Code\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nclaude mcp add -s user ig -- ig --mcp\n```\nOr add to `~/.claude.json`:\n```json\n{\n  \"mcpServers\": {\n    \"ig\": { \"type\": \"stdio\", \"command\": \"ig\", \"args\": [\"--mcp\"] }\n  }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCursor\u003c/b\u003e\u003c/summary\u003e\n\nAdd to `.cursor/mcp.json` or `~/.cursor/mcp.json`:\n```json\n{\n  \"mcpServers\": {\n    \"ig\": { \"type\": \"stdio\", \"command\": \"ig\", \"args\": [\"--mcp\"] }\n  }\n}\n```\nThen refresh MCP servers in Cursor settings.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eGemini\u003c/b\u003e\u003c/summary\u003e\n\n```bash\ngemini mcp add --scope user --transport stdio ig ig --mcp\n```\nOr add to `~/.gemini/settings.json`:\n```json\n{\n  \"mcpServers\": {\n    \"ig\": { \"command\": \"ig\", \"args\": [\"--mcp\"] }\n  }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCodex\u003c/b\u003e\u003c/summary\u003e\n\n```bash\ncodex mcp add ig -- ig --mcp\ncodex mcp get ig --json\n```\n\nThe CLI and IDE extension share `~/.codex/config.toml`. Trusted repositories\ncan instead use a project-scoped `.codex/config.toml`.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eOpenCode\u003c/b\u003e\u003c/summary\u003e\n\nAdd to `opencode.json`:\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"ig\": {\n      \"type\": \"local\",\n      \"command\": [\"ig\", \"--mcp\"],\n      \"enabled\": true\n    }\n  }\n}\n```\n\u003c/details\u003e\n\n### Recommended agent behavior\n\nGive the agent this persistent instruction in `AGENTS.md`, `CLAUDE.md`,\n`GEMINI.md`, or the equivalent rules file:\n\n```text\nUse the ivygrep MCP tools for code discovery before broad filesystem scans.\nPass the absolute current repository or worktree path to ig_search.\nUse natural-language queries for concepts and literal=true for exact identifiers.\nUse limit to choose retrieval breadth and context to choose source lines per hit.\nStart with limit=5-10 and context=2. Increase context when a promising hit needs\nmore evidence; increase limit when you need more candidate files.\nUse ig_status when indexing health is unclear.\n```\n\n`ig_search` is restricted to the supplied workspace, auto-indexes on first use,\nstarts incremental watching, and accepts subdirectory or file paths for narrower\nscope. In a Git worktree, pass that worktree's root: ivygrep reuses the shared\nbase index and stores only overlay deltas and tombstones.\n\nSee [Coding agent integration](AGENT_INTEGRATION.md) for verified configs,\ntool-selection guidance, worktree behavior, and troubleshooting.\n\n---\n\n## 🤔 What is ivygrep?\n\n**ivygrep (`ig`)** is local semantic code search. It mixes BM25/literal lookup\nwith vector search, so queries can describe intent instead of exact tokens.\n\n| Feature | `grep` / `rg` | GitHub Search | [zoekt](https://github.com/google/zoekt) | **ivygrep** |\n|---------|:---:|:---:|:---:|:---:|\n| Works offline | ✅ | ❌ | ✅ | ✅ |\n| Natural language queries | ❌ | ⚠️ | ❌ | ✅ |\n| Semantic understanding | ❌ | ❌ | ❌ | ✅ |\n| Warm indexed query latency | ✅ | ❌ | ✅ | ✅ |\n| Privacy-first (no upload) | ✅ | ❌ | ✅ | ✅ |\n| Git-native worktrees/branches | ❌ | ❌ | ❌ | ✅ |\n| Structural code chunking | ❌ | ❌ | ⚠️ | ✅ |\n| Incremental indexing | ❌ | ❌ | ❌ | ✅ |\n| MCP server for AI agents | ❌ | ❌ | ❌ | ✅ |\n\n### 🌍 45 language/file types\n\nivygrep indexes 45 language/file types. 24 use Tree-sitter AST chunking:\nRust, Python, Go, JavaScript, TypeScript/TSX, Java, C, C++, C#, Scala, Kotlin,\nPHP, Ruby, Swift, Elixir, Zig, Bash, Haskell, OCaml, Lua, Dart, Objective-C,\nPerl, and Starlark macros/targets in very large BUILD-like sources.\n\n- **Systems:** Rust, C, C++, Zig, Nim\n- **Backend:** Python, Go, Java, Kotlin, Scala, C#, Ruby, PHP, Perl, Groovy\n- **Web \u0026 Mobile:** JavaScript, TypeScript, HTML, CSS, GraphQL, Swift, Dart, Objective-C\n- **Functional:** Haskell, OCaml, Elixir, Erlang, Clojure\n- **Data, Scripting \u0026 Config:** R, Julia, Bash/Shell, PowerShell, Lua, SQL, Protobuf, Thrift, Terraform, Starlark/Bazel, Dockerfile, Makefile, Markdown, XML, TOML/YAML/INI/env config, JSON, plain text\n\nUnknown extensions are auto-detected and indexed as text.\n\n---\n\n## 🚀 Performance and speed\n\nRelease-readiness validation used a **Linux kernel** checkout with 93,502\nindexed files and 4,419,660 chunks:\n\n| Scenario | Metric | Result |\n|------|------|-----:|\n| Fresh lexical-first Linux kernel index | full rebuild | ~270 sec |\n| Large-repo natural query | process-cold p95 | ~137 ms |\n| Warm daemon identical-query replay | end-to-end p95 | ~79 ms |\n| Warm daemon distinct queries | end-to-end p95 | ~116 ms |\n| Portable Linux intent relevance | 13 labeled queries | 41.20 |\n| Best retained dedicated-host daemon run | identical-query p95 | ~4.9 ms |\n| Historical eager-vector Linux kernel index | full rebuild | ~27.3 min |\n| Lexical-first scoped stress probe | 10,501 files | ~3 sec |\n| Warm daemon correctness guard | daemon/local hits | 20 / 20 |\n\nLatency depends on CPU, storage, repository shape, index state, and\nvirtualization. Public quality, latency, refresh, and resource evidence lives\nunder [`docs/benchmarks/`](docs/benchmarks/).\n\nIndexing publishes BM25/literal search first. A load-aware background process\nbuilds hash ANN vectors, then upgrades to the portable 256-dimensional\n`static-retrieval-v1` model selected by the public embedding bake-off. Optional\nprofiles remain available through `IVYGREP_MODEL_PROFILE`: `potion-code`,\n`general`, `code`, and `code-hq`. Model identity is stored with the index, so\nincompatible vectors are rebuilt.\n\nResource knobs:\n\n- `IVYGREP_NEURAL_THREADS`: desired transformer worker ceiling.\n- `IVYGREP_NEURAL_MEMORY_MB`: smaller explicit memory budget for worker sizing.\n- `IVYGREP_NEURAL_BATCH_SIZE`: local benchmark override for background batches.\n- `IVYGREP_NEURAL_ACCELERATOR_HANDLES`: shared-model CUDA/Metal concurrency.\n- `IVYGREP_NEURAL_FOREGROUND_ACCELERATOR=0`: force CPU query embedding.\n\nCUDA builds read `nvidia-smi` free VRAM, total VRAM, and utilization before\nchoosing batch size. Linux memory accounting honors effective cgroup limits,\nincluding containers.\n\nRelevance evaluation separates foreground readiness from post-background hash\nquality:\n\n```bash\nuv run scripts/eval_relevance.py\nuv run scripts/eval_relevance.py --enhance-hash\nuv run scripts/run_public_benchmark_matrix.py \\\n  --profile public-core \\\n  --datasets-root /tmp/ivygrep-public-datasets \\\n  --work-root /tmp/ivygrep-public-results \\\n  --output public-code-retrieval-results.json\n```\n\nThe public matrix pins 20 CoIR task/language variants plus a compact\n1,000-query, 48-language baseline. Reports include checksums, quality, variance,\nlatency, memory, and index size under [`docs/benchmarks/`](docs/benchmarks/).\n\n---\n\n## 🏗️ Architecture and git\n\nGit behavior is part of the index design:\n- **Worktree overlays:** Reuses one base search index. Per-worktree SQLite, lexical, and vector stores contain only divergent chunks and tombstones; lightweight Merkle metadata tracks filesystem state.\n- **Branch-switch deltas:** Merkle reconciliation re-indexes *only* changed files upon branch switch instead of rebuilding the search index.\n- **Content-based deduplication:** Byte-identical files are never re-indexed across branches.\n- **`.gitignore` native:** Respects rules automatically at every level.\n\n**Tech stack:** `tantivy` (BM25), `usearch` (ANN), `tree-sitter` (AST), SQLite\nsymbol/call graph storage,\n`candle_embed` / `candle-core` (local neural embeddings), and `xxh3` hashes.\n\n---\n\n## 🔒 Security and privacy\n\nivygrep runs search and embedding inference locally. It never sends code,\nqueries, or index data to an external service.\n\n- **Where data lives:** compressed source chunks live under `~/.local/share/ivygrep` (or `$XDG_DATA_HOME`/`$IVYGREP_HOME`). Unix uses an owner-only `0600` socket plus peer-uid verification. Windows uses loopback TCP with a per-daemon token beside the user-owned index. Keep custom `IVYGREP_HOME` paths private.\n- **Model download:** neural mode downloads revision-pinned assets with `hf-hub` on first use and caches them under `$HF_HOME` or `~/.cache/huggingface`. Use `--hash` or a `--no-default-features` build when model assets must never be downloaded.\n- **Inference backend:** release binaries run locally: Accelerate-backed CPU math on macOS, CPU on Linux/Windows. Source builds can opt into Metal (`--features accelerate,metal`) or CUDA (`--features cuda`). CUDA does not require cuDNN. Set `CUDA_COMPUTE_CAP` explicitly when auto-detection is wrong; `ig --status` reports the backend that last generated neural vectors.\n- **Resource controls:** indexing refuses to start below 512 MiB available memory, background enhancement pauses below 1 GiB, and optional transformer workers share model weights plus an adaptive memory budget. These checks use native available-memory reporting on macOS and Windows and cgroup-aware reporting on Linux.\n- **Secrets in your repo:** ivygrep indexes file *contents*, including config/dotfiles (e.g. `.env`) unless they're gitignored. Those contents are stored in the local index and can appear in search snippets. Keep secrets out of the workspace or in `.gitignore`.\n- **MCP scope:** `ig_search` only searches the workspace at the supplied `path`.\n\n---\n\n## 🔧 CLI reference\n\n```bash\n# Core workflow\nig \"your query\"                    # search current workspace\nig \"query\" ~/other/project         # search a different workspace\nig --add .                         # register \u0026 index a workspace\nig --rm .                          # unregister a workspace\nig --status                        # show workspace health \u0026 embedding status\nig --doctor                        # inspect index health for the current workspace\nig --doctor --deep                 # run full cross-store integrity scans\nig --doctor --fix                  # rebuild a broken or stale index\n\n# Search modes\nig --interactive \"query\"             # interactive TUI with file/snippet browsing\nig --literal \"fn_name\"               # fast exact-match search (index-backed)\nig --lexical-only \"query\"          # BM25/path/signature retrieval only\nig --hash \"query\"                  # force hash embeddings (skip neural)\nig --symbol calculate_tax          # exact definitions\nig --refs calculate_tax            # indexed references/calls\nig --callers calculate_tax         # caller chunks\n\n# Output control\nig -n 5 \"query\"                    # at most 5 ranked result files\nig -C 4 \"query\"                    # up to 4 lines before and after each match\nig -n 5 -C 8 \"query\"               # 5 files with richer snippets\nig --type rust \"query\"             # filter by language\nig --include \"*.rs,*.go\" \"query\"   # include globs\nig --exclude \"vendor/**\" \"query\"   # exclude globs\nig --json \"query\"                  # machine-readable JSON\nig --first-line-only \"query\"       # compact grep-style output\nig --file-name-only \"query\"        # file paths only\n\n# Daemon and server\nig --daemon                        # start background watcher\nig --mcp                           # start MCP server (stdio)\n```\n\n`--limit` controls retrieval breadth. `--context` controls snippet size.\nNeither is a relevance threshold.\n\n| Control | What it changes | Ranking |\n|---|---|---|\n| `-n N`, `--limit N` | Searches a candidate pool sized for the request and returns at most `N` ranked files | The same relevance signals apply; a deeper pool can slightly change ranks |\n| `--no-limit` | Uses maximum candidate budgets and returns every result that survives relevance filtering | Can change ranks and is slower |\n| `-C N`, `--context N` | Shows up to `N` source lines before and after each focused match | Unchanged |\n| `--first-line-only` | Reduces each result to one preview line after retrieval | Unchanged |\n| `--file-name-only` | Returns paths only; without `-n`, the CLI also uses maximum candidate budgets | Unchanged with `-n`; without `-n`, the deeper pool can change ranks |\n\n- Smaller limits truncate ranked files. Larger limits search deeper and can\n  slightly rerank top results.\n- `--no-limit` uses maximum candidate budgets and can be much slower.\n- `-C`, `--first-line-only`, and `--file-name-only -n N` change presentation\n  after retrieval.\n- `--file-name-only` without `-n` also uses maximum candidate budgets.\n- Agents should start with `-n 5` to `-n 10` and `-C 2`. Increase context for\n  more lines from the same file; increase limit for more candidate files.\n- Scores order one query's results. They are not global confidence values.\n- ivygrep does not expose a total token-budget parameter.\n\n---\n\n## 🧪 Development\n\n```bash\n./test.sh           # fmt, ShellCheck, clippy, Rust and Python harness tests\n./build.sh --locked # release binary, Cargo.lock unchanged\n./build.sh --locked --features accelerate,metal  # opt-in macOS Metal neural binary\n./build.sh --locked --features cuda  # opt-in Linux CUDA neural binary\n./bench.sh          # critical Criterion benchmark, no stale local baseline comparison\n```\nTests cover unit behavior, CLI snapshots, concurrency, golden queries, public\nretrieval metrics, symbols/callers, incremental CRUD, MCP, daemon recovery,\ngit/worktrees, Merkle properties, and benchmark guards. Criterion repeats short\noperations inside stable timed samples.\n\n### End-to-end procedures\n```bash\n./build.sh\n./scripts/e2e_procedures.sh --binary ./target/release/ig\npython3 scripts/check_daemon_equivalence.py \\\n  --skip-build \\\n  --binary ./target/release/ig \\\n  --bench-home /tmp/ivygrep-daemon-equivalence\n\n# Opt-in macOS Metal backend validation. Downloads local model artifacts once.\n./build.sh --locked --features accelerate,metal\n./scripts/e2e_neural_backend.sh --binary ./target/release/ig --model-profile general --expect-backend \"Candle Metal\"\n\n# Opt-in Linux CUDA backend validation. Downloads local model artifacts once.\n./build.sh --locked --features cuda\n./scripts/e2e_neural_backend.sh --binary ./target/release/ig --model-profile general --expect-backend \"Candle CUDA\"\n```\nSmoke tests use throwaway projects and isolated `IVYGREP_HOME` directories. The\nneural backend check embeds fixture text locally and verifies backend reporting.\n\n### Stress testing\n```bash\n./scripts/bootstrap_stress_fixtures.sh\n./test.sh --stress\n```\n\n## Roadmap\n\n- **More Tree-sitter languages:** add SQL and other mature grammars.\n- **Evidence-backed search program:** track the quality,\n  latency, footprint, and portability work in\n  [#128](https://github.com/bvolpato/ivygrep/issues/128).\n- **Learned reranking:** evaluate compact local cross-encoders against the\n  bounded deterministic reranker without weakening offline portability.\n- **Editor integrations:** VS Code and Neovim Telescope.\n- **Background job resilience:** better queue diagnostics and resumable worker state.\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n---\n\n\u003cp align=\"center\"\u003e\n  Built by \u003ca href=\"https://github.com/bvolpato\"\u003e@bvolpato\u003c/a\u003e · Released under the MIT License\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbvolpato%2Fivygrep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbvolpato%2Fivygrep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbvolpato%2Fivygrep/lists"}