Releases: backnotprop/plannotator
v0.19.10
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| 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 |
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
What's New in v0.19.10
v0.19.10 reverts an unreviewed permission mode change that shipped in v0.19.9. The bypass-with-clear-reminder feature (PR #668) relied on Claude Code surfacing systemMessage from hook output, which it does not currently support. That PR has been fully reverted. All other v0.19.9 changes remain intact.
Reverted: Bypass Permissions with /clear Reminder
PR #668 added a synthetic bypassPermissionsClearReminder permission mode that was supposed to emit a system message reminding users to run /clear after plan approval. Testing revealed that Claude Code does not surface systemMessage fields from hook output to the conversation, so the feature had no visible effect. The entire PR has been reverted to avoid shipping dead UI options.
Users on v0.19.9 who selected the "Bypass + /clear Reminder" mode in Settings will fall back to the default permission mode ("Accept Edits") after updating.
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
- revert: remove bypass clear reminder permission mode (#668) by @backnotprop in 49c55e6
Full Changelog: v0.19.9...v0.19.10
v0.19.9
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| 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 |
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
What's New in v0.19.9
v0.19.9 adds a user-managed workflow mode for OpenCode, fixes model switching in Pi's plan approval flow, and introduces a bypass-with-reminder permission mode for Claude Code. Five PRs total, two from first-time contributors.
User-Managed Workflow Mode for OpenCode
OpenCode's plugin previously offered two extremes: manual (slash commands only, no submit_plan tool) and plan-agent/all-agents (full automation with prompt injection and permission overrides). Users who wanted the submit_plan tool without Plannotator modifying their system prompts or agent configuration had no middle ground.
The new user-managed workflow mode fills that gap. It registers the submit_plan tool and all slash commands, but does not inject planning prompts, rewrite tool definitions, or modify OpenCode's agent configuration. Users manage their own prompts and permissions, and Plannotator stays out of the way. To enable it, set workflow: "user-managed" in your opencode.json plugin options.
Existing configurations are unaffected. The default remains plan-agent, and unknown workflow strings continue to fall back to it.
Pi Model Switch on Plan Approval
When Pi users configured separate models for planning and execution (e.g., think with one model, execute with another), approving a plan was supposed to switch to the execution model. It didn't. Pi snapshots its model selection at the start of each agent.prompt() call, so calling pi.setModel() mid-loop had no effect until the next user-initiated turn. The user had to manually prompt the agent after every approval to trigger the switch.
The fix terminates the current agent loop on plan approval by returning terminate: true from the tool response, then uses a deferred sendUserMessage in the agent_end handler to start a fresh turn that picks up the executing model. Execution now continues automatically on the correct model without manual intervention.
- #677 by @backnotprop, closing #674 (reported by @snowmead)
Bypass Permissions with /clear Reminder
Claude Code's bypass-permissions mode skips the permission prompt on plan approval, but users often forget to run /clear afterward to reset context. A new "Bypass + /clear Reminder" option in the permission mode dropdown pairs bypass-permissions with a system message nudging the user to clear context after approval.
The mode is available in both the Settings dropdown and the Approve button's extra options. It decomposes to the standard bypassPermissions wire value plus a clearContextNudge flag, so the hook output format is unchanged. Cookie validation was also hardened in this PR: stale or invalid permission mode values now safely fall back to the default instead of flowing through unchecked.
Additional Changes
- Remove shimmer animation from clickable file paths. The repeating shimmer on
.code-file-linkelements was distracting while reading plans. File path links now render as normal inline code with cursor and hover cues only. (#676 by @backnotprop, closing #672 reported by @academo) - Install Plannotator command skills under Codex home. The installer now places command-overlap skills (
plannotator-review,plannotator-annotate,plannotator-last) in~/.codex/skills/when Codex is detected, and keeps shared-agent skills in~/.agents/skills/. Stale cross-scope copies are cleaned up, and a~/.codex/skills/directory created by a previous install no longer triggers false Codex detection. (#669 by @backnotprop) - Avoid Pi bundled skill conflicts. The installer configures Pi's
settings.jsonto disable bundled Plannotator skills when shared global skills are already installed, eliminating "duplicate skill" warnings. BOM-free UTF-8 writes on Windows prevent encoding issues with Pi's JSON parser.
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(opencode-plugin): add user-managed workflow mode by @saksmt in #667
- feat: expose bypass clear reminder permission mode by @AgileInnov8tor in #668
- fix: install Plannotator command skills under Codex home by @backnotprop in #669
- fix(ui): remove shimmer animation from clickable file paths by @backnotprop in #676
- fix(pi): terminate agent loop on plan approval so model switch takes effect by @backnotprop in #677
New Contributors
- @saksmt made their first contribution in #667
- @AgileInnov8tor made their first contribution in #668
Contributors
@saksmt identified the gap between OpenCode's manual and automated workflow modes and contributed the user-managed option (#667), giving users fine-grained control over prompt injection and tool registration. First contribution to the project.
@AgileInnov8tor built the bypass-with-clear-reminder permission mode (#668), including the synthetic mode decomposition, cookie validation hardening, and the live settings sync fix. First contribution to the project.
Community members whose reports drove fixes in this release:
- @snowmead: #674 (Pi model switch not taking effect on plan approval)
- @academo: #672 (shimmer animation distracting on file path links)
Full Changelog: v0.19.8...v...
v0.19.8
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| 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 |
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
What's New in v0.19.8
v0.19.8 is a UI infrastructure release. Nine PRs introduce a 49-theme gallery with matched syntax highlighting, a declarative keyboard shortcut system, smart code-file path validation in plans, and several reliability fixes for remote sessions and the code review editor. One PR comes from a first-time contributor.
49 Themes with Matched Syntax Highlighting
The entire color system is now themeable. Settings includes a new Theme tab with 49 editor-grade themes ported from the VS Code ecosystem — dark, light, and dual-mode options including Tokyo Night, Nord, One Dark Pro, Poimandres, Everforest, Vesper, and more. Each theme pairs its UI palette with a matched syntax highlighting scheme, so code blocks in plan and code review render with consistent colors.
A preview mode lets you cycle through themes without committing: the selected theme applies instantly, and clicking away or pressing Escape reverts to your saved choice. Theme preference persists in cookies and travels across sessions on the same machine.
- #664 by @backnotprop
Keyboard Shortcut Registry
Plan review and code review now have a declarative keyboard shortcut system. Shortcuts are defined as scopes (annotation toolbar, comment popover, file tree, AI panel, etc.) with platform-aware bindings — Cmd on macOS, Ctrl elsewhere. Double-tap and hold modifiers are supported for power-user workflows.
The system auto-generates a reference page on the marketing site at build time, so documentation stays in sync with code without manual maintenance. A help modal (press ?) surfaces all available shortcuts in context.
- #652 by @backnotprop
Smart Code-File Path Validation
When plans reference file paths (e.g., src/components/App.tsx), Plannotator now validates them against the actual project tree. Paths that exist get clickable links to a code file viewer. Ambiguous paths (multiple matches) show a picker. Missing paths display a subtle indicator so you know the reference is stale or wrong before approving the plan.
Resolution is fuzzy — it handles relative paths, paths missing a leading directory, and common shorthand. The validation batches requests to avoid hammering the filesystem on large documents. This works across plan mode, annotate mode, and linked docs.
- #654 by @backnotprop
Remote Session URL Notifications for OpenCode and Pi
Remote users on OpenCode and Pi previously couldn't see the Plannotator URL when running over SSH or in containers. The server would start, but the URL was only passed to the browser-open function, which silently fails in headless environments.
Both plugins now explicitly surface the URL through their native notification APIs: client.app.log() for OpenCode and ctx.ui.notify() for Pi. The URL appears in the TUI/UI regardless of whether a browser actually opens.
- #663 by @backnotprop, closing #551 (reported by @ZoeImport) and #574 (reported by @ShineBreaker)
Ghost Session Detection for /plannotator-last
Running /clear in Claude Code creates a new session log file, but the previous file remains on disk without a registered session ID. When plannotator last resolved the most recent log by modification time, it would find the ghost file instead of the active session, causing it to always show the same stale message.
The fix checks whether a candidate log's session ID is registered in Claude Code's session metadata. Unregistered (ghost) files from /clear are skipped, and the resolver falls through to the next candidate. This restores correct behavior for users who clear their session mid-conversation.
- #661 by @backnotprop, closing #643 (reported by @ianmurrays)
Additional Changes
- Stop diff list re-rendering on every comment keystroke. The code review annotation toolbar's form state was lifting re-renders into the entire diff view, causing visible jank when typing comments. Moved toolbar state into an isolated component with imperative communication back to the parent. (#660 by @backnotprop)
bun linksupport for local development. Contributors can now runbun linkin a checkout to get a globalplannotatorcommand pointing at the local source. A thin Node wrapper inbin/plannotator.jsspawns Bun with the source entrypoint. (#656 by @codythatsme)plannotator-setup-goalskill. A new Claude Code skill that scaffolds project goals from a markdown template usingplannotator annotate --gatefor interactive review. Includes an OpenAI agent YAML definition and a Python scaffold script. (#665 by @backnotprop)- Co-authors and community contributors on homepage. The marketing site's contributor strip now pulls from a broader list including co-authors from commit trailers and community members who've contributed through issues, discussions, and feedback. (#662 by @backnotprop)
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(ui): shortcut registry foundation by @backnotprop in #652
- fix(ui): smart resolution + existence-validation for code-file paths by @backnotprop in #654
- feat: add bun link support for local CLI development by @codythatsme in #656
- fix(review): stop diff list re-rendering on every comment keystroke by @backnotprop in #660
- fix(session-log): detect ghost sessions from /clear to resolve correct log by @backnotprop in #661
- feat(marketing): include co-authors a...
v0.19.7
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| 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 |
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
What's New in v0.19.7
v0.19.7 brings Codex plan review to Plannotator. Four PRs, two from first-time contributors, extend full plan review support to OpenAI's Codex CLI and add Codex-callable skills for review, annotate, and annotate-last. Two UX improvements for the plan and code review editors round out the release.
Codex Plan Review via Stop Hook
Plannotator now intercepts Codex plan submissions through Codex's Stop hook system. When Codex proposes a plan, the hook extracts the plan from the agent's rollout transcript, opens Plannotator in the browser, and lets you review, annotate, and approve or deny exactly as you would with Claude Code. Denying sends structured feedback back to Codex with continuation instructions, so the agent revises and resubmits.
The implementation parses Codex's output format to find the latest plan content, handles both fresh plans and revised resubmissions, and supports the full Plannotator feature set: version history, plan diff, archive, and annotation. All three install scripts (install.sh, install.ps1, install.cmd) now configure Codex hooks automatically during installation when a Codex config directory is detected.
The release pipeline also gained smoke tests that exercise the compiled binary's server startup across plan review, code review, and annotate subcommands, catching integration failures before artifacts are published.
- #577 by @ivanov17andrey, closing #497 (Codex hook support, requested by @myohei) and #105 (Codex support, requested by @muskio1)
Codex Skills for Review, Annotate, and Last
Codex's app interface doesn't accept ! shell commands in chat, which made invoking Plannotator awkward. This PR adds three OpenAI-compatible skill definitions under apps/skills/ that make Plannotator callable via $plannotator-review, $plannotator-annotate, and $plannotator-last directly from the Codex app.
Each skill instructs the agent to run the Plannotator command, wait for the browser session to complete, and then act on the returned feedback without requiring an extra follow-up message from the user. This closes a workflow gap where Codex would receive annotation feedback but sit idle until explicitly prompted to continue.
- #644 by @leoreisdias
Additional Changes
- Auto-close sidebar when TOC is empty. Documents with no level 1-3 headings (common in annotate and annotate-last sessions) no longer force-open the Table of Contents sidebar. The collapsed sidebar strip remains accessible for manual opening, and the preference resets when the document changes. Archive and annotate-folder modes are unaffected. (#651 by @backnotprop)
- Right-click to copy path or filename in file tree. The code review file tree now has a context menu on each file row with "Copy path" (repo-relative), "Copy filename", and "Copy full path" options. Full path resolves against the active worktree or agent CWD and is hidden in PR-review mode where files aren't on local disk. (#650 by @backnotprop)
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: add Codex Stop-hook plan review by @ivanov17andrey in #577
- feat: add Codex Plannotator skills by @leoreisdias in #644
- feat(review): right-click file tree row to copy path or filename by @backnotprop in #650
- feat(editor): auto-close left sidebar when TOC is empty by @backnotprop in #651
New Contributors
- @ivanov17andrey made their first contribution in #577
- @leoreisdias made their first contribution in #644
Contributors
@ivanov17andrey authored the Codex Stop-hook plan review integration (#577), bringing full plan review support to a new agent platform. The PR included Codex session parsing, install script updates across all three platforms, CI smoke tests, a reproducible E2E test harness, and documentation updates. First contribution to the project.
@leoreisdias added Codex skill definitions (#644) that bridge the gap between Codex app's UI and Plannotator's shell-based invocation. Also a first contribution.
Community members who requested Codex support:
Full Changelog: v0.19.6...v0.19.7
v0.19.6
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.5 | All-files diff view, clickable code file paths, server-side hide whitespace, non-ASCII path support |
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
What's New in v0.19.6
v0.19.6 ships 3 PRs closing 4 long-standing issues. Two changes stand out: Pi browser sessions are now fully async, so review and annotation commands no longer lock the chat while the UI is open; and OpenCode gets a visible agent picker on the Approve button, replacing the buried Settings-only agent switch. A fix for annotate-last mode rounds out the release.
Non-Blocking Browser Sessions for Pi
Every Plannotator command in Pi that opens a browser — plan review, code review, annotation, and annotate-last — previously blocked the chat session until the browser tab was closed. The chat input was locked the entire time. If the review server crashed, or the user simply forgot to close the tab, the Pi session hung indefinitely with no way to recover except restarting.
This release rewrites the Pi browser session lifecycle from the ground up. All four browser-based flows now return control to the chat immediately after opening the browser. Users can continue working, ask follow-up questions, or start entirely new tasks while the review UI stays open in a separate tab. When the user submits feedback, approves a plan, or closes the browser, the decision is forwarded back into the Pi session automatically.
The implementation introduces a BrowserDecisionSession abstraction that wraps the server lifecycle, browser launch, and decision forwarding into a single async pattern. Each session tracks its own state and cleanup, so multiple review sessions can coexist without interfering. A stop() mechanism ensures sessions are cleaned up even if the browser tab is abandoned, preventing zombie server processes.
This also required extracting assistant message parsing into a dedicated module (assistant-message.ts) and building a session state tracker (current-pi-session.ts) to correctly scope tool availability and saved state across the new async boundaries.
- #645 by @backnotprop
Agent Picker Dropdown for OpenCode
OpenCode users can now select which agent to switch to directly from a split Approve button, without opening Settings. The button label shows exactly what will happen: "Approve → Build", "Approve → Orchestrator", or just "Approve" when switching is disabled. Click the chevron to see all available agents from the OpenCode API, plus a "No switch" option that prevents any agent mode change on approval.
Before this change, agent switching was controlled by a setting buried in the Plannotator Settings panel. Most users didn't know it existed. The default was "Build", which meant every plan approval silently switched the CLI to Build mode. Users running Orchestrator workflows, Sisyphus mode, or custom agent topologies would find their agent unexpectedly changed after approving a plan.
The "No switch" option also changes the approval prompt itself. When selected, the "approved with notes" message no longer includes "Proceed with implementation," letting the current agent decide its own next step. This is particularly useful for planning-only workflows where approval shouldn't trigger immediate implementation.
Non-OpenCode origins (Claude Code, Gemini CLI, Copilot CLI) are completely unaffected and continue using the standard Approve button.
- #648, closing #575 (agent mode switching unexpectedly, reported by @luyanfeng), #114 (wrong agent on approval, reported by @xitex), #106 (Sisyphus mode compatibility, requested by @tensam), and #159 (approve without triggering implementation, requested by @gustavocaiano)
Fix Code File and Linked Doc Resolution in Annotate-Last Mode
When annotating the last assistant message (plannotator last or /plannotator-annotate last), clicking a code file path or linked document returned a 404. The annotate-last mode sets filePath to the literal string "last-message", which was passed through as a filesystem base directory for resolving relative paths. The server tried to resolve files against "last-message" as a directory, which doesn't exist.
The fix guards both the code file popout and linked doc URL builders to skip non-path values and fall back to the project root. Normal file and folder annotation are unaffected since those use real filesystem paths.
- #647 by @backnotprop
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(pi): make browser review and annotation sessions async by @backnotprop in #645
- feat(opencode): agent picker dropdown on Approve button by @backnotprop in #648
- fix(ui): code file and linked doc resolution in annotate-last mode by @backnotprop in #647
Community
Four issues drove the agent picker feature, all from users who were surprised or frustrated by invisible agent switching:
- @luyanfeng reported in #575 that their CLI switched from Orchestrator to Build mode after using Plannotator
- @xitex reported in #114 that approving a plan switched to the wrong agent, with follow-up discussion from @thoroc
- @tensam requested Sisyphus mode compatibility in #106
- @gustavocaiano requested the ability to approve a plan without triggering implementation in #159, with discussion from @arden-shackelford-q2, @emanuelsan, and @pencoyd
Full Changelog: v0.19.5...v0.19.6
v0.19.5
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.4 | All-files diff type, code file viewer, hide whitespace, quick-settings popover |
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
| v0.17.5 | Fix VCS detection crash when p4 not installed, install script cache path fix |
What's New in v0.19.5
v0.19.5 is a review editor release with five changes across four PRs and one direct commit. The headline feature is the all-files diff view, which renders every changed file in a single scrollable pane. This release also fixes two bugs reported by community members: code review failing on repos with non-ASCII file paths (Korean, Chinese, Japanese, Cyrillic, etc.), and hide-whitespace destroying code indentation.
All-Files Diff View
The review editor now has a unified scrolling mode that renders every changed file in a single pane, with sticky file headers and viewport-based lazy mounting via IntersectionObserver. Instead of clicking through files one at a time, you can scroll through the entire diff in one pass.
Each file has a sticky header that stays visible as you scroll, showing the file path, viewed/staged status, and collapse controls. Files can be collapsed individually or marked as viewed (which auto-collapses them). Keyboard shortcuts make navigation fast: [ and ] scroll between files, v marks a file as viewed and collapses it, a stages or unstages, c opens a file comment, and x collapses or expands. The z key undoes the last collapse, reopening the file and scrolling back to it.
The all-files view opens by default and coexists with single-file tabs in the Dockview panel system. Click-and-drag line selection works directly in the diff content area, not just the gutter.
- #640 by @backnotprop
File Comments in All-Files View
The single-file diff view already supported file-scoped comments via a button in the file header. The all-files view now has the same capability. Press c or click the comment button in any file's sticky header to open a comment popover anchored to that file. This rounds out the annotation workflow so you can leave file-level feedback without switching to a single-file tab.
Clickable Code File Paths in Plans
Inline code spans like `src/utils/foo.ts` and bare prose paths like packages/server/index.ts are now detected as code file paths and rendered as clickable elements. Clicking one opens the code file viewer with syntax highlighting, the same viewer introduced in v0.19.4 for markdown file links.
Backtick-wrapped paths use direct file extension matching, while bare prose paths require a / separator to avoid false positives on plain words. A subtle shimmer animation hints at interactivity without disrupting the familiar inline-code appearance. The shimmer respects prefers-reduced-motion.
- #639 by @backnotprop
Server-Side Hide Whitespace
The hide-whitespace toggle introduced in v0.19.4 processed whitespace suppression on the client side by normalizing file contents before diffing. This worked for most cases but had a side effect: the normalization trimmed and collapsed whitespace in the file content itself, destroying all code indentation in the rendered diff.
The fix moves whitespace handling to the server, where git diff -w does the comparison correctly. Git ignores whitespace for diffing purposes but preserves the original formatting in its output. The setting is read from ~/.plannotator/config.json on startup so the initial diff already respects the saved preference. Toggling the setting does an in-place patch update without resetting the active file.
- #638 by @backnotprop, fixing indentation regression reported by @zeroZshadow on #631
Non-ASCII and Whitespace File Path Support
Code review was showing 0 files when the repository contained paths with non-ASCII characters (Korean, Chinese, Japanese, accented Latin, Cyrillic, etc.) or whitespace. Git defaults to core.quotePath=true, which emits paths as octal escapes (e.g., \355\225\234\352\265\255\354\226\264 instead of 한국어). The diff parser expected unquoted paths and silently dropped every affected file.
The fix passes -c core.quotePath=false as a per-invocation flag to both the Bun and Pi server git entry points. This outputs raw UTF-8 paths without modifying the user's git config. It has no effect on ASCII-only repositories.
- #637, closing #628 reported by @silee9019
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
- fix(review): support non-ASCII and whitespace file paths in code review by @backnotprop in #637
- fix(review): move hide-whitespace to server-side git diff -w by @backnotprop in #638
- feat(ui): detect code file paths in backtick spans and bare prose by @backnotprop in #639
- feat(review): all-files diff view with unified scrolling by @backnotprop in #640
- feat(review): file comment button in all-files view + remap C/X shortcuts by @backnotprop
Community
Two community reports directly shaped this release:
- @silee9019 filed a detailed bug report in #628 documenting the non-ASCII file path issue, including a minimal reproduction case and the root cause analysis that identified
core.quotePathas the culprit - @zeroZshadow caught the hide-whitespace indentation regression on #631, which led to the server-side rewrite in #638
Full Changelog: v0.19.4...v0.19.5
v0.19.4
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.3 | Configurable feedback messages, hide merged PRs in stacked PR selector |
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
| v0.17.5 | Fix VCS detection crash when p4 not installed, install script cache path fix |
| v0.17.4 | Vault browser merged into Files tab, Kanagawa themes, Pi idle session tool fix |
What's New in v0.19.4
v0.19.4 is a review editor release. Six PRs bring a new diff type for reviewing entire repos, a code file viewer with syntax highlighting and annotation support, per-file quick-settings for diff display, and a hide-whitespace toggle that matches GitHub's ?w=1 behavior.
"All Files" Diff Type
Sometimes you want to review an entire repository, not just uncommitted changes. The new "All files" diff type diffs the empty tree against HEAD, showing every tracked file as an addition. This is useful when a repo has no working tree changes but you still want to launch a review, or when you want to browse the full codebase through the review UI.
The option appears in the diff type dropdown alongside the existing choices and can be set as the default preference in the setup dialog or config.
- #629 by @backnotprop
Code File Viewer with Syntax Highlighting and Annotations
Clicking a code file link (.ts, .py, .go, etc.) in a plan or annotated document now opens a read-only dialog with full syntax highlighting. The server runs preloadFile from @pierre/diffs/ssr to return pre-rendered HTML, so there's zero client-side Shiki cost and the file renders instantly.
The viewer supports line-level annotations: click the gutter button on any line, select a line range, or drag across text to add a comment. Annotations appear in the sidebar panel alongside prose annotations and are included in exported feedback. Draft recovery covers code file annotations as well, so nothing is lost if the server restarts.
Under the hood, the dialog uses a new reusable PopoutDialog component extracted from the table popout, which also fixes the table popout's missing backdrop blur.
- #634 by @backnotprop
Hide Whitespace
A new toggle suppresses whitespace-only changes in diffs, matching GitHub's ?w=1 / git diff -w behavior. When enabled, re-indentation, alignment padding, and interior whitespace changes are removed from the diff, leaving only substantive code changes visible. The implementation normalizes all whitespace runs to a single space before diffing, so interior whitespace changes like alignment shifts and extra spaces between tokens are correctly suppressed.
The toggle is available in the per-file quick-settings popover and in the global settings dialog. Default: off.
- #631 by @backnotprop
- #635 by @backnotprop
Quick-Settings Popover
Each file header in the review editor now has a gear icon that opens a compact popover with all diff display options: style (split/unified), overflow mode, change indicators, inline diff granularity, line numbers, diff background colors, and hide whitespace. This provides quick per-file access to display options without opening the full settings dialog.
- #631 by @backnotprop
Additional Changes
- Gutter hover button fix: The
+button for adding line comments wasn't rendering because Pierre updates hover state imperatively (no React re-render). The button now always renders and checks hover state at click time. Button styling was also updated to match Pierre's theme spec. — #630 - @pierre/diffs 1.1.20: Picks up split-view scroll fix, WorkerPool race condition fix, hydration fixes, CSS refactoring, and empty-file-as-deleted fix. — #630
- File tree expand toggle: The separate expand-all and collapse-all buttons are replaced with a single toggle. Shows the collapse action when all folders are expanded, otherwise shows expand. Disabled when the tree has no folders. — #633
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(review): add "All files" diff type by @backnotprop in #629
- fix(review): gutter hover button not rendering + update @pierre/diffs to 1.1.20 by @backnotprop in #630
- feat(review): diff display options — hide whitespace + quick-settings popover by @backnotprop in #631
- feat(review): single file tree expand/collapse toggle by @backnotprop in #633
- feat(ui): code file viewer with syntax highlighting and annotations by @backnotprop in #634
- fix(review): hide-whitespace matches GitHub's git diff -w by @backnotprop in #635
Full Changelog: v0.19.3...v0.19.4
v0.19.3
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.2 | Stacked PR review, source line numbers in feedback, diff type dialog re-show, ghost dot removal, docs cleanup |
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
| v0.17.5 | Fix VCS detection crash when p4 not installed, install script cache path fix |
| v0.17.4 | Vault browser merged into Files tab, Kanagawa themes, Pi idle session tool fix |
| v0.17.3 | Sticky lane repo/branch badge overflow fix |
What's New in v0.19.3
v0.19.3 makes feedback messages fully configurable and cleans up the stacked PR selector for teams working with long PR chains. Three PRs, one from an external contributor.
Configurable Feedback Messages
Every message Plannotator sends to your agent is now customizable through ~/.plannotator/config.json. Plan approvals, plan denials, review approvals, review feedback suffixes, and annotation feedback all flow through a shared prompt pipeline with {{variable}} template interpolation.
The config supports generic overrides that apply to all runtimes, plus per-runtime overrides for cases where Claude Code, OpenCode, and Pi need different phrasing. A four-level resolution order (runtime-specific, generic, runtime built-in default, global default) means you can be as granular or as broad as you want. Users who don't touch the config get identical behavior to previous versions.
This started with @oorestisime's PR adding configurable review approval prompts (#561), which was then expanded to cover all 17 hardcoded feedback strings across the hook, OpenCode, and Pi integrations (#627). The full pipeline includes 72 tests (55 unit, 17 integration) covering template resolution, config merging, backward compatibility, and end-to-end disk-to-output flow.
A new documentation page at Custom Feedback walks through the config format, available template variables, and a context-anchoring pattern contributed by @aviadshiber.
- #561 by @oorestisime, closing #558
- #627 by @backnotprop, closing #624
Hide Merged PRs in Stacked PR Selector
When reviewing a long chain of stacked PRs, merged PRs would show up alongside open ones in the stack tree and PR selector. For teams that iterate through a stack over several sessions, this made it harder to see which PRs still needed review.
A "Hide merged" toggle now appears in both the stack tree popover and the PR selector dropdown. When enabled, merged PRs are removed from the list and a summary count shows how many are hidden. When visible, merged PRs appear dimmed with a strikethrough title and a "merged" badge, and they're not clickable. The toggle state persists via cookie across sessions. Tree indentation was also tightened to 2px per level to prevent horizontal overflow on deep stacks (10+ nodes).
- #626 by @backnotprop, closing #625
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(review): add configurable approval prompts by @oorestisime in #561
- feat(review): hide/de-emphasize merged PRs in stacked PR selector by @backnotprop in #626
- feat(feedback): configurable plan, annotation, and review feedback by @backnotprop in #627
Contributors
@oorestisime filed #558 requesting commit-on-approve for code review sessions, then contributed #561 adding configurable review approval prompts. That PR seeded the broader feedback customization pipeline shipped in this release.
Community members whose issues shaped this release:
- @JohannesKlauss filed #624 requesting customizable feedback prompts for the build agent handoff
- @leoreisdias filed #625 requesting that merged PRs be hidden from the stacked PR selector, with a detailed description of the 10+ PR workflow that motivated the change
- @aviadshiber contributed a context-anchoring prompt pattern featured in the custom feedback documentation
Full Changelog: v0.19.2...v0.19.3
v0.19.2
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.1 | Hook-native annotation, custom base branch, OpenCode workflow modes, quieter plan diffs, anchor navigation |
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
| v0.17.5 | Fix VCS detection crash when p4 not installed, install script cache path fix |
| v0.17.4 | Vault browser merged into Files tab, Kanagawa themes, Pi idle session tool fix |
| v0.17.3 | Sticky lane repo/branch badge overflow fix |
| v0.17.2 | Supply-chain hardening, sticky toolstrip and badges, overlay scrollbars, external annotation highlighting, Conventional Comments |
What's New in v0.19.2
v0.19.2 adds stacked PR review, source line numbers in exported feedback, and several UX fixes. Five PRs, one from a first-time contributor.
Code Review
Stacked PR Review
Reviewing a PR that belongs to a stack used to mean reviewing it in isolation. You could see the diff for that one branch, but not how it fit into the larger chain. Switching to a different PR in the stack meant closing the review and starting a new session.
Stacked PR review keeps you in a single session across every PR in the stack. A stack tree popover shows the full chain with clickable navigation. Each PR gets its own worktree checkout, so switching PRs recomputes the diff against the correct base without mixing changes between layers. Two scope modes let you toggle between viewing a single PR's changes (layer) and all accumulated changes from the default branch (full-stack).
Multi-PR posting lets you submit review feedback to multiple PRs at once. A confirmation dialog shows exactly where comments will go before posting to GitHub or GitLab, with parallel submission and partial-failure retry. Annotations from full-stack diffs can't be mapped to a single PR's line numbers, so they're surfaced as copyable markdown rather than silently dropped.
A new "Branch" option in the default diff type setting (and first-run dialog) gives users who work primarily with committed changes a one-click default.
- #620 by @backnotprop
Source Line Numbers in Exported Feedback
When Claude receives annotation feedback, it got the block content and the highlighted text but had no way to locate the annotation in the source file. For large documents with repeated headings or similar paragraphs, this ambiguity forced extra round-trips.
Exported annotations now include source line numbers. Single-line blocks show (line 42), multi-line blocks show (lines 10–14). Code blocks account for fence lines when computing ranges. Files with YAML frontmatter are offset-corrected so line numbers match the original file, not the parsed output.
For converted content (HTML files rendered through Turndown, URLs fetched via Jina Reader), the feedback includes a caveat that line numbers refer to the converted markdown rather than the original source. When viewing a linked HTML document within a plan, the conversion flag is derived per-document so mixed collections of markdown and HTML files each get the correct label.
- #623 by @backnotprop
UX
Diff Type Dialog Re-Presented
Many users who set up Plannotator before v0.17.8 never saw the "Committed" option (branch diff vs. the default branch) because the first-run dialog only showed at install time. Users were asking how to set committed changes as their default without realizing the option existed.
The dialog is now re-presented to existing users with clearer descriptions, a wider layout with a 60/40 split, and a hover-to-zoom preview of the toolbar dropdown. The dialog reminds users they can switch views anytime during a review. Existing preferences are preserved — this only re-shows the picker, it doesn't reset anyone's choice.
Options Menu Ghost Dot Removed
The pulsing notification dot on the Options menu was meant to flag new settings after an update. In practice, the dot appeared on every session and users couldn't figure out how to dismiss it. The entire new-settings-hint system has been removed. Settings changes are communicated through release notes instead.
Additional Changes
- Docs: toolbar inventory updated. Documentation references to "Insert" and "Replace" annotation types have been scrubbed to match the shipped UI, which uses Delete, Comment, Quick Label, Looks Good, Global Comment, and Copy. — #618 by @vxio, closing #617
- Docs: OpenCode plugin configuration. Clarified plugin setup instructions for OpenCode users. — commit
33f409a
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: stacked PR review — PR switching, scope toggling, multi-PR posting by @backnotprop in #620
- feat(plan,annotate): include source line numbers in exported feedback by @backnotprop in #623
- docs: scrub Insert/Replace from docs to match shipped UI by @vxio in #618
- fix: remove ghost dot on Options menu (new-settings-hint system) by @backnotprop in commit
7ab2d8f - fix: re-show diff type setup dialog with clearer options and toolbar hint by @backnotprop in commits
aaad89e,03d4e8b
New Contributors
Community
@vxio noticed the docs still referenced Insert and Replace annotation types that were removed from the UI, filed #617, and contributed the fix in #618. First contribution to the project.
Full Changelog: v0.19.1...v0.19.2
v0.19.1
Follow @plannotator on X for updates
Missed recent releases?
| Release | Highlights |
|---|---|
| v0.19.0 | Code Tour agent, GitHub-flavored Markdown, copy table as Markdown/CSV, flexible Pi planning mode, session-log ancestor-PID walk |
| v0.18.0 | Annotate focus & wide modes, OpenCode origin detection, word-level inline plan diff, Markdown content negotiation, color swatches |
| v0.17.10 | HTML and URL annotation, loopback binding by default, Safari scroll fix, triple-click fix, release pipeline smoke tests |
| v0.17.9 | Hotfix: pin Bun to 1.3.11 for macOS binary codesign regression |
| v0.17.8 | Configurable default diff type, close button for sessions, annotate data loss fix, markdown rendering polish |
| v0.17.7 | Fix "fetch did not return a Response" error in OpenCode web/serve modes |
| v0.17.6 | Bun.serve error handlers for diagnostic 500 responses, install.cmd cache fix |
| v0.17.5 | Fix VCS detection crash when p4 not installed, install script cache path fix |
| v0.17.4 | Vault browser merged into Files tab, Kanagawa themes, Pi idle session tool fix |
| v0.17.3 | Sticky lane repo/branch badge overflow fix |
| v0.17.2 | Supply-chain hardening, sticky toolstrip and badges, overlay scrollbars, external annotation highlighting, Conventional Comments |
| v0.17.1 | Pi PR review parity, parseRemoteUrl rewrite, cross-repo clone fixes, diff viewer flash fix |
What's New in v0.19.1
v0.19.1 adds gated approval and hook-native output to plannotator annotate, so you can integrate annotation review into spec-driven workflows and agent hook pipelines. Code review gains a base-branch picker, and OpenCode users get explicit control over which agents can submit plans. Seven PRs, one from a first-time contributor.
Annotate
Hook-Native Annotation for Spec-Driven Workflows
Spec-driven development frameworks like spec-kit, kiro, and openspec generate multiple markdown artifacts that go through iterative review. Previously, integrating Plannotator's annotation UI into a hook pipeline required a wrapper script to parse stdout and translate it into the host's hook protocol. That friction made adoption impractical for most setups.
plannotator annotate now ships a --hook flag that emits hook-native JSON directly. Pass plannotator annotate "$FILE" --hook as a PostToolUse or Stop hook command, and the output works with Claude Code and Codex hook protocols without any glue code. Approve emits {"decision":"allow"}, annotate emits {"decision":"block","reason":"..."} with the feedback inlined, and dismiss emits {"decision":"allow"} with no side effects. The flag implies --gate (three-button UX: Approve / Annotate / Close) and supersedes --json when both are passed.
The underlying --gate flag landed first as a standalone feature, adding the three-way review UX and structured JSON output. --hook builds on it by mapping those three outcomes to the hook protocol's allow and block decisions, removing the need for intermediate translation.
- #606 and #610, closing #570 reported by @punk-dev-robot
Code Review
Custom Base Branch
Code review diffs used to compare against the auto-detected default branch. For teams that branch from develop, release/*, or another feature branch, the diff showed changes that had nothing to do with the current PR. Users had to live with noisy diffs or skip review entirely.
A searchable base-branch picker now appears in the review toolbar for Branch diff and PR Diff modes. Select any local or remote branch as the comparison target, and the diff recomputes server-side against the chosen base. The picker is hidden in modes where a base doesn't apply (staged, unstaged). Branch lists and merge-base resolution live in packages/shared/review-core.ts, so both the Bun and Pi runtimes share the same logic.
Async Remote Default Branch Detection
When origin/HEAD isn't set (common in worktrees, manually added remotes, and long-lived repos), the review server fell back to local main instead of querying the remote. This silently produced wrong diffs when the upstream default branch was develop or trunk.
The server now runs git ls-remote --symref origin HEAD as a network-based fallback with a 3-second timeout. It detects any default branch name without hardcoded guesses. On the Pi runtime, this fix also replaced the synchronous spawnSync git adapter with an async spawn implementation, so the 3-second timeout no longer blocks the entire Node.js event loop during startup.
- #609 and commit
5a1dd03
OpenCode
Workflow Modes for Planning Agents
OpenCode's submit_plan tool was available to every agent in the session, including build agents, test runners, and subagents that had no business writing plans. This caused confusion when non-planning agents surfaced the tool in their capabilities and occasionally called it by accident.
The plugin now supports three explicit workflow modes. plan-agent (the new default) keeps submit_plan visible only to OpenCode's built-in plan agent and any additional agents listed in the planningAgents configuration. manual hides submit_plan entirely and relies on slash commands (/plannotator-review, /plannotator-annotate, etc.) for all interactions. all-agents restores the previous behavior for users who intentionally route planning through non-default agents.
- #571, closing #422 requested by @timrichardson
Plan Diff
Quieter Diffs on Prose Edits
Plan diffs use word-level diffing, which produces readable results for most code-like edits but struggles with three specific patterns: markdown emphasis delimiters (**bold** → **new bold**), adjacent word-level swaps, and hyphenated compound changes. The diff engine highlighted individual characters in ways that were technically correct but hard to parse visually.
Three post-processing passes now clean up these patterns. Bold-phrase swaps collapse into single changed regions instead of fragmenting across delimiter boundaries. Adjacent single-word changes merge when they share a boundary. Hyphenated compounds that change a single segment highlight the full compound rather than the hyphen and segment separately.
In-Page Anchor Navigation
Clicking a #-prefixed link in the plan viewer scrolled the entire browser window instead of the plan content viewport. Since plans render inside a sticky scroll container, the native jump missed the target entirely.
Anchor clicks are now intercepted and smooth-scrolled within the correct viewport. Each heading exposes both a canonical slug (collapsed separators) and a legacy slug via data-anchor-aliases, so previously shared URLs keep resolving. Initial-hash and hashchange events are handled so direct links land on the right heading after load.
- #605 by @dgrissen2
Additional Changes
- Pi async git runtime. The Pi extension's git adapter used
spawnSync, which blocked the Node.js event loop during every git operation. Replaced with an asyncspawnimplementation that mirrors the Bun server's pattern, including timeout support viaproc.kill(). This was particularly important fordetectRemoteDefaultBranch, which fires at review server startup with a multi-second timeout. (commit5a1dd03)
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/...