AI you cangrep.

Ask a question with a fixed answer. Get a probability and an exit code back.

npm i -g jevctl
jev clitype help, or pick a verb

more

Running in ten seconds. 

  1. Install

    npm i -g jevctl
  2. Log in

    jev auth login
  3. Gate

    git diff main | jev verify "Only tests changed" -e -
zsh

Using Claude Code?

claude plugin marketplace add Nasrallah-AL/jev-cliclaude plugin install jev@jev-cli

One command per question. 

  • jevcompact

    Shrink a transcript without summarizing it.

    Cuts stale tool output from a session log and keeps the rest word for word. Also runs as a Claude Code compaction hook.

    jev compact @session.jsonl --out compacted.json
    61% smaller · 0 summarized0.61
  • jevscreen

    Catch prompt injection before an agent reads it.

    Scores injection, substance, and relevance. On block it exits 2, so the next command in the pipe never runs.

    curl -s $URL | jev screen
    injection0.99
  • jevverify

    Check each claim against the evidence.

    Each claim comes back verified, contradicted, or unsupported, with the source it rests on.

    jev verify "Refunds take 3 days" -e @policy.md
    verified0.97
  • jevextract

    Pull values out of text without guessing.

    Regexes find the candidates, Jev picks the one that fits, code normalizes it.

    jev extract @invoice.txt --want amount,date
    amount $1,250.000.97
  • jevroute

    Turn a request into a handler and its arguments.

    One call returns the handler and typed arguments. A built-in none lets it decline.

    jev route "$msg" --handlers-json @handlers.json
    refund · scope=full0.87
  • jevclassify

    Pick a label, or say nothing fits.

    Single label, several labels, or a path through a taxonomy. Add other so it can decline.

    jev classify @issue.txt -l bug,feature,question --other
    bug0.91
  • jev match

    Do these two records describe the same thing?

    jev match --dedupe @contacts.json --kind "customer contacts"
  • jev rerank

    Is each search hit actually relevant?

    jev rerank "how do refunds work" -f help/*.md --min 0.6
  • jev find

    Which file answers this? Does any?

    jev find "retry logic" -f src/**/*.ts
  • jev ask

    Any yes/no, pick-one, or rated question.

    jev ask @ticket.txt --choice team="Who?|billing,tech"
  • jev batch

    The same verb over a whole file.

    jev batch classify -i @tickets.jsonl -o labeled.jsonl -- -l billing,technical,sales --other

Compaction without a summary. 

Watch jev compact shrink a Claude Code session by judging every tool call and keeping or cutting it as is.

  1. An agent hits 60% context.

    Hundreds of tool calls, most of them stale. The usual fix is a summary, and summaries lose file paths, exact errors, and constraints.

  2. Jev reads the whole transcript.

    Two yes/no questions per tool call: does the call still matter, and does its output still need to be there in full.

  3. Stale output is cut. Nothing is rewritten.

    Dropped calls are removed. Stale results keep a short head plus a note. User and assistant text is never touched.

  4. 61% smaller. Zero summarized.

    Run it offline on any session log, or let the Claude Code plugin hook do it in-session instead of the built-in summary.

jev compact @session.jsonl --out compacted.json

528 messages, 209 tool calls, context at 61%

CallToolActionP(call)P(result)
t1Read0.940.88
t2Bash0.910.12
t3Grep0.080.03
t4Edit0.970.90
t5Bash0.860.09
t6Read0.110.05
t7Bash0.900.78

Try a question. 

Start from an example, edit it, copy the command.

What you ask

  • billing:refunds and invoicestechnical:bugs and outagessales
  • calmfrustratedvery angry
jev ask "I was charged twice for order 4411 and nobody has replied in three days." \--noul urgent="Does the customer need a reply today?" \--choice team="Which team should handle this?|billing:refunds and invoices,technical:bugs and outages,sales" \--score mood="How frustrated is the customer?|calm,frustrated,very angry"

Paste this into a shell with a key set. Each question comes back as a number.

Steal a one-liner. 

Copy it, swap the paths, run it in your shell.

Guard an agent's web fetch

The page only reaches the agent when injection is low. && does the rest.

jev screen
page=$(curl -s "$url") && jev screen "$page" -q && my-agent <<<"$page"
injection 0.02pass

Screen your clipboard before you paste

Anything you are about to hand an agent goes through the same gate.

jev screen
pbpaste | jev screen --purpose "paste into Claude" --fail-on block,review

Gate a PR on its own description

Every claim in the PR body is checked against the diff. One unsupported claim fails the check.

jev verify
gh pr diff 42 | jev verify -c @claims.txt -e - --fail-on contradicted,unsupported

Check the commit does what it says

The diff is the evidence. The message is the claim.

jev verify
git show HEAD | jev verify "$(git log -1 --format=%s)" -e -

Label an issue straight from gh

One typed label per issue, with an other escape when nothing fits.

jev classify
gh issue view 42 --json body -q .body | jev classify -l bug,feature,question --other --json | jq -r .label

Pull fields from an email

Regexes find the candidates, Jev picks the right span, code normalizes it. No made-up dates.

jev extract
jev extract @msg.eml -c "customer email" --want sender=email:the sender --want reply_by=date:the reply deadline --want amount

Rerank before you answer

Each hit is judged on its own, so several can pass or none can.

jev rerank
jev rerank "how do refunds work" -f help/*.md --min 0.6 --json | jq -r ".kept[]"

Route chat to typed handlers

Handler and arguments in one call. A built-in none lets the model decline.

jev route
echo "$message" | jev route - --handlers-json @handlers.json --fail-on unrouted --json | jq "{handler, args}"

Find the line that answers

Every line on stdin is a candidate. No index, no embeddings.

jev find
grep -h "^-" CHANGELOG.md | jev find "when did batch land" -l - -k 1

Label a whole backlog

One record per row, in order. Anything below confidence is flagged for a human.

jev batch
jev batch classify -i @issues.jsonl -o labeled.jsonl -- -l bug,feature,docs --other --fail-on review

Dedupe a contact export

Same, unclear, or different per pair. Only the unclear ones reach a person.

jev match
jev match --dedupe @contacts.json --json | jq -r ".results[] | select(.decision=="unclear")"

Compact a Claude Code session

Drops tool results that no longer matter, keeps everything else word for word. The Claude Code plugin runs this as its compaction hook.

jev compact
jev compact @~/.claude/projects/$PROJECT/$SESSION.jsonl --out compacted.json
Guard an agent's web fetch