From 16b41d2bea340d0c88bc4e0daf8066bc8a0287ef Mon Sep 17 00:00:00 2001 From: Spoon <212802214+spoons-and-mirrors@users.noreply.github.com> Date: Wed, 17 Dec 2025 22:01:52 +0100 Subject: [PATCH] UI: show plugins in /status (#4515) Co-authored-by: GitHub Action --- .../cli/cmd/tui/component/dialog-status.tsx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx index 4e485b033..b85cd5c65 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx @@ -11,6 +11,31 @@ export function DialogStatus() { const enabledFormatters = createMemo(() => sync.data.formatter.filter((f) => f.enabled)) + const plugins = createMemo(() => { + const list = sync.data.config.plugin ?? [] + const result = list.map((value) => { + if (value.startsWith("file://")) { + const path = value.substring("file://".length) + const parts = path.split("/") + const filename = parts.pop() || path + if (!filename.includes(".")) return { name: filename } + const basename = filename.split(".")[0] + if (basename === "index") { + const dirname = parts.pop() + const name = dirname || basename + return { name } + } + return { name: basename } + } + const index = value.lastIndexOf("@") + if (index <= 0) return { name: value, version: "latest" } + const name = value.substring(0, index) + const version = value.substring(index + 1) + return { name, version } + }) + return result.toSorted((a, b) => a.name.localeCompare(b.name)) + }) + return ( @@ -109,6 +134,29 @@ export function DialogStatus() { + 0} fallback={No Plugins}> + + {plugins().length} Plugins + + {(item) => ( + + + • + + + {item.name} + {item.version && @{item.version}} + + + )} + + + ) }