Dokumentation

Builds und Tests ausführen

greppy bash-smart führt einen Build-, Test- oder Lint-Befehl unverändert aus und behält seinen Exit-Code. Zurück kommen ein einzeiliges Urteil, die Fehler- und Warnungsblöcke und ein Log, dessen lange Strecken gefaltet sind, statt komplett gedruckt zu werden. Dein Agent sieht das Entscheidende zuerst, und nichts geht verloren: Die Rohausgabe bleibt abrufbar.

greppy bash-smart -- cargo test
greppy bash-smart -- npm run build
greppy bash-smart -e 'panicked at' -- cargo test

Der Agent-Prompt sagt Agenten, jeden Build-, Test- oder Lint-Befehl so auszuführen. Siehe Agent-Setup.

Ein Testlauf mit einem Fehler

Das Beispiel ist ein kleines Python-Projekt mit 380 Tests, einer davon schlägt fehl: slugify("Rust & Python") liefert rust---python statt rust-python.

greppy bash-smart -- python3 -m unittest -v
FAILED — exit 1: 4 errors, 0 warnings
383  FAIL: test_slug_07 (tests.test_textkit.SlugifyTest.test_slug_07)
…
392  AssertionError: 'rust---python' != 'rust-python'
401  FAILED (failures=1)
… partial output — raw log "/var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stdout"; read with greppy read-file
test_clamp_00 (tests.test_textkit.ClampTest.test_clamp_00) ... ok
…
test_clamp_109 (tests.test_textkit.ClampTest.test_clamp_109) ... ok
… lines 22-320 (299 collapsed lines) — raw log "/var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stderr"; read with greppy read-file
test_slug_00 (tests.test_textkit.SlugifyTest.test_slug_00) ... ok
… lines 322-327 (6 collapsed lines) — raw log "/var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stderr"; read with greppy read-file
328:test_slug_07 (tests.test_textkit.SlugifyTest.test_slug_07) ... FAIL
test_slug_08 (tests.test_textkit.SlugifyTest.test_slug_08) ... ok
… lines 330-341 (12 collapsed lines) — raw log "/var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stderr"; read with greppy read-file
…
Ran 380 tests in 0.006s

FAILED (failures=1)

Zuerst kommen Urteil und Fehlerblock, jede Zeile mit ihrer Nummer in der Rohausgabe. Danach folgt das Log: der Anfang, die gefalteten Strecken, die hervorgehobene Zeile 328 mit dem fehlschlagenden Test und das komplette Ende mit Traceback und Zusammenfassung. Der Exit-Code ist der von unittest, hier 1.

Gefaltete Zeilen zurückholen

Jede Faltung nennt, wie du an die Zeilen kommst. Mit Expansion-Speicher endet sie mit — greppy expand ID, und greppy expand ID druckt die gespeicherten Rohzeilen seitenweise, mit --offset und --limit gezielt. Im Lauf oben war der Expansion-Speicher belegt; dann nennt die Faltung die Rohlog-Datei, und greppy read-file holt die Zeilen.

greppy read-file /var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stderr --lines 320:329
/private/var/folders/hf/x8jpryjx6xs8k0kwmkj5spkw0000gn/T/greppy-bash-smart-501/5460-1791407870089721000.stderr:320-329
test_clamp_99 (tests.test_textkit.ClampTest.test_clamp_99) ... ok
test_slug_00 (tests.test_textkit.SlugifyTest.test_slug_00) ... ok
test_slug_01 (tests.test_textkit.SlugifyTest.test_slug_01) ... ok
test_slug_02 (tests.test_textkit.SlugifyTest.test_slug_02) ... ok
test_slug_03 (tests.test_textkit.SlugifyTest.test_slug_03) ... ok
test_slug_04 (tests.test_textkit.SlugifyTest.test_slug_04) ... ok
test_slug_05 (tests.test_textkit.SlugifyTest.test_slug_05) ... ok
test_slug_06 (tests.test_textkit.SlugifyTest.test_slug_06) ... ok
test_slug_07 (tests.test_textkit.SlugifyTest.test_slug_07) ... FAIL
test_slug_08 (tests.test_textkit.SlugifyTest.test_slug_08) ... ok

Rohes stdout und stderr bleiben byte-genau erhalten: Die Vorschau ersetzt nie den Mitschnitt, und ein fehlschlagender Befehl bleibt ein Fehlschlag. Die vollständigen Regeln stehen im Display-Vertrag.

Das Urteil

Zeile 1 ist das Urteil, mit Exit-Code und den gezählten Fehler- und Warnungsblöcken:

ok — exit 0
FAILED — exit 1: 1 error, 0 warnings
FAILED — exit 1: 4 errors, 0 warnings

Danach kommen die Fehler- und Warnungsblöcke und jede Zeile, die auf ein -e REGEX passt. Der Rest wird kompakt und abrufbar. Der Exit-Code von bash-smart ist der Exit-Code des Befehls, Skripte und CI behandeln es also genau wie das Original.

Was du siehst

Ausgabe Anzeige
Kurze Ausgabe (bis 80 Zeilen insgesamt) einmal nach dem Urteil, auf ihrem ursprünglichen stdout- oder stderr-Stream; die Diagnosen stehen nicht noch einmal davor, ihre Zahl steht im Urteil
Längere Ausgabe zuerst Fehler- und Warnungsblöcke, dann das Log mit gefalteten Strecken; jede Faltung nennt greppy expand ID oder die Rohlog-Datei
Eine einzelne Zeile über 4096 Bytes Vorschau aus den ersten 2048 und den letzten 1024 Bytes plus Hinweis auf die ausgelassenen Bytes und die Rohlog-Datei
Timeouts und unterbrochene Ausgabe behalten ihr Diagnose-Präfix und ihr Recovery-Paket

Zeilen hervorheben

-e REGEX hebt jede passende Zeile eines langen Logs über die gefaltete Ausgabe, mit ihrer Zeilennummer. Für mehrere Muster wiederholst du es:

greppy bash-smart -e 'test_clamp_150' -e '^Ran ' -- python3 -m unittest -v
FAILED — exit 1: 4 errors, 0 warnings
383  FAIL: test_slug_07 (tests.test_textkit.SlugifyTest.test_slug_07)
…
401  FAILED (failures=1)
67  test_clamp_150 (tests.test_textkit.ClampTest.test_clamp_150) ... ok
399  Ran 380 tests in 0.005s
…

Befehle, Umgebung und Pipelines

bash-smart führt das argv nach -- direkt aus.

Eingabe Verhalten
führende VAR=value-Tokens werden Umgebungsvariablen des Kindprozesses
Shell-Builtins und Operatoren übergibst du als einen gequoteten Ausdruck; ungequotete Shell-Syntax lehnt greppy mit Exit 64 ab und zeigt die gequotete Form
gequotete Ausdrücke laufen in Bash mit pipefail, ein fehlschlagender Producer wird also nicht von einem erfolgreichen tail oder grep verdeckt
$ greppy bash-smart -- GREETING=hallo python3 -c 'import os; print(os.environ["GREETING"])'
ok — exit 0
hallo
$ greppy bash-smart -- cd tests
greppy: invalid request: bash-smart received unquoted shell syntax; pass the complete shell expression as one quoted argument, for example `greppy bash-smart -- "cd DIR && COMMAND"`
$ greppy bash-smart -- 'python3 -m unittest 2>&1 | tail -n 3'
FAILED — exit 1: 1 error, 0 warnings
Ran 380 tests in 0.009s

FAILED (failures=1)

Der zweite Befehl endet mit Exit 64, der dritte mit Exit 1, obwohl tail selbst erfolgreich war.

Lang laufende Befehle

Druckt ein Befehl 15 Sekunden lang nichts, schreibt bash-smart ein Lebenszeichen auf stderr, danach eines pro Minute. Es nennt die PID des direkten Kindprozesses und die verstrichene Zeit. So hält niemand einen aktiven cargo- oder Testlauf für einen toten Wrapper, während seine Ausgabe mitgeschnitten wird.

greppy bash-smart -- 'sleep 80; echo fertig'
bash-smart: command still running — pid=16694, elapsed=15s; child output is being captured and will be summarized on exit
bash-smart: command still running — pid=16694, elapsed=75s; child output is being captured and will be summarized on exit
ok — exit 0
fertig

Wenn der Index beschäftigt ist

bash-smart wartet nicht auf die Indexierung. Hält gerade ein Indexer den Store des Repositorys, startet der Befehl sofort, und nur die optionale Expansion-Speicherung entfällt. greppy meldet das mit bash-smart: index writer active; command execution continues without expansion storage; long output stays compact with raw-log paths instead of expand IDs. Das Falten funktioniert weiter und nennt die Rohlog-Datei statt einer Expand-ID.

Im eingebauten Agenten

Der eingebaute Agent hat genau ein Tool, greppy, und führt seine Befehle darüber als bash-smart -- CMD aus. So erreicht Build-Ausgabe das Modell kompakt.