greppy ist der token-effizienteste Coding-Harness.
greppy trimmt Suchen, Lesen, Ändern, Testen und die Arbeit im Web auf maximale Token-Effizienz. Deine Agents erledigen ihre Aufgaben damit schneller, günstiger und besser, mit schlankem Kontext und klarem Fokus.
- 80 %weniger Kosten beim Beantworten von Fragen zur Codebasis
- 40 %mehr gelöste Aufgaben
- 3×so viele umgesetzte Features
- 47 %weniger Kosten pro umgesetztem Feature
greppy läuft als Plugin in Claude Code, Codex, Gemini CLI, pi und OpenCode und bringt einen eigenen Harness zum Einsatz als Subagent mit.
Echte Aufgaben aus Open-Source-Projekten
ironclaw: Laufstatus für die Weboberfläche bereitstellen
3 von 3 Läufen gelöst statt 1 von 347 % weniger Kosten pro gelöster Aufgabe
Der Agent soll in ironclaw, einem Rust-Projekt, eine Abfrage des Laufstatus für die Weboberfläche bauen. Mit greppy findet er die zuständige Fassade mit der ersten Suche und sieht die Datei als Liste ihrer Definitionen, 4.810 Zeichen. Darin steht die vorhandene Prüfung parse_thread_id_field, und er nutzt sie.
Ohne greppy liest er dieselbe Datei komplett, 29.359 Zeichen, und schreibt trotzdem einen eigenen Parser. Der meldet eine ungültige Thread-ID mit dem falschen Fehler, ein Test des Projekts schlägt fehl. Mit greppy lösen alle drei Läufe die Aufgabe, ohne greppy einer.
Gemessen mit pi und glm-5.3-flash.
| Ohne greppy | Mit greppy | ||
|---|---|---|---|
| Ergebnis | Tests rot | Tests grün | |
| Input (neu) | 93.116 | 71.278 | −23 % |
| Cache-Read | 2.203.392 | 3.436.544 | +56 % |
| Output | 24.455 | 25.388 | +4 % |
| Runden | 42 | 82 | +95 % |
| Zeit | 13:03 min | 13:16 min | +2 % |
Ohne greppy
- ls -la /ironclaw3.532 Zeichen
- find /ironclaw -maxdepth 2 -type d | head -501.394 Zeichen
- grep -ri "RebornServices" /ironclaw --include="*.rs" -l | head -20445 Zeichen
- grep -ri "TurnCoordinator" /ironclaw --include="*.rs" -l | head -201.246 Zeichen
- ls -la /ironclaw/crates/ironclaw_product_workflow/src/ /ironclaw/crates/ironclaw_product_w1.421 Zeichen
- git -C /ironclaw log --oneline -15; git -C /ironclaw status68 Zeichen
- liest crates/ironclaw_product_workflow/src/reborn_services.rs29.359 Zeichen
- ls -la /ironclaw/crates/ironclaw_product_workflow/src/reborn_services/ 2>/dev/null; grep -220 Zeichen
- liest crates/ironclaw_product_workflow/src/reborn_services/types.rs3.329 Zeichen
- liest crates/ironclaw_product_workflow/tests/reborn_services_contract.rs30.611 Zeichen
- liest crates/ironclaw_product_workflow/src/webui_inbound.rs14.386 Zeichen
- liest crates/ironclaw_product_workflow/src/reborn_services/error.rs1.937 Zeichen
- grep -rn "TurnRunState\|GetRunStateRequest\|TurnRunFailure\|pub struct EventCursor\|RunFai4.827 Zeichen
- liest crates/ironclaw_product_workflow/src/lib.rs2.467 Zeichen
- grep -rn "pub struct TurnRunState" /ironclaw/crates/ironclaw_turns/src/ -A 403.397 Zeichen
- grep -rn "pub struct SanitizedFailure\|pub enum SanitizedFailure" /ironclaw/crates/ironcla2.386 Zeichen
- grep -rn "get_run_state\|GetRunState" /ironclaw/docs /ironclaw/FEATURE_PARITY.md /ironclaw11 Zeichen
- grep -rn "RebornServices\|reborn_services" /ironclaw/crates/ironclaw_reborn_composition/sr2.659 Zeichen
- grep -rn "pub struct TurnCheckpointId\|impl TurnCheckpointId\|pub struct RunProfileId\|imp11 Zeichen
- liest crates/ironclaw_turns/src/status.rs4.248 Zeichen
- grep -rn "TurnCheckpointId\b" /ironclaw/crates/ironclaw_turns/src/lib.rs; grep -rn "pub st252 Zeichen
- grep -rn "RunProfileId\|RunProfileVersion\|TurnCheckpointId" /ironclaw/crates/ironclaw_tur84 Zeichen
- liest crates/ironclaw_turns/src/ids.rs7.145 Zeichen
- grep -rn "SanitizedFailure" /ironclaw/crates --include="*.rs" | grep -v "ironclaw_turns/sr2.581 Zeichen
- grep -rn "failure" /ironclaw/crates/ironclaw_product_adapters/src/*.rs | head -20; ls /iro2.628 Zeichen
- cargo test -p ironclaw_product_workflow --test reborn_services_contract 2>&1 | tail -201.177 Zeichen
- grep -rn "impl ThreadId" /ironclaw/crates/ironclaw_host_api/src/ -A 30 | head -50; grep -r39 Zeichen
- grep -rn "ThreadId" /ironclaw/crates/ironclaw_host_api/src/*.rs | grep -i "struct\|fn new"235 Zeichen
- grep -rn "ThreadId" /ironclaw/crates/ironclaw_host_api/src/ids.rs | head; grep -rn "macro_1.025 Zeichen
- liest crates/ironclaw_host_api/src/ids.rs3.085 Zeichen
- … 25 weitere Schritte69.654 Zeichen
Mit greppy
- greppy where-am-i3.266 Zeichen
- greppy search "RebornServices facade WebUI submit cancel resolve gate run state"1.277 Zeichen
- greppy read crates/ironclaw_product_workflow/src/reborn_services.rs4.810 Zeichen
- greppy read crates/ironclaw_product_workflow/src/reborn_services/types.rs2.154 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/reborn_services.rs --lines 1:1053.551 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/reborn_services/types.rs --lines 1:13.459 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/reborn_services.rs --lines 105:47015.009 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/reborn_services.rs --lines 470:76010.736 Zeichen
- greppy search "RunState run state snapshot status event cursor gate failure checkpoint" --145 Zeichen
- greppy read-file crates/ironclaw_turns/src/status.rs --lines 200:3404.974 Zeichen
- greppy search-symbol GetRunStateRequest68 Zeichen
- greppy read-file crates/ironclaw_turns/src/request.rs --lines 1:1201.597 Zeichen
- greppy read crates/ironclaw_product_workflow/tests/reborn_services_contract.rs --head 2009.445 Zeichen
- greppy read-file crates/ironclaw_product_workflow/tests/reborn_services_contract.rs --line7.144 Zeichen
- greppy read crates/ironclaw_product_workflow/src/webui_inbound.rs::WebUiResolveGateRequest940 Zeichen
- greppy read crates/ironclaw_product_workflow/src/webui_inbound.rs4.696 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/webui_inbound.rs --lines 65:43012.382 Zeichen
- greppy read crates/ironclaw_product_workflow/src/reborn_services/error.rs1.490 Zeichen
- greppy search "SanitizedFailure failure category sanitized"1.015 Zeichen
- greppy read-file crates/ironclaw_turns/src/status.rs --lines 1:2005.750 Zeichen
- greppy read crates/ironclaw_product_workflow/src/reborn_services/error.rs::Class::RebornSe562 Zeichen
- greppy read-file crates/ironclaw_product_workflow/tests/reborn_services_contract.rs --line2.706 Zeichen
- greppy read-file crates/ironclaw_product_workflow/tests/reborn_services_contract.rs --line1.909 Zeichen
- greppy search-pattern "pub use|pub mod" crates/ironclaw_product_workflow/src/lib.rs551 Zeichen
- greppy read crates/ironclaw_turns/src/events.rs::EventCursor205 Zeichen
- greppy read-file crates/ironclaw_product_workflow/src/lib.rs --lines 25:701.550 Zeichen
- greppy read crates/ironclaw_turns/src/run_profile.rs::RunProfileId && greppy read crates/i221 Zeichen
- greppy search-symbol RunProfileId && greppy search-symbol RunProfileVersion && greppy sear496 Zeichen
- greppy search-pattern "struct RunProfileId|struct RunProfileVersion|struct AcceptedMessage600 Zeichen
- greppy rg -n "pub struct RunProfileId|pub struct RunProfileVersion|pub struct AcceptedMess736 Zeichen
- … 68 weitere Schritte61.767 Zeichen
ruff: Widerspruch zwischen zwei Lint-Regeln beheben
36 % weniger Kosten beim Beheben des Bugs
Der Agent soll in ruff, dem Python-Linter in Rust, einen Widerspruch zwischen zwei Regeln beheben. Mit greppy findet er die zuständige Regel mit einem Aufruf in 100 Zeichen und liest danach genau die Funktionen, die er braucht, etwa comment_contains_code mit 1.681 Zeichen.
Ohne greppy liest er die beteiligten Dateien komplett, detection.rs, suppression.rs und noqa.rs zusammen 118.799 Zeichen. Beide Läufe bestehen die Tests des Projekts, mit greppy für 0,15 $ statt 0,24 $.
Gemessen mit pi und glm-5.3-flash.
| Ohne greppy | Mit greppy | ||
|---|---|---|---|
| Ergebnis | Tests grün | Tests grün | |
| Input (neu) | 108.994 | 85.162 | −22 % |
| Cache-Read | 6.548.544 | 3.987.008 | −39 % |
| Output | 50.525 | 39.967 | −21 % |
| Runden | 95 | 78 | −18 % |
| Zeit | 23:55 min | 26:02 min | +9 % |
Ohne greppy
- ls /ruff && git -C /ruff log --oneline -3356 Zeichen
- find /ruff/crates/ruff_linter/src -name "*.rs" | xargs grep -ln "commented_out_code"179 Zeichen
- liest crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs6.408 Zeichen
- liest crates/ruff_linter/src/checkers/tokens.rs5.226 Zeichen
- ls /ruff/crates/ruff_linter/src/rules/eradicate/36 Zeichen
- liest crates/ruff_linter/src/rules/eradicate/detection.rs16.270 Zeichen
- ls /ruff/crates/ruff_linter/src/rules/ruff/rules/ | head -501.378 Zeichen
- liest crates/ruff_linter/src/rules/ruff/rules/unused_noqa.rs4.308 Zeichen
- grep -rn "UnusedCodes\|unused_noqa\|UnusedNOQA" /ruff/crates/ruff_linter/src --include="*.2.132 Zeichen
- grep -rn "CommentedOutCode" /ruff/crates/ruff_linter/src --include="*.rs" | grep -v snapsh900 Zeichen
- liest crates/ruff_linter/src/suppression.rs51.254 Zeichen
- liest crates/ruff_linter/src/noqa.rs51.275 Zeichen
- grep -rn "find_line_with_directive_mut\|find_line_with_directive\|directive.used\|used:" /50 Zeichen
- grep -rn "find_line_with_directive_mut\|RUF100\|unused_noqa\|UnusedNOQA" /ruff/crates/ruff39 Zeichen
- grep -rn "NoqaDirectives" /ruff/crates/ruff_linter/src --include="*.rs" | grep -v "noqa.rs461 Zeichen
- grep -rn "NoqaMapping\|NoqaDirectives\|check_noqa\|mark_used\|set_used" /ruff/crates/ruff_654 Zeichen
- grep -rn "check_suppressions\|Suppressions" /ruff/crates/ruff_linter/src --include="*.rs" 1.912 Zeichen
- ls /ruff/crates/ruff_linter/src/checkers/;89 Zeichen
- liest crates/ruff_linter/src/checkers/noqa.rs11.125 Zeichen
- ls /ruff/crates/ruff_linter/resources/test/fixtures/eradicate/ && head -100 /ruff/crates/r1.511 Zeichen
- grep -rn "noqa" /ruff/crates/ruff_linter/resources/test/fixtures/eradicate/ERA001.py | hea90 Zeichen
- liest crates/ruff_linter/src/rules/ruff/mod.rs5.684 Zeichen
- grep -n "fn line_str\|fn line_range\|fn full_line_range\|fn full_lines_range\|fn line_star1.470 Zeichen
- cat -A /ruff/crates/ruff_linter/resources/test/fixtures/ruff/RUF100_5.py472 Zeichen
- ls /ruff/crates/ruff_linter/src/rules/ruff/snapshots/ | grep -i ruf100336 Zeichen
- cat /ruff/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__ruf2.149 Zeichen
- ls /ruff/target/debug/ruff 2>/dev/null && /ruff/target/debug/ruff --version; ls /ruff/targ11 Zeichen
- ls /ruff/target 2>/dev/null; cargo --version; rustc --version72 Zeichen
- cargo build -p ruff --bin ruff 2>&1 | tail -5317 Zeichen
- mkdir -p /tmp/repro && cd /tmp/repro && printf '#\t)\n#\t) # noqa: ERA001\n' > repro.py &464 Zeichen
- … 79 weitere Schritte70.645 Zeichen
Mit greppy
- greppy search-symbol commented_out_code100 Zeichen
- greppy search "detect commented-out code eradication"1.160 Zeichen
- greppy read commented_out_code.rs::commented_out_code606 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/detection.rs --lines 1:135228 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs::Function::1.125 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/detection.rs --head 1402.174 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/detection.rs::Function::comment_contain1.681 Zeichen
- greppy read-file crates/ruff_linter/src/rules/eradicate/detection.rs --lines 1:1354.113 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs::Function::730 Zeichen
- greppy who-calls comment_contains_code1.062 Zeichen
- greppy read-file crates/ruff_linter/src/rules/eradicate/rules/commented_out_code.rs --line3.164 Zeichen
- greppy search "parse an inline noqa directive from a comment"1.027 Zeichen
- greppy search-symbol parse_inline_noqa512 Zeichen
- greppy read crates/ruff_linter/src/suppression.rs::parse_suppression_comment664 Zeichen
- greppy read crates/ruff_linter/src/noqa.rs::lex_inline_noqa429 Zeichen
- greppy search "a suppression comment with pragma kind and codes" --kind struct625 Zeichen
- greppy read crates/ruff_linter/src/suppression.rs --head 12012.169 Zeichen
- greppy read crates/ruff_linter/src/suppression.rs::SuppressionParser::parse_comment crates1.317 Zeichen
- greppy read-file crates/ruff_linter/src/suppression.rs --lines 1:1304.268 Zeichen
- git log --oneline -3 2>/dev/null | cat && ls target/debug/ruff 2>/dev/null; ls target 2>/d49 Zeichen
- printf '\t\t\t# \t)\n\t\t\t# \t) # noqa: ERA001\n' > repro.py && cat -A repro.py42 Zeichen
- ls crates/ruff_linter/resources/test/fixtures/eradicate/ && greppy search-symbol commented169 Zeichen
- greppy search "test ERA001 rule over a fixture" --path crates/ruff_linter/src/rules/eradic1.244 Zeichen
- greppy read crates/ruff_linter/src/rules/eradicate/mod.rs::rules 2>/dev/null || greppy rea510 Zeichen
- cat crates/ruff_linter/resources/test/fixtures/eradicate/ERA001.py1.746 Zeichen
- ls crates/ruff_linter/resources/test/fixtures/eradicate/snapshots/ 2>/dev/null || find cra109 Zeichen
- cat crates/ruff_linter/src/rules/eradicate/snapshots/ruff_linter__rules__eradicate__tests_7.527 Zeichen
- greppy read crates/ruff_linter/src/suppression.rs::SuppressionParser::eat_action crates/ru3.203 Zeichen
- greppy who-calls crates/ruff_linter/src/suppression.rs::SuppressionParser::parse_comment; 1.062 Zeichen
- greppy read crates/ruff_linter/src/suppression.rs::SuppressionsBuilder::load_from_tokens8.329 Zeichen
- … 69 weitere Schritte94.011 Zeichen
ArcadeDB: verlorene Messwerte bei gleichzeitigen Inserts beheben
28 % weniger Kosten beim Beheben des Bugs
Der Agent soll in ArcadeDB, einer Datenbank in Java, einen Datenverlust beheben: Bei vielen gleichzeitigen Inserts in eine Zeitreihe gehen Messwerte verloren. Mit greppy beschreibt er die gesuchte Stelle in einem Satz, landet bei der Methode, die Messwerte an einen Shard anhängt, und liest danach einzelne Methoden der Transaktionslogik wie commit1stPhase.
Ohne greppy liest er die beteiligten Klassen komplett, TimeSeriesShard, TimeSeriesBucket und TransactionContext zusammen 109.095 Zeichen. Beide Läufe bestehen die Tests des Projekts, mit greppy für 0,36 $ statt 0,50 $.
Gemessen mit pi und glm-5.3-flash.
| Ohne greppy | Mit greppy | ||
|---|---|---|---|
| Ergebnis | Tests grün | Tests grün | |
| Input (neu) | 160.153 | 250.396 | +56 % |
| Cache-Read | 14.644.224 | 9.934.336 | −32 % |
| Output | 69.725 | 46.779 | −33 % |
| Runden | 169 | 136 | −20 % |
| Zeit | 40:00 min | 40:00 min | +0 % |
Ohne greppy
- ls /arcadedb && cat /arcadedb/pom.xml | head -502.313 Zeichen
- find /arcadedb -type d -name "*timeseries*" -o -type d -name "*timeSeries*" -o -type d -na124 Zeichen
- find /arcadedb/engine/src/main/java/com/arcadedb/engine/timeseries -type f -name "*.java" 2.574 Zeichen
- ls /arcadedb/engine/src/test/java/com/arcadedb/engine/timeseries/ && cat /arcadedb/CLAUDE.6.116 Zeichen
- grep -n "Disabled" /arcadedb/engine/src/test/java/com/arcadedb/engine/timeseries/TimeSerie439 Zeichen
- liest engine/src/test/java/com/arcadedb/engine/timeseries/TimeSeriesConcurrentInsertTest.j4.077 Zeichen
- liest engine/src/main/java/com/arcadedb/engine/timeseries/TimeSeriesBucket.java29.867 Zeichen
- liest engine/src/main/java/com/arcadedb/engine/timeseries/TimeSeriesShard.java42.347 Zeichen
- find /arcadedb/engine/src/main/java -name "TransactionContext.java" -o -name "TransactionM307 Zeichen
- liest engine/src/main/java/com/arcadedb/database/TransactionContext.java36.881 Zeichen
- grep -rn "class TransactionManager" /arcadedb/engine/src/main/java/com/arcadedb/engine/Tra265 Zeichen
- grep -rn "txContexts\|getTransaction()\|begin()" /arcadedb/engine/src/main/java/com/arcade960 Zeichen
- sed -n 440,560p /arcadedb/engine/src/main/java/com/arcadedb/database/LocalDatabase.java3.265 Zeichen
- find /arcadedb/engine/src/main/java -name "PageManager.java" | xargs cat | sed -n 1,200p8.019 Zeichen
- find /arcadedb/engine/src/main/java -name "PageManager.java" | xargs sed -n 200,420p10.166 Zeichen
- find /arcadedb/engine/src/main/java -name "CachedPage.java" | xargs cat4.352 Zeichen
- find /arcadedb/engine/src/main/java -name "DatabaseContext.java" | xargs cat9.064 Zeichen
- grep -rn "getWrappedDatabaseInstance" /arcadedb/ha-raft/src/main/java --include="*.java" |708 Zeichen
- sed -n 470,600p /arcadedb/ha-raft/src/main/java/com/arcadedb/server/ha/raft/RaftReplicated3.812 Zeichen
- grep -n "class RaftReplicatedDatabase\|extends\|implements" /arcadedb/ha-raft/src/main/jav1.036 Zeichen
- sed -n 108,330p /arcadedb/ha-raft/src/main/java/com/arcadedb/server/ha/raft/RaftReplicated10.672 Zeichen
- git log --oneline -10 2>/dev/null; git status 2>/dev/null | head -2068 Zeichen
- grep -rn "appendSamples" engine/src/main/java/com/arcadedb/engine/timeseries/TimeSeriesEng831 Zeichen
- grep -rn "TimeSeries\|timeseries" --include="*.java" engine/src/main/java/com/arcadedb/que794 Zeichen
- grep -n "TimeSeries\|timeSeries\|appendSamples" engine/src/main/java/com/arcadedb/query/sq790 Zeichen
- liest engine/src/main/java/com/arcadedb/engine/timeseries/TimeSeriesEngine.java27.110 Zeichen
- grep -n "public TransactionContext getTransaction\|getTransaction()" engine/src/main/java/2.538 Zeichen
- find engine/src/main/java -name "PageManager.java" | xargs sed -n 420,530p3.843 Zeichen
- mvn -q -pl engine -am compile -DskipTests 2>&1 | tail -5247 Zeichen
- ls ~/.m2 2>/dev/null; which mvn; echo $MAVEN_HOME; echo $M2_HOME; ls /opt/tools 2>/dev/nul383 Zeichen
- … 143 weitere Schritte117.259 Zeichen
Mit greppy
- ls && git log --oneline -5544 Zeichen
- greppy where-am-i4.269 Zeichen
- greppy search-symbol TimeSeries --all --limit 60 2>&1 | head -807.238 Zeichen
- greppy search "append single sample to shard with lock and nested transaction"1.172 Zeichen
- greppy brief TimeSeriesShard42.171 Zeichen
- greppy brief TimeSeriesBucket 2>&1 | head -502.580 Zeichen
- greppy read TimeSeriesBucket::appendSamples 2>&1 | head -1201.699 Zeichen
- greppy brief TransactionContext 2>&1 | head -60238 Zeichen
- greppy search "nested transaction commit defers durable publish to outer transaction" --al1.522 Zeichen
- greppy read engine/src/main/java/com/arcadedb/database/TransactionContext.java --lines 1:1228 Zeichen
- greppy read-file engine/src/main/java/com/arcadedb/database/TransactionContext.java --line7.313 Zeichen
- greppy search "begin pushes nested transaction context onto per-thread stack" --all --limi999 Zeichen
- greppy search-symbol txContexts --all --limit 20467 Zeichen
- greppy read LocalDatabase::begin 2>&1 | head -40668 Zeichen
- greppy read-file engine/src/main/java/com/arcadedb/database/DatabaseContext.java --lines 12.489 Zeichen
- greppy read LocalDatabase::commit 2>&1 | head -60649 Zeichen
- greppy read TransactionContext::commit2ndPhase 2>&1 | head -802.829 Zeichen
- greppy read TransactionContext::commit1stPhase 2>&1 | head -1504.655 Zeichen
- greppy read RaftReplicatedDatabase::commit 2>&1 | head -1004.947 Zeichen
- greppy read RaftReplicatedDatabase::commit --handle 2>&1 | tail -5; greppy read-file ha-ra2.107 Zeichen
- greppy search-symbol PageManager --all --limit 201.708 Zeichen
- greppy brief PageManager 2>&1 | head -803.719 Zeichen
- greppy read PageManager::updatePages 2>&1 | head -701.500 Zeichen
- greppy read PageManager::checkPageVersion 2>&1 | head -602.276 Zeichen
- greppy read TimeSeriesBucket::getOrCreateActiveDataPage 2>&1 | head -601.968 Zeichen
- greppy search "load mutable page for transaction or overwrite current page" --limit 15923 Zeichen
- greppy read TransactionContext::getPageToModify 2>&1 | head -40572 Zeichen
- greppy read PageManager::getPageToModify 2>&1 | head -60303 Zeichen
- greppy read TransactionContext::getPageToModify --all --limit 10 2>&1 | head -20; greppy s370 Zeichen
- greppy read-file engine/src/main/java/com/arcadedb/database/TransactionContext.java --line1.008 Zeichen
- … 126 weitere Schritte164.010 Zeichen
Was greppy ausmacht
Dein Agent sieht, wie der Code zusammenhängt
Wer ruft diese Funktion auf, was hängt an einer Änderung, über welche Aufrufe kommt ein Request von der Route bis in die Datenbank? greppy beantwortet jede dieser Fragen mit einem Aufruf, mit Datei und Zeile.
Code finden, den man nur beschreiben kann
„Passwort eines Nutzers prüfen“ führt direkt zu checkPassword. greppy sucht nach dem, was Code tut, und schreibt unter jeden Treffer einen Satz, wozu er da ist. Dein Agent wählt den richtigen Treffer, bevor er eine Zeile liest.
Eine Funktion verstehen, bevor man sie liest
brief fasst eine Funktion in einem Satz zusammen, skizziert ihren Ablauf Schritt für Schritt und nennt ihre Aufrufer. read-smart zeigt die Gestalt einer langen Funktion und fasst tiefe Blöcke in je einer Zeile zusammen. Danach liest der Agent gezielt den Teil, den er braucht.
Genau ein Symbol lesen, genau ein Symbol ändern
greppy read liefert eine Funktion, eine Methode oder einen Typ; für eine Datei liefert es ihre Gliederung. Geändert wird ebenso gezielt: ein Symbol ersetzen, überall umbenennen, mehrere Dateien in einem Patch. undo nimmt jede Änderung in einem Schritt zurück.
Ein Testlauf, ein Urteil
bash-smart führt Build, Test oder Linter unverändert aus. Die erste Zeile ist das Urteil, darunter stehen genau die Fehler und Warnungen. Das volle Log holt der Agent mit einem Befehl, wenn er es braucht.
Der Browser ist eingebaut
Dein Agent sucht im Web, liest Dokumentation, füllt Formulare aus und prüft ein Deployment, alles aus der Shell. Seiten kommen als kompakte Struktur in den Kontext, Daten gezielt per extract.
Jeder Agent in seiner eigenen Kopie, sofort
greppy gibt jedem Agenten einen privaten Workspace mit deinem aktuellen Stand, offene Änderungen eingeschlossen. Viele Agenten arbeiten parallel am selben Repository, jeder in seiner eigenen Kopie. Jeder liefert einen Commit, den du prüfst und übernimmst.
Einmal indiziert, in jedem Worktree bereit
Der erste Checkout baut Graph und Embeddings. Jeder weitere Git-Worktree und jeder Agent übernimmt sie und indiziert nur seine eigenen Änderungen.
Aufgaben abgeben, Commits zurückbekommen
greppy -p startet einen Coding-Agenten mit greppy als einzigem Werkzeug, jeweils in eigenem Workspace. Dein Hauptagent verteilt Aufgaben, jeder Subagent meldet sich mit einem Ergebnis und einem Commit zurück. greppy agent öffnet denselben Agenten als Terminal-Oberfläche.
Ein Binary, alles drin
Parser, Datenbank, Embedding-Modell und Sprachmodell stecken in einer Datei, der Browser liegt im selben Paket. Ein Befehl installiert greppy; Index, Graph und Embeddings entstehen auf deinem Rechner und bleiben dort.
Alles, was dein Agent kennt, funktioniert weiter
Jeder grep-Aufruf läuft durch das echte grep, mit identischer Ausgabe und denselben Exit-Codes; ripgrep-Aufrufe gehen an rg. Dein Agent behält seine gewohnten Befehle und bekommt greppys Werkzeuge dazu.
Über 60 Sprachen, ein Befehlssatz
Dieselben Befehle für jede Sprache im Repository. Rust, Python, Java, JavaScript, TypeScript, Go, C++, C#, Kotlin, Swift und Ruby haben einen vollständig getesteten Graph.
Zwei Wege, ein Paket
Als Plugin in deinem Harness
Ein Befehl installiert greppy und trägt es in Claude Code, Codex, Gemini CLI, pi und OpenCode ein. Dein Agent sucht, liest und testet ab sofort über greppy und behält alles andere, wie es ist.
curl -fsSL https://greppy.xyz/install.sh | sh
Als eigener Harness für Subagents
greppy -p startet einen Agenten mit genau einem Werkzeug in seinem eigenen Copy-on-Write-Workspace. Viele laufen parallel, teilen sich Index und Modelle und melden sich mit einer Zeile Ergebnis und einem Commit zurück.
Der Agent braucht ein Modell-Gateway.
greppy -p "Nutzer können sich selbst folgen. Behebe das."
115 Fragen zur Codebasis, vier Modelle
- bis zu 50
- Prozentpunkte mehr richtige Antworten
- bis zu 80 %
- geringere Kosten für die beste Qualität des grep-Agenten
Installieren
curl -fsSL https://greppy.xyz/install.sh | shmacOS (Apple Silicon) und Linux (x86-64). Ein Binary.
Alle Optionen