Agent Plugins Marketplace
← All plugins

ohmyjev

v0.9.2

Guardrails for Codex, decided by Jev: blocks irreversible and data-leaking commands, even in full-auto, and runs them when you say yes.

CodexClaude Code

By NovaconLicense: MIT2 GitHub starsUpdated last week

Directory evidence

Runtimes
Codex and Claude Code
Parsed components
0 skill or MCP entries
Source updated
Oct 12, 2026
Manifest status
Canonical path parsed

The directory validates manifest shape and source location. It does not execute the plugin or provide a security endorsement. Review the indexing methodology →

Install ohmyjev for Codex and Claude Code

Installs for the current user
codex plugin marketplace add Novacon/ohmyjev
codex plugin marketplace upgrade ohmyjev
codex plugin add ohmyjev@ohmyjev

Paste and run these commands in a terminal with Codex. They add and refresh the ohmyjev catalog, then install this plugin.

Compatibility: the page URL and API slug “ohmyjev” remain stable.

  • Codex: ohmyjev@agent-plugin-marketplace → ohmyjev@ohmyjev

The installer fetches third-party code from the source repository shown on this page. This directory validates manifest structure and source location, but does not perform a security audit; review the manifest, components, and source before installing.

Get the source manually
git clone https://github.com/Novacon/ohmyjev

Clone the source repository, then follow its setup instructions to add the plugin to a compatible client. The repository root is the plugin root.

Plugin files

ohmyjev/
├── .codex-plugin/plugin.json
└── .claude-plugin/plugin.json

Plugin manifests2

.codex-plugin/plugin.json
{
  "name": "ohmyjev",
  "version": "0.9.2",
  "description": "Guardrails for Codex, decided by Jev: blocks irreversible and data-leaking commands, even in full-auto, and runs them when you say yes.",
  "author": {
    "name": "Novacon",
    "url": "https://github.com/Novacon"
  },
  "homepage": "https://ohmyjev.xyz",
  "repository": "https://github.com/Novacon/ohmyjev",
  "license": "MIT",
  "keywords": [
    "guardrails",
    "ai-safety",
    "prompt-injection",
    "codex",
    "jev"
  ],
  "hooks": "./codex/hooks.json",
  "interface": {
    "displayName": "ohmyjev",
    "shortDescription": "Jev-decided guardrails for Bash, edits and MCP calls.",
    "longDescription": "Denies commands Jev rates irreversible or data-leaking, edits outside the repo or holding a credential, and MCP calls that send local data out. Flags prompt injection in tool output and pushes back on an unverified done. After a block, answer yes and that exact call runs.",
    "developerName": "Novacon",
    "category": "Developer Tools",
    "capabilities": [
      "Read"
    ],
    "websiteURL": "https://ohmyjev.xyz",
    "brandColor": "#9D78FF"
  }
}
.claude-plugin/plugin.json
{
  "name": "ohmyjev",
  "version": "0.9.2",
  "description": "Jev for Claude Code: Bash and Write gates, an injection screen, and a done-check, decided by TypeSafe's Jev.",
  "author": {
    "name": "lordknows13"
  },
  "license": "MIT",
  "keywords": [
    "mod",
    "function-hooks",
    "jev",
    "guardrails"
  ],
  "userConfig": {
    "apiKey": {
      "type": "string",
      "title": "TypeSafe API key",
      "description": "Empty uses $TYPESAFE_API_KEY, then $OPENROUTER_API_KEY",
      "default": "",
      "sensitive": true
    },
    "jevModel": {
      "type": "string",
      "title": "Jev model (TypeSafe)",
      "description": "Model id sent to the TypeSafe endpoint",
      "default": "jev-1.13.0"
    },
    "enabled": {
      "type": "boolean",
      "title": "ohmyjev on",
      "description": "Off lets every call through. /omj off and /omj on change it for one session",
      "default": true
    },
    "bashGate": {
      "type": "boolean",
      "title": "Bash gate",
      "description": "Deny irreversible or destructive commands",
      "default": true
    },
    "writeGate": {
      "type": "boolean",
      "title": "Write gate",
      "description": "Deny writes outside the repo/allowPaths and writes holding credentials",
      "default": true
    },
    "injectionScreen": {
      "type": "boolean",
      "title": "Injection screen",
      "description": "Warn the model when Bash, WebFetch or MCP output carries instructions aimed at it",
      "default": true
    },
    "doneCheck": {
      "type": "boolean",
      "title": "Done-check",
      "description": "Push back once when the agent claims done without verifying",
      "default": true
    },
    "exfilGate": {
      "type": "boolean",
      "title": "Exfil gate",
      "description": "Deny WebFetch and MCP calls that send local data, files or credentials out",
      "default": true
    },
    "screenReads": {
      "type": "boolean",
      "title": "Screen Reads outside the repo",
      "description": "Run the injection screen on files read from outside the repo",
      "default": true
    },
    "bashIrreversible": {
      "type": "number",
      "title": "Bash: irreversible confidence to deny",
      "description": "Deny when Jev rates the command irreversible at least this confident (0-1)",
      "default": 0.6
    },
    "bashDestructive": {
      "type": "number",
      "title": "Bash: destructive-intent to deny",
      "description": "Deny when destructive intent is at least this probable (0-1)",
      "default": 0.7
    },
    "writeSecret": {
      "type": "number",
      "title": "Write: credential probability to deny",
      "description": "Deny when the content holds a credential at least this probable (0-1)",
      "default": 0.7
    },
    "writeSecretsKind": {
      "type": "number",
      "title": "Write: secrets-file confidence to deny",
      "description": "Deny when the file is a secrets file at least this confident (0-1)",
      "default": 0.8
    },
    "injection": {
      "type": "number",
      "title": "Injection probability to flag",
      "description": "Flag tool output as an injection at this probability (0-1)",
      "default": 0.7
    },
    "exfil": {
      "type": "number",
      "title": "Exfil probability to deny",
      "description": "Deny when Jev rates the call as sending local data out at least this probable (0-1)",
      "default": 0.7
    },
    "autoApprove": {
      "type": "boolean",
      "title": "Auto-approve safe calls",
      "description": "Where Claude Code would stop to ask you, run a command or in-repo edit Jev is sure is safe instead",
      "default": true
    },
    "approveConfidence": {
      "type": "number",
      "title": "Auto-approve: Jev's confidence",
      "description": "How sure Jev must be that a command only reads or is reversible (0-1)",
      "default": 0.9
    },
    "approveRiskMax": {
      "type": "number",
      "title": "Auto-approve: highest risk",
      "description": "Destructive, data-leaving or credential probability under which a call is approved (0-1)",
      "default": 0.2
    },
    "stuckCheck": {
      "type": "boolean",
      "title": "Stuck check",
      "description": "After repeated failed calls, ask Jev whether the agent is stuck on one approach and tell it to change course",
      "default": true
    },
    "stuck": {
      "type": "number",
      "title": "Stuck check threshold",
      "description": "How sure Jev must be that the failures repeat one approach before the note (0-1)",
      "default": 0.7
    },
    "trimOutput": {
      "type": "boolean",
      "title": "Trim long output",
      "description": "Cut a long shell output to the parts your request needs, Jev rating each part",
      "default": true
    },
    "trimOver": {
      "type": "number",
      "title": "Trim outputs longer than",
      "description": "Characters of shell output before trimming is considered",
      "default": 12000
    },
    "trimKeep": {
      "type": "number",
      "title": "Trim: keep a part at",
      "description": "How likely Jev must rate a part as needed for it to stay (0-1)",
      "default": 0.3
    },
    "skillPick": {
      "type": "boolean",
      "title": "Skill picker",
      "description": "Leave the skill listing out of every prompt; Jev names the one skill a request needs (needs a Jev key)",
      "default": true
    },
    "skillGate": {
      "type": "number",
      "title": "Skill picker: needs a skill at",
      "description": "How strongly Jev must rate a request as needing a skill before one is named (0-1)",
      "default": 0.3
    },
    "skillMin": {
      "type": "number",
      "title": "Skill picker: pick confidence",
      "description": "How sure Jev must be of which skill fits (0-1)",
      "default": 0.4
    },
    "requested": {
      "type": "number",
      "title": "Let through what you asked for",
      "description": "A gate's Jev deny passes when Jev rates your latest message as asking for exactly that call at least this probable (0-1). Policy and path denies always stand",
      "default": 0.8
    },
    "doneClaimed": {
      "type": "number",
      "title": "Done-check: claimed-done at least",
      "description": "Check only when Jev says done was claimed at least this probable (0-1)",
      "default": 0.7
    },
    "doneVerifiedMax": {
      "type": "number",
      "title": "Done-check: verified below",
      "description": "Push back when verified is below this (0-1)",
      "default": 0.3
    },
    "doneAsksUserMax": {
      "type": "number",
      "title": "Done-check: asks-user below",
      "description": "Skip when the reply asks the user something at or above this (0-1)",
      "default": 0.5
    },
    "askJev": {
      "type": "boolean",
      "title": "ask_jev tool",
      "description": "Give the model an ask_jev tool for quick judgments about repo files or text without reading them into context",
      "default": true
    },
    "browse": {
      "type": "boolean",
      "title": "browse tool",
      "description": "Give the model a browse tool: jev-ultrafast does a task in your Chrome, Jev picking each step. Needs uv, Chrome remote debugging, and OPENROUTER_API_KEY to type into fields",
      "default": false
    },
    "autoCompact": {
      "type": "boolean",
      "title": "Auto-compact",
      "description": "Compact when Jev sees the task change at a natural boundary, keeping the new request in detail",
      "default": true
    },
    "compactSwitched": {
      "type": "number",
      "title": "Auto-compact: task-switch probability",
      "description": "Compact when the request switched tasks at least this probable (0-1)",
      "default": 0.8
    },
    "compactBoundary": {
      "type": "number",
      "title": "Auto-compact: boundary probability",
      "description": "…and the last turn finished a unit of work at least this probable (0-1)",
      "default": 0.6
    },
    "compactMinPercent": {
      "type": "number",
      "title": "Auto-compact: minimum context %",
      "description": "Only compact once the context is at least this full (0-100)",
      "default": 40
    },
    "routeEffort": {
      "type": "boolean",
      "title": "Router: effort",
      "description": "Raise or lower reasoning effort per turn from Jev's read of the request",
      "default": true
    },
    "routeSubagents": {
      "type": "boolean",
      "title": "Router: subagent model",
      "description": "Pick the subagent model (fast/balanced/deep) from the request",
      "default": true
    },
    "routeMainModel": {
      "type": "boolean",
      "title": "Router: main model",
      "description": "Also switch the main model per turn (discards the warm prompt cache)",
      "default": false
    },
    "routeUpgrade": {
      "type": "number",
      "title": "Router: confidence to move up",
      "description": "Raise effort or tier at this confidence or above (0-1)",
      "default": 0.3
    },
    "routeDowngrade": {
      "type": "number",
      "title": "Router: confidence to move down",
      "description": "Lower effort or tier at this confidence or above (0-1)",
      "default": 0.6
    },
    "routeRisky": {
      "type": "number",
      "title": "Router: risky forces deep",
      "description": "At this probability a request touching prod, money or credentials goes deep with at least high effort (0-1)",
      "default": 0.7
    },
    "routeWithoutKey": {
      "type": "boolean",
      "title": "Router: built-in classifier without a key",
      "description": "With no Jev key, route with Claude Code's own small model; it reports no confidence, so it only routes up",
      "default": true
    },
    "fastModel": {
      "type": "string",
      "title": "Fast model",
      "description": "Model id for the fast tier",
      "default": "claude-haiku-5-5"
    },
    "balancedModel": {
      "type": "string",
      "title": "Balanced model",
      "description": "Model id for the balanced tier",
      "default": "claude-sonnet-5-5"
    },
    "deepModel": {
      "type": "string",
      "title": "Deep model",
      "description": "Model id for the deep tier",
      "default": "claude-opus-5-5"
    },
    "allowPaths": {
      "type": "string",
      "title": "Allowed write paths outside the repo",
      "description": "Separated by ; (~ and $TMPDIR expand)",
      "default": "~/.claude;$TMPDIR;/tmp"
    },
    "policies": {
      "type": "string",
      "title": "Policies",
      "description": "Your own rules every gate weighs, separated by ; (e.g. never touch prod; no deploys on Friday)",
      "default": ""
    },
    "timeoutMs": {
      "type": "number",
      "title": "Jev timeout (ms)",
      "description": "How long a gate, screen or the router waits for Jev before letting the call through",
      "default": 1500
    },
    "logDecisions": {
      "type": "boolean",
      "title": "Show decisions in the transcript",
      "description": "Dim lines (never sent to the model) with each routing decision, its confidence and latency",
      "default": true
    },
    "statusLine": {
      "type": "boolean",
      "title": "Status under the prompt",
      "description": "Pin jev's calls, denies and route under the prompt; no statusline script needed",
      "default": true
    }
  }
}

If you maintain this plugin, link to this source-backed listing from your README so users can review its manifest and indexed components.

[ohmyjev on Agent Plugins Marketplace](https://pluginsmp.com/plugins/ohmyjev)