Skip to content

Upstream: @opencode/plugin@2.2.5 + @opentui/core@0.8.1 + @opentui/solid@0.8.1 compatibility report #99

Open

Description

@devin-ai-integration

TL;DR: Nothing breaks. The five V2 plugins need only a pin bump (@opencode/plugin 2.2.5, plus @opentui/{core,solid} 0.8.1 where pinned). The V1-only prompt-inheritance plugin is unaffected. No published version breaks for users on OpenCode 2.2.5 or on OpenTUI 0.8.1, and no peer range needs tightening now. Upstream V1 prompts haven't changed. The prompt sync is still broken (#96) and has failed every day through Oct 31.

Base: main @ cb6d3dde2. Bumps: @opencode/plugin 2.2.0 → 2.2.5, @opentui/core + @opentui/solid 0.7.0 → 0.8.1 (v0.8.1 release, compare v0.8.0...v0.8.1). The SDK side through 2.2.5 is covered in #96, #97 and #98, and 2.2.5 is still the latest @opencode/plugin. This report covers the new OpenTUI 0.8.0 → 0.8.1 delta, plus the upstream OpenCode dev commits made since v2.2.5 that move the host to OpenTUI 0.8.1.

Per-plugin verdict

Package (published latest) Verdict Peer range Notes
opencode-agents-loader (2.0.2) needs pin bump only (@opencode/plugin) >=2.0.2 <3: OK no OpenTUI use
opencode-adversarial-review (2.0.2) needs pin bump only (@opencode/plugin) >=2.0.2 <3: OK smoke ✅
opencode-double-tap-timeline (2.0.1) needs pin bump only (all three) @opentui/* >=0.5.10: OK uses useKeyboard + context.keymap, see keymap note
opencode-output-styles (2.2.0) needs pin bump only (all three) >=2.2.0 <3, @opentui/* >=0.6.6: OK smoke ✅ (server + TUI)
opencode-ram-monitor (2.1.1) needs pin bump only (all three) >=2.1.0 <3, @opentui/* >=0.6.6: OK smoke ✅; there's a minor layout watch-item, see below
opencode-agent-prompt-inheritance (1.0.1, V1) unaffected @opencode-ai/plugin >=1.19.3 <2 depends on neither package

Gate results

I bumped the dev pins in 5 packages in a scratch copy of main. bun install resolved @opencode/plugin 2.2.5, @opentui/{core,solid} 0.8.1 and solid-js 1.9.17. I ran on Bun 1.4.4 with Node 24.22.2 and npm 11.6.2.

Gate Result
bun run typecheck ✅
bun run lint ✅
bun run test ✅ guard 61/61; loader 28, timeline 18, output-styles 99, ram-monitor 77, adversarial-review 70, prompt-inheritance 39; 0 fail
bun run build ✅
smoke: adversarial-review / output-styles / ram-monitor (Bun 1.4.4) ✅ / ✅ / ✅
same smokes on Bun 1.3.12 (repo packageManager) ✅ / ❌ / ❌, the known ResolveMessage issue from #96 (Cannot find module '…/rpc' / '…/server'). This bump didn't cause it.

Some tests need a real node/npm on PATH: guard R11/R12, loader "root server wrapper… inert on import" and timeline "real Node Host.resolve". Without one they fail the same way on the unbumped baseline, so they aren't a regression signal.

Upstream changes that matter

OpenTUI 0.8.1 (release notes):

  • Zero-size nodes are no longer drawn (#1869). When Yoga gives a node 0 rows or 0 columns, OpenTUI now skips drawing it. Before, it drew it as 1 cell on top of its siblings. This is the only change that can show in existing UIs. Watch-item: the ram-monitor /ram modal (RamModal in src/tui.ts) is a column of a "RAM Usage" title, a scrollbox (maxHeight: 24) and a close hint, and none of them sets flexShrink: 0. On a very short terminal Yoga can shrink the title or hint to 0 rows. They would then vanish instead of overlapping the list. That's cosmetic, and existing tests and smokes don't cover it. The sidebar widget already sets flexShrink: 0 where it matters. Optional hardening:
    // packages/opencode-ram-monitor/src/tui.ts (RamModal)
    createTextNode({ fg: () => theme().text, wrapMode: "none", truncate: true, flexShrink: 0 }, () => "RAM Usage"),
    // …and the same `flexShrink: 0` on the close-hint text node
  • keymap useBindings keeps layer position on re-register (#1785), paired on the host side with opencode bf544cd41 / #59294 ("keep keymap command objects while their data is unchanged"). output-styles registers commands through context.keymap.layer(() => …), and double-tap-timeline calls context.keymap.dispatch("session.timeline"). Both only touch the host wrapper and neither depends on layer ordering, so the change doesn't affect either. It does fix churn: re-registered layers no longer jump to the top.
  • Native stdout writer thread (Linux/macOS TTY, #1858). You can opt out with OTUI_STDOUT_THREAD=0. Close/restore over slow links is also more reliable (#1872, #1893). Both are host-level and transparent to plugins. ram-monitor cleanup is unaffected: it already uses onCleanup, and renderer.idle() still exists.
  • Select / TabSelect / TextTable / LineNumber now paint into the frame (#1831, #1834, #1833). Translucent colors may blend slightly differently. No plugin here uses these components.
  • markdown restyle fixes (#1857), and a ScrollBox-in-Markdown collapse and listener-leak fix (#1863). These are fixes that ram-monitor's markdown-in-scrollbox modal benefits from. They need no code change.
  • The breaking changes are native-only: the ot_session_renderer_state struct grew to 40 bytes, and building now needs Zig 0.17. The packages here only use the JS API through the host, so neither breaking change applies.
  • Additive APIs: VideoRenderable / <video>, crop on images, the frame:dropped event and maxWidth/ellipsis text draws. None of them is used here.

OpenCode host (after v2.2.5, on dev, unreleased):

  • 8db3d852c (#60913) bumps the host catalog to OpenTUI 0.8.1 and raises the @opencode/plugin peers to @opentui/{core,solid} >=0.8.1 (still optional). OpenCode 2.2.5 itself ships OpenTUI 0.8.0, so the next release (2.2.6+) is the first host on 0.8.1.
  • Config loading, #60803 (6b08407a5): config discovery now lists each ancestor directory once instead of probing every candidate. The candidate list (.claude, .agents, .opencode, …) and the symlink handling stay the same, so agents-loader's generated .opencode/ agent files are still found. Related changes: #60787 only rebuilds providers on account switch when a plugin's state changed, and #60921 adds in-memory skill:// URIs. All three are additive or perf-only for these plugins.
  • Commands: the only change is a new CLI flag, --worktree/-w. No new TUI slash commands were added, so /ram, /output-style, /adversarial-review and /constructive-review still don't collide with anything. No commits since v2.2.5 touch plugin package resolution (Host.resolve).

Are published versions broken on the new upstream?

No. The published TUI bundles mark @opentui/* and solid-js as external, so they run on whatever OpenTUI the host ships. Every API they use (createElement/insert/spread, useKeyboard, SyntaxStyle, scrollbox/markdown) is unchanged in 0.8.1, and the tests and built-artifact smokes pass against it. Caveat: this rests on tests, smokes and the release notes. I didn't run a live OpenCode TUI session on OpenTUI 0.8.1, and no released host ships it yet.

Peer ranges

No tightening needed. Nothing here uses a 0.8.1-only API. Raising the @opentui/* peers to >=0.8.1 would exclude every released 2.2.x host (2.2.5 ships 0.8.0).

For the pin-bump PR (not applied):

// packages/{opencode-double-tap-timeline,opencode-ram-monitor,opencode-output-styles}/package.json → devDependencies
"@opencode/plugin": "2.2.5",
"@opentui/core": "0.8.1",
"@opentui/solid": "0.8.1",
// packages/{opencode-agents-loader,opencode-adversarial-review}/package.json → devDependencies
"@opencode/plugin": "2.2.5",

Bump all three together. The 2.2.5 SDK peers @opentui/* >=0.8.0, which the current 0.7.0 dev pins don't meet. Once the next SDK release lands with >=0.8.1 (#60913), an 0.8.0 pin won't meet it either, so go straight to 0.8.1. Peer strings stay distinct from the dev pins, as the AGENTS.md Dependabot rule requires.

Vendored prompt sync (opencode-agent-prompt-inheritance)

Did upstream prompts change? No. I ran bun run sync:prompts in the scratch copy:


Method: I read the OpenTUI v0.8.1 release notes and the v0.8.0...v0.8.1 compare. I also checked the OpenCode dev commits since v2.2.5 and the npm registry metadata for @opencode/plugin and @opentui/*. Gates and smokes ran in a throwaway copy that has since been deleted. Nothing was pushed or committed.

Written by Devin

Activity

  1. devin-ai-integration commented on Nov 2, 2026

    @devin-ai-integration
    Author

    Re-check on current main (323d57270). Verdict unchanged: nothing breaks. Main now pins @opencode/plugin 2.2.5 + @opentui/{core,solid} 0.8.0 (5b5aaa455), so this run covers the remaining 0.8.0 → 0.8.1 bump. It also adds opencode-auto-advisor, which the report above didn't cover. No published version breaks on OpenTUI 0.8.1, and no peer range needs tightening. Upstream V1 prompts haven't changed.

    Per-plugin verdict

    Package (published latest) Verdict Peer range
    opencode-double-tap-timeline (2.0.1) pin bump only @opentui/* >=0.5.10: OK
    opencode-output-styles (2.2.0) pin bump only @opentui/* >=0.6.6: OK
    opencode-ram-monitor (2.1.1) pin bump only (the RamModal flexShrink watch-item above still applies) @opentui/* >=0.6.6: OK
    opencode-auto-advisor (2.1.0) pin bump only. Its panel header and close hint already set flexShrink: 0, so the 0.8.1 zero-size-node change (#1869) doesn't affect it @opentui/* >=0.8.0: OK
    opencode-agents-loader (2.0.2), opencode-adversarial-review (2.0.2) unaffected (no OpenTUI use) OK
    opencode-agent-prompt-inheritance (1.0.1, V1) unaffected OK

    Gate results (scratch copy; Bun 1.3.12 = repo packageManager, Node 22.23.4, npm 12.2.1)

    bun install resolved @opentui/core 0.8.1, @opentui/solid 0.8.1, @opencode/plugin 2.2.5 and solid-js 1.9.17.

    Gate 0.8.0 baseline 0.8.1 bump
    bun run typecheck ✅ ✅
    bun run lint ✅ ✅
    bun run test ✅ guard 70; adversarial 70, prompt-inh 39, loader 28, auto-advisor 222, timeline 18, output-styles 99, ram-monitor 77; 0 fail ✅ same counts, 0 fail
    bun run build ✅ ✅
    smoke adversarial / output-styles / ram-monitor / auto-advisor, Bun 1.4.4 ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅
    same smokes on Bun 1.3.12 ✅ ❌ ❌ ❌ ✅ ❌ ❌ ❌
    • The Bun 1.3.12 smoke failures are the known self-reference ResolveMessage (Upstream: @opencode/plugin@2.2.1 compatibility report #96), e.g. Cannot find module '@capybearista/opencode-auto-advisor/rpc'. They happen on the baseline too, so the bump didn't cause them.

    • Flake, not a regression: the first turbo bun run test failed one test on each side:

      • baseline: auto-advisor active (default) > requests from before a restart…
      • bump: ram-monitor modal > renders the TUI and server trees. The markdown heading rows were still blank when the 20×25 ms render loop ended.

      After that I ran the full suite three more times on each side (--continue --force), ran ram-monitor tui.test.ts 10× on its own, and ran that test 8× per side with the CPU pegged. Everything passed. If it comes back, a fixed-attempt loop is what makes it timing-sensitive. One fix is to poll until the heading appears:

      // packages/opencode-ram-monitor/src/tui.test.ts (renderModal)
      const text = async (until = "OpenCode RAM Usage") => {
        for (let attempt = 0; attempt < 80; attempt++) {
          await Bun.sleep(25);
          await setup.renderOnce();
          const frame = setup.captureCharFrame();
          if (frame.includes(until)) return frame;
        }
        return setup.captureCharFrame();
      };

    Upstream changes since the report above

    • OpenTUI: 0.8.1 is still latest on npm, so there's nothing new beyond the 0.8.1 notes above (release).
    • OpenCode dev (no release since v2.2.5, which still ships OpenTUI 0.8.0; dev is on 0.8.1 via #60913):
      • #61176 (d4a5fb4d2) tidies the plugin host and config-reload wiring. It's a refactor: plugin-source directory matching moves into ConfigEntryObserver.isDirectorySource and location responses go through a shared atLocation. No Plugin.Context shape change.
      • #61137 logs the real plugin ID in unknown-event warnings. Diagnostics only.
      • #61182 pins platform-node-shared so the packed SDK has a single Effect runtime. It's a packaging fix with no API change.
      • No changes to keymaps, the command registry or Host.resolve.

    Are published versions broken? Do peers need tightening?

    No to both. The published TUI bundles keep @opentui/* and solid-js external and use no 0.8.1-only API. Every package's tests and built-artifact smokes pass against 0.8.1. Raising the peers to >=0.8.1 would exclude OpenCode 2.2.5, the latest released host, which ships 0.8.0. Caveat: I didn't run a live OpenCode TUI, and no released host ships 0.8.1 yet.

    Pin bump (not applied):

    // packages/{opencode-double-tap-timeline,opencode-ram-monitor,opencode-output-styles,opencode-auto-advisor}/package.json → devDependencies
    "@opentui/core": "0.8.1",
    "@opentui/solid": "0.8.1",

    Bump all four together so Dependabot sees identical pins. The peer strings stay distinct from the dev pins.

    Vendored prompt sync (opencode-agent-prompt-inheritance)

    Did upstream prompts change? No.

    • bun run sync:prompts (default ref dev) fails: Failed to fetch trinity.txt: 404. dev no longer has the V1 prompt dir.
    • OPENCODE_UPSTREAM_REF=v1 fails with copilot-gpt-5.txt: 404, because #59669 removed it.
    • I synced v1 without copilot-gpt-5.txt. Every file matched the vendored copy byte for byte except default.txt, which still has the known drift (548648a3d). The last commit to the v1 prompt dir is still b01498d3f (Oct 27).
    • The Sync OpenCode Prompts workflow failed again on Nov 1. The Upstream: @opencode/plugin@2.2.1 compatibility report #96 fix still applies.

    Method: I read the v0.8.0...v0.8.1 compare, OpenCode dev commits since Nov 1, and npm metadata. Gates and smokes ran in a throwaway copy that has since been deleted. Nothing was pushed or committed.

    Written by Devin

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions