Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.17 | Reworked goal setup skill (interview-driven flow), CLI --version flag |
| v0.19.16 | Code navigation with peek view (Cmd/Ctrl+click tokens in diffs) |
| v0.19.15 | Commit-based diff base, jj evolution diffs, GitLab reliability fixes, OpenCode command intercept fix |
| v0.19.14 | Visual explainer skill update, PFM code-file hover previews, Graphviz, diff tab size and line bg intensity, hooks settings tab |
| v0.19.11 | Jujutsu (jj) VCS backend, slimmer hunk separators, collapse viewed files, multi-line gutter selection fix |
| v0.19.9 | OpenCode user-managed workflow, Pi model switch fix, Codex skill install, shimmer removal |
| v0.19.8 | 49 themes with syntax highlighting, keyboard shortcut registry, smart code-file path validation, remote URL notifications |
| v0.19.7 | Codex Stop-hook plan review, Codex skills, sidebar auto-close, file tree context menu |
| v0.19.6 | Non-blocking Pi browser sessions, agent picker dropdown for OpenCode, annotate-last file resolution fix |
| v0.19.5 | All-files diff view, clickable code file paths, server-side hide whitespace, non-ASCII path support |
What's New in v0.19.18
v0.19.18 brings an overhaul to OpenCode's plan submission system, migrates the Pi extension to its new package namespace, and fixes bugs in Codex and OpenCode. All four PRs in this release come from external contributors, with two first-timers.
Edit-Based Plan Submission for OpenCode
OpenCode's submit_plan tool previously offered two modes: the agent could pass inline markdown or a file path, and the plugin auto-detected which one was used. That design created a prompt-engineering dependency where the agent had to be steered toward the right mode, and when the prompt changed the agent would silently fall back to inline markdown, losing the token efficiency of file-based plans.
This release replaces both modes with a single edit-based interface. The agent submits an array of line-range edits applied against a plugin-managed backing file at .opencode/plans/_active-plan.md. On first submission, the full plan arrives as one edit. On subsequent rounds after denial, the agent receives the plan back with line numbers and can target surgical revisions instead of resubmitting the entire document.
The result is one deterministic path with no mode ambiguity. The agent always knows what to do, and revisions after denial are token-efficient by default. Tested across three denial rounds with Opus, including structural reorders and targeted insertions, with accurate line tracking throughout.
Pi Extension Namespace Migration
The Pi coding agent moved from @mariozechner to @earendil-works when Mario joined the Earendil team. This release updates all Pi extension imports, peer dependencies, and dev dependencies to the @earendil-works/* packages at v0.74.0. The old @mariozechner packages still work via npm deprecation redirects, but this puts the extension on the canonical namespace going forward.
This is a breaking change for Pi users on versions older than 0.74.0. Users should update Pi to 0.74.0 or later before installing this release.
- #729, contributed by @nulladdict
Codex Annotate-Last Message Selection Fix
Running /plannotator-last in Codex could open the agent's own acknowledgement message from the current turn instead of the previous completed response the user intended to review. This happened because the agent emits a short status message before running plannotator last, and the message selector would pick that up as the most recent assistant message.
The fix filters out assistant messages from the currently active turn, so /plannotator-last consistently opens the previous completed response.
- #740 closing #739, contributed by @mu-hashmi
Additional Changes
- OpenCode commands directory fix — The install script used
command/(singular) for OpenCode's custom commands directory instead of the correctcommands/(plural), preventing slash commands from being discovered. — #736, contributed by @lfox91 - Drop stub
@types/dompurify— dompurify ships its own TypeScript types since v3.x, making the@types/dompurifypackage an empty stub. Removed from both root and packages/ui devDependencies. — 1ec5243, contributed by @av1155
Install / Update
macOS / Linux:
curl -fsSL https://plannotator.ai/install.sh | bashWindows:
irm https://plannotator.ai/install.ps1 | iexClaude Code Plugin: Run /plugin in Claude Code, find plannotator, and click "Update now".
OpenCode: Clear cache and restart:
rm -rf ~/.bun/install/cache/@plannotatorThen in opencode.json:
{
"plugin": ["@plannotator/opencode@latest"]
}Pi: Install or update the extension:
pi install npm:@plannotator/pi-extensionWhat's Changed
- feat(submit-plan): replace dual-mode with edit-based interface by @rcdailey in #730
- migrate pi extension from mariozechner to earendil-works by @nulladdict in #729
- Fix Codex annotate-last message selection by @mu-hashmi in #740
- Fix directory name for OpenCode commands by @lfox91 in #736
- chore(deps): drop stub @types/dompurify by @av1155 in 1ec52434
New Contributors
- @mu-hashmi made their first contribution in #740
- @lfox91 made their first contribution in #736
Contributors
@rcdailey has been one of the most engaged community members around OpenCode's plan mode, tracking the dual-mode issue through multiple releases and documenting the pain points in detail across #365 and #328. This release ships his solution to the problem he identified. @nulladdict, who previously contributed the agent skills directory fix in #476, returned to handle the Pi namespace migration after the Earendil transition.
@mu-hashmi found and fixed the Codex annotate-last regression, filing the issue and shipping the fix with a regression test. @lfox91 caught the singular/plural typo in the OpenCode commands directory that was silently breaking slash command discovery. @av1155 submitted a thorough dependency audit in #726 covering the Pi migration and stale type packages — while we went with #729 for the migration, the @types/dompurify cleanup was pulled in with author credit.
Full Changelog: v0.19.17...v0.19.18