Skip to content

Commit b763314

Browse files
committed
Be honest about opencode: feature is upstream-pending, not just unshipped
opencode 1.14.48 has no plugin-side statusline hook. I enumerated the full event surface in @opencode-ai/plugin's dist/index.d.ts to be sure: chat.{headers,message,params}, command.execute.before, experimental.* (messages/system transform, compaction, text), permission.ask, shell.env, tool.{definition,execute.before,execute.after}. All behavioral hooks. No render surface. tui.showToast is transient. chat.message injection works but costs context tokens — exactly what upstream issue anomalyco/opencode#8619 was filed to avoid. So opencode is upstream-blocked, not waiting on us. The installer was printing 'opencode wired' on success, which misled users into thinking the statusline would appear. It now prints a clear 'pending upstream' warning with the issue link. Config keys are still written speculatively so a future upstream ship auto-activates without re-install. README + AGENTS.md status rows updated to match.
1 parent 9db9981 commit b763314

4 files changed

Lines changed: 26 additions & 6 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Be honest in user-facing docs about which of these installers is wiring somethin
4141
|--------------|-----------------------------|-------|
4242
| Claude Code | ✓ shipped | `settings.json.statusLine = {type:"command", command, padding}` — official. |
4343
| Copilot CLI | ✓ shipped | Config lives in `~/.copilot/config.json`. The neighbouring `settings.json` is read for unrelated user prefs and a misleading header comment ("User settings belong in settings.json") — its `statusLine` key is **ignored**. Requires the experimental feature gate, which we persist with `"experimental": true` in the same file (equivalent to launching `copilot --experimental`). The `command` path must be **absolute** (no `~`, no env var expansion) and the script must be executable with a valid shebang. config.json starts with `//` comment lines that jq can't parse — installer strips them before merging. Verified against Copilot CLI 1.0.46 and griches/copilot-hud's setup skill. |
44-
| OpenCode | ⚠ not shipped | Feature request open at anomalyco/opencode#8619. Our installer writes `.statusline` and `.experimental.statusline` keys speculatively so a future ship lands without a re-install. Today the runtime ignores them; the AGENTS.md drop is what carries weight. |
44+
| OpenCode | ✗ upstream-pending | Verified against opencode 1.14.48: no plugin-side statusline hook exists. Full event surface from `@opencode-ai/plugin` 1.14.48's `dist/index.d.ts`: `chat.{headers,message,params}`, `command.execute.before`, `experimental.{chat.messages.transform,chat.system.transform,compaction.autocontinue,session.compacting,text.complete}`, `permission.ask`, `shell.env`, `tool.{definition,execute.before,execute.after}`. All behavioral, none persist UI. Tracking: anomalyco/opencode#8619 (still open). Our installer writes `.statusline.command` and `.experimental.statusline.command` keys speculatively so a future upstream ship lands without re-install — until then the runtime ignores them and we print a "pending upstream" warning. |
4545
| Pi | ✓ shipped (native extension)| `~/.pi/agent/extensions/kinncj-statusline/` — an `ExtensionFactory` (`statusline.mjs`) that subscribes to `session_start`/`turn_end`/`tool_execution_end`/`agent_end`/`model_select`, synthesizes a Claude-shaped payload from `ctx.cwd` + `ctx.model` + `ctx.getContextUsage()`, execs the sibling `statusline.sh`, and renders the stdout as a multi-line widget under the editor via `ctx.ui.setWidget(key, lines, {placement:"belowEditor"})`. Auto-discovered by Pi from `<agentDir>/extensions/` — no settings to edit. Renders below Pi's native footer rather than replacing it, so both lines coexist. Verified against `@earendil-works/pi-coding-agent` 0.73.1 (formerly `@mariozechner/pi-coding-agent`). |
4646
| Hermes | ✗ no scriptable statusline | Built-in TUI; only `display.tui_status_indicator` is tunable. AGENTS.md + skill only. |
4747

CHANGELOG.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.2.3] - 2026-05-13
11+
12+
### Changed
13+
- `installers/opencode.sh` no longer claims "opencode wired" on success.
14+
OpenCode 1.14.48 has no statusline plugin hook — verified by enumerating
15+
the full event surface in `@opencode-ai/plugin`'s `dist/index.d.ts`
16+
(`chat.*`, `tool.execute.*`, `permission.ask`, etc. — all behavioral,
17+
none render). The installer still writes the proposed config keys
18+
speculatively so a future upstream ship (tracking
19+
anomalyco/opencode#8619) auto-activates, but it now prints a clear
20+
"pending upstream" warning and links the issue so users aren't
21+
confused when their built-in footer keeps rendering.
22+
- README and AGENTS.md updated to reflect the real opencode status: not
23+
pending-implementation, but pending-upstream — there's no plugin-side
24+
workaround that avoids burning context tokens.
25+
1026
## [0.2.2] - 2026-05-12
1127

1228
### Fixed
@@ -123,7 +139,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
123139
launch. Cleans up the dead `statusLine`/`footer` keys older installer
124140
versions left in `settings.json`. Verified against Copilot CLI 1.0.46.
125141

126-
[Unreleased]: https://github.com/kinncj/statusline/compare/v0.2.2...HEAD
142+
[Unreleased]: https://github.com/kinncj/statusline/compare/v0.2.3...HEAD
143+
[0.2.3]: https://github.com/kinncj/statusline/releases/tag/v0.2.3
127144
[0.2.2]: https://github.com/kinncj/statusline/releases/tag/v0.2.2
128145
[0.2.1]: https://github.com/kinncj/statusline/releases/tag/v0.2.1
129146
[0.2.0]: https://github.com/kinncj/statusline/releases/tag/v0.2.0

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ The installer renders a boxed, animated TUI by default. Animations auto-disable
6060
|----------------------------|:----------:|:---------:|------------------------------------------|
6161
| **Claude Code** ||| `~/.claude/settings.json` |
6262
| **GitHub Copilot CLI** ||| `~/.copilot/config.json` (requires `experimental: true`, which the installer sets) |
63-
| **OpenCode** | ⚠ pending || `~/.config/opencode/opencode.json` (FR: anomalyco/opencode#8619) |
63+
| **OpenCode** | ✗ upstream || `~/.config/opencode/opencode.json` — feature not yet shipped by opencode; tracked at [anomalyco/opencode#8619](https://github.com/anomalyco/opencode/issues/8619). Installer writes the proposed schema speculatively so a future ship auto-activates; today, opencode's built-in footer is what renders. |
6464
| **Pi (pi.dev)** ||| `~/.pi/agent/extensions/kinncj-statusline/` (native Pi extension; auto-discovered, no settings to edit) |
6565
| **Hermes (nousresearch)** || ✓ + skill | `~/.hermes/` (full TUI, no script hook) |
6666

6767
- **Pi** is wired via a native extension (`extensions/pi/statusline.mjs`) that Pi auto-discovers from `~/.pi/agent/extensions/`. The extension bridges Pi's session context (`ctx.cwd`, `ctx.model`, `ctx.getContextUsage()`) into the same `statusline.sh` we use everywhere else and renders the output as a widget below the editor. Pi's own native footer stays as-is, so you get both lines.
6868
- **Hermes** ships a fixed built-in TUI with skin-level theming only and no extension point. We install AGENTS.md + the `statusline-edit` skill so the repo's instructions travel with you.
6969

70-
**OpenCode** doesn't ship the hook yet — the installer writes the two proposed key shapes speculatively so it'll work as soon as anomalyco/opencode#8619 ships.
70+
**OpenCode** has no statusline hook in 1.14.48 — verified against the binary's full plugin event list (`chat.*`, `tool.execute.*`, `permission.ask`, etc., all behavioral, none render). The feature is tracked upstream at [anomalyco/opencode#8619](https://github.com/anomalyco/opencode/issues/8619) — still open. The installer prints a clear "pending upstream" warning, drops our `statusline.sh` into the config dir, and writes both proposed key shapes (`statusline.command` and `experimental.statusline.command`) into `opencode.json` so whichever the upstream merge picks will auto-activate without a re-install. Until then, opencode's built-in footer is what you see and our script sits idle. Building a plugin against today's API doesn't help — the only display surface is `chat.message`, which costs context tokens (the exact problem #8619 was filed to fix).
7171

7272
## What's in line 2
7373

installers/opencode.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,8 @@ json_set "$SETTINGS" \
3535
"experimental": (.experimental // {} | . + {"statusline": {"command": $cmd}})
3636
}'
3737

38-
ok "opencode wired"
39-
info "restart opencode to pick up the new statusline"
38+
warn "opencode upstream has NOT shipped a statusline hook yet"
39+
info "tracking issue: https://github.com/anomalyco/opencode/issues/8619"
40+
info "we wrote the proposed config keys speculatively so a future ship auto-activates"
41+
info "today, opencode renders its built-in footer and ignores these keys"
42+
ok "opencode config written (statusline pending upstream)"

0 commit comments

Comments
 (0)