Repository navigation
Releases: FrancoisChastel/jev-code
Release list
v0.5.0
OpenAI's Decisions API, now in public beta for every developer, and a System One gateway of your
own as a first-class setup path. One change to check before upgrading: TYPESAFE_BASE_URL is now
validated, so a value carrying credentials, a query string, or a trailing /v1/systemone is
refused before any request instead of being sent.
Added
- A System One gateway of your own, documented as what it already was: the proxy case. The key
goes inTYPESAFE_API_KEY, the SDK's generic variable, and the address inTYPESAFE_BASE_URL,
withTYPESAFE_DEFAULT_MODELwhen the gateway's model id differs; nothing new to configure in
any harness.setupoffers "Other System One gateway" when asking which host a pasted key is
for, then asks for the URL and the model and stores the three variables together. - OpenAI's Decisions API in its public beta, open to every developer since October 6, 2026.
The mapping now follows OpenAI's published reference instead of recorded preview traffic; the
request jev-code sent already matched it, so existing setups keep working unchanged. All five
tools and the live test suite were run againstgpt-6-lunabefore this release. - A question the model declines comes back as a refusal on the Decisions API. Tools report it as
status: "refused"with the cautious outcome (review, oruncertaininjev_check)
instead ofinvalid_response, since retrying will not change it, andjev_asklists declined
ids underrefused. - CI runs the live tests against the Decisions API too when an
OPENAI_API_KEYsecret is set.
Changed
TYPESAFE_BASE_URLis checked before any request: an absolutehttp(s)URL with no
credentials, query, or fragment, stopping before/v1/systemone, which the client appends.
A bad value is a configuration problem indoctorandsetup, never echoed in case it embeds
a secret, instead of a connection error at the first call.- Score probabilities from the Decisions API are keyed by the level index the API returns,
falling back to the label. doctor --liveno longer calls a403from the Decisions API a preview restriction; it
quotes OpenAI's message and points at the key's project access togpt-6-luna.
Fixed
npm run test:e2efound no tests to run, because the test config excluded the live suite for
every run, so the CI live job could never have exercised a host. The suite is now excluded
only whenJEV_CODE_E2Eis unset.
v0.4.1: keys are routed by their variable, never by their shape
Keys are no longer routed by what they look like.
The variable decides the host. TypeSafe issues apikey_... keys as well as ts_... ones, and key shapes change, so guessing a host from a prefix was always going to break. From this release TYPESAFE_API_KEY goes to TypeSafe, OPENROUTER_API_KEY to OpenRouter, AI_GATEWAY_API_KEY to Vercel AI Gateway, and OPENAI_API_KEY to OpenAI (still opt-in), whatever the key looks like. A key that looks like it belongs elsewhere only earns a hint in doctor, naming the variable to move it to.
The TypeSafe SDK convention still works. TYPESAFE_API_KEY is the generic variable the official SDK reads, so it follows TYPESAFE_BASE_URL and JEV_CODE_PROVIDER to OpenRouter or Vercel the way the SDK does; the OpenRouter and Vercel guides for the SDK work unchanged. Host-specific variables never travel, and the generic key never follows to OpenAI or Ollama.
setup asks which host a pasted key is for, with its best guess as the default: the JEV_CODE_PROVIDER host, else the key's usual shape, else TypeSafe. Both prompts settle when input ends, and a paste holding both answers is read as two.
npx -y @french-castle/jev-code@0.4.1 setupRe-running setup moves pinned registrations from 0.4.0 to 0.4.1.
Fixed
- A key's shape no longer decides where it is sent; the variable a key sits in does.
apikey_...is recognised as a TypeSafe shape for the hint. TYPESAFE_API_KEY=sk-proj-...withJEV_CODE_PROVIDER=openaiis now refused with "exportOPENAI_API_KEY" instead of being sent to OpenAI; the generic key never crosses to a different wire.- With
JEV_CODE_PROVIDER=ollama, a staleTYPESAFE_BASE_URLon another known host is refused like everywhere else instead of carrying Ollama's key and the payload there. - The setup prompts no longer hang when input ends before Enter.
Full details: CHANGELOG.md. Previous release: v0.4.0.
v0.4.0: Ollama local decision models and OpenAI's Decisions API, both opt-in
Two new hosts, both opt-in, next to Jev on TypeSafe, OpenRouter, and Vercel AI Gateway.
Ollama, local and keyless. Ollama 0.35 and later serves decision models behind the very same API, so nothing leaves your machine:
ollama pull nimble
export JEV_CODE_PROVIDER=ollama
npx -y @french-castle/jev-code@latest doctor --liveOLLAMA_HOST points at another server; tev1, clef, and clef-flash work via TYPESAFE_DEFAULT_MODEL. Doctor says when the server is down or the model is not pulled.
OpenAI Decisions API, limited preview. Set JEV_CODE_PROVIDER=openai next to your OPENAI_API_KEY, or paste an OpenAI key when setup asks and it stores both. An ambient OPENAI_API_KEY is never adopted on its own, because that variable sits in most shells for unrelated reasons; doctor tells you it is there and how to opt in. Accounts outside the preview get 403 Decision API is not enabled for this user, which doctor --live reports in plain words. The request mapping follows traffic recorded by preview users and OpenAI's own client in the Codex repository, since OpenAI has published no reference yet; it is verified end to end against a stand-in with that shape, through the CLI and a real harness over MCP. A live decision from a preview account is the one thing still unconfirmed, and a report from anyone with access is welcome.
npx -y @french-castle/jev-code@latest setupAdded
-
Ollama's decision capability (Ollama 0.35+) as a local, keyless host:
JEV_CODE_PROVIDER=ollama
afterollama pull nimble;OLLAMA_HOSTnames another server,OLLAMA_API_KEYis sent only
when set. Same System One API, so nothing else changes.doctor --livesays when the server is
down or the model is not pulled. -
JevClientworks without a key for local hosts; no Authorization header is sent then. -
OpenAI's Decisions API (limited preview) as an opt-in host:
OPENAI_API_KEYplus
JEV_CODE_PROVIDER=openai, modelgpt-6-luna. Every tool works unchanged; the request and
response shapes are translated (src/core/wires.ts), following traffic recorded by preview
users and OpenAI's own client in the Codex repository. An ambientOPENAI_API_KEYis never
adopted by itself; doctor and the missing-key error explain how to opt in, anddoctor --live
recognises the preview's403 Decision API is not enabled for this user. -
Pasting an OpenAI key when
setupasks storesJEV_CODE_PROVIDER=openaialongside it.
Full details: CHANGELOG.md. Previous release: v0.3.0.
v0.3.0: pinned launch commands, upgrades that reach installed agents
Upgrades now reach installed agents. Harness configs launch a pinned command, so an agent starts fast and works offline once that version is cached, and re-running setup moves the pin deliberately. Until now, npx kept the first version it cached for the unpinned command and never checked for a newer one, so installs made with 0.2.x never saw the 0.2.1 fixes.
If you already installed jev-code, run this once:
npx -y @french-castle/jev-code@latest setupNew install:
npx -y @french-castle/jev-code@latest setup
npx -y @french-castle/jev-code@latest doctor --liveChanged
- Harness configs now launch a pinned command,
npx -y @french-castle/jev-code@<version> mcp.
npx keeps the first version it cached for an unpinned name and never checks for a newer one,
so earlier installs were frozen on whatever they first fetched; run
npx -y @french-castle/jev-code@latest setuponce to move to a pinned command. Re-running setup
replaces an existing registration whose command differs, including throughclaude mcpand
codex mcp, and reports it asupdated. doctorshows the pinned version of each registration and says when to re-run setup.- The README and guides invoke setup and doctor with
@latest, for the same reason. npm versionrunsscripts/sync-version.mjs, which keeps the plugin manifest, the skill
metadata, the plugin.mcp.json, and the documented launch commands on the new version.
Fixed
- Config backups taken within the same second no longer overwrite each other.
- The Codex
config.tomleditor keeps the file's line endings and handles an env sub-table
declared before its parent.
Full details: CHANGELOG.md. Previous release: v0.2.1.
v0.2.1: verified on four harnesses, first npm release
A patch release verified end to end on Claude Code, Codex, Pi, and OpenCode: setup through the CLI, a real tool call from each agent, and skill discovery. It is also the first version on npm, under the package name @french-castle/jev-code.
npx -y @french-castle/jev-code setupChanged
- The npm package is
@french-castle/jev-code. The@francoischastelscope was never
published to, so nothing installed changes;npx -y @french-castle/jev-code setupis the
install command from now on. The GitHub repository stays at FrancoisChastel/jev-code. @modelcontextprotocol/sdk1.30.1. Development tooling moved to TypeScript 7 and the Node 26
type definitions; the supported Node range is unchanged (20+).- The OpenCode guide notes that OpenCode prefixes MCP tools with the server name
(jev_jev_check).
Fixed
setup pi --projectpasses--approvetopi install -l, which pi requires before it edits
a project's.pi/settings.json; without it the install failed with "Project is not trusted".- The MCP server sends the versioned user agent, like the CLI.
doctorkeeps a space between a long skill path and the tool column.
Full details: CHANGELOG.md. Previous release: v0.2.0.
v0.2.0: Jev through OpenRouter and Vercel AI Gateway
Package name. The npm package is published as
@french-castle/jev-code; the@francoischastelscope shown in earlier drafts was never used. v0.2.0 itself was not published to npm; install v0.2.1 or later.
Jev now works through OpenRouter and Vercel AI Gateway as well as directly on TypeSafe, and getting set up is one command.
npx -y @french-castle/jev-code setupHighlights
- Bring the key you already have.
TYPESAFE_API_KEY,OPENROUTER_API_KEY, orAI_GATEWAY_API_KEY: the key's prefix (ts_,sk-or-,vck_) picks the host, whichever variable holds it. All three hosts serve Jev behind the same System One API, so the tools, the skill, and every harness adapter are unchanged. setupasks for a key. Run it in a terminal with no key exported and it asks for one with hidden input, writes it into the harness configs, and prints the export line Pi and the CLI need.--no-promptopts out.doctornames the host. It shows which host and key variable are in use, warns when several keys are set (JEV_CODE_PROVIDERpicks one), and refuses a key and base URL that disagree before any request is made.
Security
- A key is only ever sent to the host that issued it. A base URL on another known host is refused; a proxy base URL applies to TypeSafe keys unless
JEV_CODE_PROVIDERstates the intent. setupcopies only the key in use into harness configs, scrubs it from a harness CLI's output, and redacts it in printed commands. The MCP server logs the host in use to stderr once, where harnesses keep their logs.- Details and the reporting policy: SECURITY.md.
Also in this release
- Clearer API errors: the host's own message instead of a JSON blob (TypeSafe nests it under
detail, OpenRouter undererror). - OpenRouter requests carry the optional app attribution headers.
- The missing-key error now reads
No API key foundand lists the three accepted variables. - The release workflow creates the GitHub release even when npm publishing is skipped, and says why.
Upgrading from 0.1.0
Nothing changes for TypeSafe users. If you matched the exact text TYPESAFE_API_KEY is not set anywhere, update it. When you switch hosts, re-run jev-code setup so the harness configs carry the new key.
Not in this release
Cloudflare Workers AI also serves Jev but uses a different request envelope; support is a planned follow-up.
Full details: CHANGELOG.md.