Skip to content
MrJev

jev-pruner

Claude Code plugin that uses Jev to trim long Bash output before it reaches the model, leaving errors, source code, and structured output untouched.

View on GitHub →

Hands-on review

Asks Jev which lines of a long command's output the agent still needs, and drops the rest. Careful about losing things; not careful about sending them.

Good for

  • Long builds and test runs whose output floods an agent's context
  • Keeping errors, warnings and result lines while dropping progress noise
  • Studying a fail-open design: every failure path returns the original output

Watch out for

  • The whole command output and the session history go to TypeSafe, unredacted
  • Raising keepThreshold above 0.1 changes nothing; a floor overrides it
  • On Claude Code the request has no timeout, so a hung call holds up the result

Tested Sep 20, 2026 at 47d017c34eab · Node 24 in Docker, offline, running its own 276-test suite with a stub asker

How we reviewed this: we ran its full test suite in Docker on Node 24 with no network, read the code that builds each request, and checked its retention rules against the documentation. We did not run it inside a live Claude Code or Codex session — that needs an early-access hook feature and a paid account — so everything here comes from the code and its own tests.

What it does

jev-pruner, by Tamara Tran, hooks the moment a Bash command finishes inside a coding agent and trims the output before the model sees it. Long test runs, installs and builds spend thousands of tokens on progress bars; this keeps the lines that matter.

Code does most of the work. Output under a token floor is passed through untouched. Documents, source files, JSON, diffs and the output of commands like cat, jq and git diff are protected whole. Diagnostic and result lines — warnings, failures, test totals, exit status, artifact paths — are kept by pattern, with their surrounding context. What’s left is chunked, and each chunk gets one Noul question:

Chunk c03 contains at least one line that should remain available to the agent for its ongoing task. […] Uncertain or unclassified information is needed unless every line is confidently disposable.

That last clause is the design in miniature: the default is to keep. A chunk survives if any history segment votes to keep it, unscored chunks survive, refinement failures survive, and request failures return the original output verbatim.

Its test suite is the most thorough we’ve run in this ecosystem: 276 tests across 20 files, all passing offline, including six that assert the output is returned byte-for-byte unchanged when the API answers 401, 429, 5xx, invalid JSON, missing answers or missing scores.

What it sends

The request state is built in stateFor(), and it is worth reading closely:

return {
  context: OUTPUT_CONTEXT,
  ...(category === 'build' || category === 'search' ? { category, categoryGuidance } : {}),
  task: input.goal,
  history,
  command: input.command,
  diagnosticsAndResults,
  chunks: chunks.map(({ id, text }) => ({ id, text })),
};

So each request carries the command you ran, the task, the chunks of raw output, a de-duplicated list of every diagnostic and result line, and history — the recent conversation, including tool calls and their results. Nothing is redacted. If your build log prints a token, or an earlier tool call read a credentials file, that text is in the request.

The README is candid about a related point: its “does this command look like it touches secrets” check (commands matching secret, password, token, netrc, id_rsa and friends) only suppresses the local archive copy — it does not redact anything and does not stop the upload. Worth knowing that the same check has a wide net: an ordinary rg -n token src/ matches, so that command’s output is pruned without the local archive you would otherwise use to recover the dropped lines.

Elsewhere the handling is clean: the key is read from plugin options or the environment, only ever sent as a bearer header, and we found no path that logs it. On Codex the archive is written with restrictive permissions; on Claude Code the host’s write API doesn’t accept a mode, so the archive lands under your umask.

Two things that don’t match the dial

keepThreshold above 0.1 does nothing. The retention rule is:

export function keepScore(score: number, threshold: number): boolean {
  return score >= threshold || score > MAX_DISPOSABLE_KEEP_PROBABILITY; // 0.1
}

Any chunk scoring above 0.1 is kept regardless of your threshold, so setting it to 0.9 prunes no more than 0.5 does. The README documents this safeguard plainly in two places — “removal requires a keep probability at most 0.1 and below keepThreshold” — but the plugin manifest, which is what a configuration UI shows you, says only “Minimum Jev probability for a Bash output chunk to stay visible”. Follow the README, not the dial.

There is no timeout on the Claude Code path. Codex requests abort after 30 seconds, and the README’s 30-second promise sits in the Codex section. The Claude hook uses the host’s fetch, whose options don’t include a timeout, and no abort controller is set up — so a hung request waits on whatever the host does, with up to a dozen requests in flight for one command.

Neither is dangerous: failure is fail-open, and the worst case is that you get the untrimmed output you would have had anyway. Both are reported upstream.

Maintenance

136 commits since September 18, MIT licensed, ten open pull requests, no open issues, published under the name fast-jev-output (the README explains the rename). It needs Claude Code’s early-access function hooks, or Codex CLI 0.152.1+. The quality of the test suite, and the fact that the failure modes are the ones under test, say more about this project than its age does.

Verdict

The judgment call here is unusually well-posed: not “summarize this”, but “does this chunk contain a line the agent still needs”, asked with code holding on to everything that looks like an error, a result or a document. Everything about the retention logic leans toward keeping, and the failure paths return your output untouched.

What to weigh: the whole output and your recent conversation go to TypeSafe on every long command, with no redaction. On a machine where build logs and tool results are boring, that’s a fine trade for the context you get back. On one where they aren’t, it isn’t.

For the other end of the same problem, see fast-jev-compaction, by the same author, which trims the conversation rather than the command output, and compact-adviser, which decides when to compact.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Coding Agents & Developer Tools

fast-jev-compaction

★ 7.0k▲ 1.6k

tamaratran/fast-jev-compaction

Claude Code plugin that replaces the compaction summary with Jev decisions. Every tool call and result is scored; stale ones are dropped or truncated, and everything kept stays verbatim.

TypeScriptReviewed

Jev Review

★ 628▲ 201

devagrawal09/jev-review

Staged code-review workflow for JavaScript and TypeScript with a local dashboard. Jev screens correctness, security, reliability, compatibility, and test risk, then scores severity and suggests a reviewer, with no generative model involved.

TypeScriptReviewed

Foreman

★ 595▲ 153

thruwire/foreman

Puts Jev as a fast supervisor above slower coding agents such as Codex, starting from a ticket, spec, or bug report.

PythonReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.