Funktionen

Ein Binary, alles drin

Was du davon hast

Ein Befehl installiert greppy, danach ist alles da. Keine Python-Umgebung, kein Modell-Server, kein Language Server, kein Account. Dein Agent ruft eine Datei auf, und die beantwortet Graph-Fragen, sucht nach Bedeutung und schreibt Kurzbeschreibungen mit zwei Modellen auf deiner GPU. Index, Graph und Embeddings entstehen auf deinem Rechner und bleiben dort. Der Browser für Web-Aufgaben liegt im selben Paket.

Was drin ist

$ greppy --version
greppy 0.4.1
$ du -sh v0.4.1 v0.4.1/bin/greppy v0.4.1/bin/web-runtime
1.1G    v0.4.1
944M    v0.4.1/bin/greppy
178M    v0.4.1/bin/web-runtime
Teil liegt in gemessen
CLI mit tree-sitter-Parsern, SQLite, Symbolgraph und Inferenz mit Metal-Kernels bin/greppy 974.329.232 Byte
Google EmbeddingGemma 300M (Q4_K) für die Suche nach Bedeutung im Binary 238.991.680 Byte, "embedded": true
Qwen3.5-0.8B (Q4_K_M), von uns per Destillation trainiert, für die Kurzbeschreibungen im Binary "embedded": true
Browser-Laufzeit auf der Engine Servo bin/web-runtime/ 178 MB
Workspace-Beschleunigung für Agenten: FSKit auf macOS, FUSE3 auf Linux im Paket, optional einrichten mit greppy workspace setup

Das Binary bindet ausschließlich Bibliotheken von macOS selbst. SQLite, die Parser und die Modelle sind einkompiliert.

greppy doctor zeigt, was davon läuft: das gewählte Backend, die GPU, beide Inferenz-Daemons und den Index.

$ greppy doctor
status: ok
…
store_bytes: 28553554
store_mode: single
embedding_complete: true
inference: preference=auto explicit=false selected=metal device=metal:0000000100000471
…
  backend metal compiled=true available=true score=300 abi=1
    device metal:0000000100000471 Apple M5 memory_free=26800144384 memory_total=26800603136
…
  daemon embedding state=ready endpoint=/tmp/greppy-daemon-501/embedding-29a0b2f328340be0f959015526e5022b.sock
  daemon summary state=ready endpoint=/tmp/greppy-daemon-501/summary-54edb0d71ff2d80862083125f394706b.sock
project: serde
…
stats: files=339 nodes=4573 edges=9427
…

Ohne Netz

Eine macOS-Sandbox sperrt jede IP-Verbindung, curl scheitert darin sofort. greppy indiziert in derselben Sandbox ein neues Projekt, rechnet die Embeddings mit dem eingebetteten Modell (2 inference misses), beantwortet eine Suche mit Kurzbeschreibungen und findet die Aufrufer.

$ cat ../../no-ip-network.sb
(version 1)
(allow default)
(deny network-outbound (remote ip))
(deny network-inbound (local ip))
$ sandbox-exec -f ../../no-ip-network.sb curl -sS -m 10 -o /dev/null https://github.com
curl: (7) Failed to connect to github.com port 443 after 75 ms: Couldn't connect to server
$ sandbox-exec -f ../../no-ip-network.sb greppy index .
…
indexed 1 files (0 unsupported, 0 unreadable, 0 oversize, 0 file-limit, 0 time-budget); 2 nodes extracted; generation 1 (project: shop)
embedded 2 code spans (0 local-store reused, 0 global-cache hits, 2 inference misses, 5 considered, 3 non-definition skipped, 0 missing-file, 0 invalid-span, 0 oversize, 0 failed, 0 stale pruned)
$ sandbox-exec -f ../../no-ip-network.sb greppy search "remove VAT from a gross price"
pricing.py:1  net_price — computes a rounded net price from a gross value and vat_rate
pricing.py:5  invoice_net_total — sums the net_price of items using vat_rate
$ sandbox-exec -f ../../no-ip-network.sb greppy who-calls net_price
pricing.py:6  invoice_net_total

Die beiden Inferenz-Daemons halten keinen IP-Socket: lsof -i findet an ihnen nichts.

So funktioniert es

greppy ist ein natives Rust-Programm. Die tree-sitter-Parser für über 60 Sprachen und SQLite sind einkompiliert, die Gewichte und Tokenizer beider Modelle eingebacken. Die Inferenz läuft in Rust mit mitgelieferten Metal-Kernels auf Apple Silicon und CUDA-Kernels auf Linux, ohne Python, ohne Modell-Server, ohne HTTP.

Alle greppy-Prozesse und Agenten schicken ihre Modellarbeit an zwei lokale Daemons pro Nutzer, einen für Embeddings und einen für Kurzbeschreibungen. Sie sprechen über Unix-Sockets, und ein geladenes Modell bedient die Anfragen aller Prozesse reihum. Der Index liegt in einer SQLite-Datei außerhalb deines Repositorys; für serde mit 339 Dateien sind das 28,6 MB.

Die Browser-Laufzeit ist ein eigenes Programm im selben Paket, greppy web steuert sie.

Plattform Inferenz Paket im Release v0.4.1
macOS auf Apple Silicon Metal greppy-macos-arm64.pkg, 843.885.302 Byte
Linux x86_64 mit NVIDIA-GPU CUDA greppy-linux-x86_64.deb, 887.138.928 Byte, und greppy-linux-x86_64.rpm, 945.828.766 Byte

Das Installationsskript erkennt die Plattform, prüft die SHA-256 des Pakets und legt greppy unter ~/.local/share/greppy/versions/<version> ab.

Die Befehle

Befehl was er tut
greppy --version zeigt die installierte Version
greppy doctor prüft Index, Inferenz-Backend, GPU und beide Daemons
greppy doctor --json dazu Modell-ID, Format und SHA-256 beider eingebetteter Modelle
greppy doctor --device metal legt das Inferenz-Backend fest: auto (Standard), metal oder cuda[:INDEX], für jeden Befehl
greppy workspace setup richtet die Workspace-Beschleunigung für Agenten ein, FSKit auf macOS, FUSE3 auf Linux
greppy workspace status zeigt Agenten-Workspaces und den Zustand des Providers

Mehr in der Doku