SLOPSHOPPER

Jevvy Permissions

Jev-powered auto-approval for harmless shell permission requests

new
★ 22v?MITupdated 2026-10-15PanAchy/jevvy/packages/permissions
A shopper browsing a rack in a slop shop
Preview could not run: hooks.json names ../dist/claude-controls.js as the hooks module, but the repository has no such file
README

Jevvy

Fast probabilistic judgments inside coding-agent workflows

A plugin collection powered by TypeSafe's System One model.

Jevvy Permissions

<a href="https://www.npmjs.com/package/@jevvy/permissions"><img alt="npm version" src="https://img.shields.io/npm/v/%40jevvy%2Fpermissions?style=flat&labelColor=000000&color=000000" /></a> <a href="https://www.npmjs.com/package/@jevvy/permissions"><img alt="npm downloads" src="https://img.shields.io/npm/dm/%40jevvy%2Fpermissions?style=flat&labelColor=000000&color=000000" /></a>

The permissions plugin auto-approves harmless shell permission requests. Anything uncertain continues through your agent's normal permission flow.

OpenCode (v2)

OpenCode demo showing a configured shell ask stays a human prompt, Jev approves a nonmatching complete command, and a risky command stays a human prompt

In this isolated demo, a test reviewer requests the nonmatching OpenCode approvals.

Claude Code

Claude Code demo showing a configured Bash ask stays a human prompt, Jev approves a nonmatching complete command, and a risky command stays a human prompt

Claude checks readable ask settings; managed, command-line, and session-only rules are not visible to its hook.

Quickstart

Node.js 22.19 or newer is required.

npx @jevvy/permissions init

Manual setup

OpenCode

Starting in 0.6.0, the OpenCode integration in Jevvy Permissions requires OpenCode 2.0.27 or newer.

opencode plugin add @jevvy/permissions

For OpenCode v2 versions before 2.0.27:

opencode plugin add @jevvy/permissions@0.5.1

Claude Code

/plugin marketplace add PanAchy/jevvy
/plugin install jevvy-permissions@jevvy

How it works

Your agent checks permissions first. Its allow and deny decisions stay final. Specific ask rules stay with your agent. For other requests that need approval, Jevvy Permissions checks the full shell command. It approves only the current command when all checks pass, without saving an approval rule. In Ask mode, your agent asks you to approve anything Jevvy does not approve. Automatic approval settings still apply.

<img src="./assets/jevvy-permission-flow-light.png" width="832" alt="Ask-mode permission flow. Your agent keeps its allow, deny, and specific ask decisions. Jevvy checks other commands needing approval and approves each command once only when every check passes. Otherwise your agent asks you to approve. Automatic approval settings still apply." />

Configuration

Jevvy Permissions reads one global file at ~/.config/jevvy/jevvy.jsonc. Project repositories cannot override it. JSONC comments and trailing commas are supported. Keep $schema for editor validation and autocomplete.

{
  "$schema": "https://raw.githubusercontent.com/PanAchy/jevvy/main/config.schema.json",
  "provider": "typesafe",
}

Providers

ProviderproviderCredential sources
OpenCode Zenzenproviders.zen.apiKey or OPENCODE_API_KEY
TypeSafe AItypesafeproviders.typesafe.apiKey or TYPESAFE_API_KEY
OpenRouteropenrouterproviders.openrouter.apiKey or OPENROUTER_API_KEY
Vercel AI Gatewayvercelproviders.vercel.apiKey or AI_GATEWAY_API_KEY
Laya ([setup guide][laya-guide])layaOptional providers.laya.apiKey or LAYA_API_KEY
Custom endpointcustomOptional providers.custom.apiKey

[laya-guide]: https://github.com/PanAchy/jevvy/blob/main/guides/laya.md

The plugin uses only the selected provider and never falls back to another one.

Custom System One endpoint

Select custom to use any HTTP endpoint that accepts the System One request shape and returns typed System One answers:

{
  "$schema": "https://raw.githubusercontent.com/PanAchy/jevvy/main/config.schema.json",
  "provider": "custom",
  "providers": {
    "custom": {
      "endpoint": "https://system-one.example.com/v1/decisions",
      "model": "your-model",
      "apiKey": "your-api-key",
    },
  },
}

Custom endpoints use Jevvy's default approval policy unless you replace it. Its calibration evidence applies only when the route is verified to serve the calibrated Jev model.

Approval policy

Jevvy's default approval policy requires all four questions to pass:

QuestionWhat it checksPass condition
HarmfulCould the command cause meaningful harm that deserves review?Noul ≤ 0.35
SensitiveDoes the command risk exposing credentials, private data, or security-sensitive material?Noul ≤ 0.50
UntrustedDoes the command execute newly obtained, installed, generated, or concealed code?Noul ≤ 0.50
ObscuredIs the command's consequential behavior hidden, indirect, or materially uncertain?Noul ≤ 0.50

The default questions, thresholds, and model identities were calibrated together against eval/commands.json. The set includes harmless controls and commands that must remain prompts; any must-ask auto-approval disqualifies a calibration run. Custom policies are not covered by this evidence.

For providers other than Laya, permissions.questions replaces Jevvy's default questions. Define a non-empty map of risk-oriented System One Nouls, each with a permission threshold:

{
  "permissions": {
    "questions": {
      "harmful": {
        "type": "noul",
        "instructions": "Could this command cause meaningful harm that deserves human review?",
        "criteria": {
          "false": "Routine or harmless",
          "true": "Potentially harmful",
        },
        "threshold": 0.35,
      },
    },
  },
}

A Noul answer is the probability that the answer is yes. Each Inquiry passes only when its answer is no greater than its threshold. See TypeSafe's Noul documentation.

Calibrate custom questions

Install the optional calibrate-permissions skill when you want an agent to design or validate a custom policy:

npx skills add PanAchy/jevvy --skill calibrate-permissions

The skill runs jevvy-calibrate against the plugin's bundled baseline. Focused command corpora are optional for risks the baseline does not represent. Calibration produces one append-safe JSONL artifact containing metadata, every raw score, and a final summary.

Source 0 files

Not captured.