Repository navigation
Releases: keltokhy/jgrep
Release list
jev-grep 0.4.1
- The tool itself is unchanged from 0.4.0; this release brings its README on PyPI up to date.
- Compare DiffusionGemma and Laya with Jev 1.13 on jgrep's benchmarks, in
docs/benchmarks/local-models-2026-09-22.mdand its JSON, summarized in the README. - Add
bench/backend_eval.py, which runs and scores a local server, andbench/context_eval.py,
the length and evidence-position test.bench/code_review.pynow requires--apiand--model.
jev-grep 0.4.0
- Add
--api diffusiongemmaand--api layafor System One servers running on your own machine,
throughjevkit-runtime0.3: chosen only by name, no key needed, and metered at zero API fees
unlessJEV_PRICE_PER_MTOKis set. The runtime'sdocs/explain how to run the servers.
jev-grep 0.3.0
- Move transport, configuration, the answer cache and metering to the shared
jevkit-runtime0.2.
Answers are keyed by provider, endpoint and model and stored with who answered them; the cache
written by earlier versions is reset on first use and re-asked. A 200 response without answers is
an error rather than a retry, and a stored answer that fails validation is an error rather than a hit. - Label context without a commit id as the function in the working tree, including in the judge's
question. Only the hunk's new-side lines at their given position are checked; surrounding code
may have changed. Plain diff and fallback requests retain their existing questions and cache keys. - Report macro-headed C bodies that parse as a call followed by a bare block, and count changes
inside them assyntax_errorunder-W. Skipped C diagnostics give the whole covered line range
instead of a function name that may belong to a preceding prototype. - Preserve text hunks in commit streams ending in a rename, mode-only change or empty-file change;
trim trailing separators and mail signatures without shifting input locations. Skip annotated-tag
preambles, and decode quoted paths containing raw UTF-8 as well as octal byte escapes. - Add C to
--functionsthrough Tree-sitter in the[code]extra:--lang c, inferred from.c
and.h. Functions the parser read without error are emitted with adjacent comments and exact
spans. Functions and regions it cannot read, usually around a macro or#if, are skipped and
reported by line range in one error per file rather than failing the file or guessing at boundaries. - Read
git log -p,git showandgit format-patchstreams with--diff, one commit at a time.
These were previously rejected as content outside a hunk. Hunks carry the commit id as
unit.commit(null for a plain patch), export IDs include it, and a commit whose patch cannot be
read no longer hides later commits. - Add
-W/--function-contextand--repofor--diff: judge each hunk with the Python, Go or C
function that encloses it, read at the hunk's commit or from the working tree, while printing the
hunk alone. Hunks that cannot be given a function are judged alone and counted by reason in
stderr,unit.context, and--estimate --json. Oversized functions are shortened around the
change and reported; oversized hunks still fail.--estimateprices the context and
--emit-recordsshows it. - Count patch lines at line feeds only. A form feed or lone carriage return inside a source line
previously made a valid patch fail. - Do not print Python
SyntaxWarnings raised by the source files being read. - Confine
-Wto the repository. The allowed root is found without trusting repository config, so
a repository that pointscore.worktreeorGIT_WORK_TREEoutside itself stops the run instead
of reading outside files; working-tree paths are resolved with their symlinks and refused when
they leave the repository; and Git runs with a fixed argument list and an environment that blocks
promisor fetches, object replacement, and prompts. Treat--repoas a repository you trust. - Bound the source
-Wreads: a new-side file larger than 10 MiB is a countedsource_too_large
fallback, read neither from a commit nor the working tree, and a named pipe no longer blocks. - Trim
git format-patchmails: read the patch after the last---separator and stop at the--
signature, so a message containingdiff --gitor a dash-led signature no longer voids the patch. - Recognize abbreviated commit ids down to four hex digits (
git log --abbrev-commit). - Keep reading a stream after a commit with a malformed quoted path, and report skipped C before a
file's functions so a match limit or quiet mode cannot end the run with it unreported. - Read a Python source file that begins with a byte-order mark instead of reporting a syntax error.
- Leave two pre-existing diff-reader issues outside this change: CRLF-converted patches can retain
\rinnew_fileand add spurious metadata-only errors; quoted paths with spaces can also add
a spurious metadata-only error.
jev-grep 0.2.1
- Scope answer caches and offline estimates to the provider and endpoint as well as model and input.
Existing entries without that identity are not reused. - Bound ordered work by
-j, including completed results waiting behind a slow record, while
allowing fatal errors and budget limits to stop promptly. - Preserve complete Python functions containing Unicode separators or form feeds, and separate
Go functions that share a line using parser columns and exact character offsets.
Validation: 185 tests passed on Python 3.10 and 3.13; package metadata checks, credential scans, and installed-wheel smoke checks passed. Published PyPI artifact hashes match the verified local builds.
jgrep 0.2.0 — complete changes and functions
jgrep can now search complete changes and functions while preserving their source locations.
uv tool install 'jev-grep[code]'
git diff --no-color | jgrep --diff "removes error handling"
jgrep --functions "ignores a failed rollback" installer.go --json--diffjudges removals, additions and unchanged context together. Malformed or unsupported diffs produce errors.--functionsextracts Python functions/methods and optional Tree-sitter Go functions. Code units are never silently truncated.--estimatepreviews calls and approximate cost offline, reading existing cache entries without writing them.--emit-recordsexports source-linked JSONL for jselect and other tools, without model calls.
159 tests passed on Python 3.10 and 3.13. Fresh-wheel installation, optional dependencies, stdin, source references, the jselect handoff, and a live diff query were checked.
The 20-case handwritten experiment found fewer records to review with complete hunks/functions. It also records remaining false positives and a jselect diversity comparison that worsened precision. These are small synthetic measurements, not production accuracy claims or proof of general bug detection.
jgrep 0.1.1
Version 0.1.1 adds structured-record filtering, recursive file search, and passage search for long documents. It also fixes hangs and incorrect results around read failures, malformed API responses, repeated input files, numeric limits, timeouts, and early exits.
- Judge a JSONL field or CSV column while preserving the complete matching record:
--jsonl --field messageor--csv --field abstract. - Search directories with
-r,--glob,--exclude, nested.gitignore/.ignorerules, and-lfor matching filenames. - Find matching passages beyond the default character limit with
--chunks Nand--overlap N. JSON output includes passage numbers and source offsets. Ordinary searches now warn about truncation. - Show neighboring records to the model with
-C. - Use a System One-compatible gateway through
--api gateway,JEV_GATEWAY_URL, andJEV_GATEWAY_API_KEY. - Apply
-mper file, handle-m 0without reading input, enforce request deadlines, and cancel outstanding work when a run stops.
Install or upgrade:
uv tool install jev-grep
# For an existing installation:
uv tool upgrade jev-grepValidation: 125 offline tests on Python 3.10 and 3.13, plus installed-wheel command-line checks against a local gateway, including live-stdin early exit.