ohmyjev
v0.9.2Guardrails for Codex, decided by Jev: blocks irreversible and data-leaking commands, even in full-auto, and runs them when you say yes.
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
codex plugin marketplace add Novacon/ohmyjev
codex plugin marketplace upgrade ohmyjev
codex plugin add ohmyjev@ohmyjevPaste 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/ohmyjevClone 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
├── .codex-plugin/plugin.json└── .claude-plugin/plugin.json
Plugin manifests2
{
"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"
}
}{
"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
}
}
}For maintainers
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)