Skip to content

v0.16.0

Choose a tag to compare

@khalilgharbaoui khalilgharbaoui released this 06 Sep 15:58
· 53 commits to master since this release
fee8336

A fork sweep release. All 19 forks of this repo were compared branch by branch against master, and five pieces of work were absorbed with credit: three cherry-picks that keep their original authorship, and two features extracted from a larger commit and committed under their author's name. Thank you to everyone named below. The full attribution table now lives in the README under Credits.

opencode serve spawns claude in the right project

By @galvani (Jan Kozak), cherry-picked from his fork.

In opencode serve, the web UI, or OpenChamber, one long-lived server handles many projects, and process.cwd() is the server's launch directory. That path is "usable", so it won the cwd resolution and every claude subprocess spawned there, whatever project the session was for. The session's own directory (from GET /session/{id}) now sits between an explicit cwd pin and process.cwd(). The TUI is unchanged, since there the two are equal.

AGENTS.md is no longer sent twice

By @HeikoAtGitHub, cherry-picked from his fork.

opencode already forwards ~/.config/opencode/AGENTS.md inside its system prompt. The plugin also read it from disk and appended it, so every turn carried two copies. The disk copy is now only appended when the forwarded text does not already contain it, and nothing is lost on the interactive transport, which forwards nothing.

Esc actually stops the CLI

Adapted from @broskees (Joseph Roberts).

The Claude CLI runs one turn per process and closing the opencode-side stream told it nothing: an aborted turn ran to completion, kept billing, kept running tools, and its late output landed in your next message. Joseph measured about 7,500 characters generated after abort on a haiku probe. The plugin now sends the CLI a stream-json interrupt control request on abort, and a new turn that finds the previous one still running interrupts it first. Live-verified: abort mid-tool, CLI idle within the request, next turn answered cleanly in 8.5 s.

idleProcessTimeoutMs

By @bernardofortes (Bernardo Fortes), cherry-picked from his fork and resolved onto the current tree.

Retained claude workers used to live until LRU pressure at 16. Set idleProcessTimeoutMs and a worker is killed after that many idle milliseconds following a completed turn; the session id survives, so the next message resumes transparently. Off unless set.

Skill bridge (opt-in)

Written by @broskees (Joseph Roberts), absorbed with credit.

opencode and Claude Code use the same <name>/SKILL.md format but different roots, so opencode advertised skills that Claude's Skill tool answered with Unknown skill. With bridgeOpencodeSkills: true the plugin stages your opencode skills as a session-scoped --plugin-dir, and they register as opencode-skills:<name>. It is off by default here, unlike on the fork: every bridged skill is also listed in the system prompt opencode already forwards, so a large skill set would be paid for twice per turn. See the README Skill bridge section.

Also recorded, no code

Two forks independently pinned the 5-minute proxy wall that 0.15.0 fixed: undici's 300 s headersTimeout/bodyTimeout behind the CLI's MCP client (broskees) and a 300 s MCP-idle timer (Heiko). And @galvani had fixed the stale toolCallMap re-emission (0.15.1 here) on his fork on 2026-05-25, three months earlier: the lesson is to sweep forks more often, and that is now written down.

Upgrading

A published version does not appear in a running opencode until its frozen plugin cache is cleared:

rm -rf ~/.cache/opencode/packages/@khalilgharbaoui/opencode-claude-code-plugin@latest

then fully relaunch opencode.