Repository navigation
Description
Summary
In the TUI the / list renders every entry the same way, name plus a one-line description, so a harness command (/models, /agents), a session command (/cd), a custom prompt command, and an MCP command are indistinguishable. You have to already know the name to know what a slash command will do.
Environment
- opencode version: 2.0.16
- OS: Darwin 25.5.0 (arm64)
- Terminal: Alacritty + tmux 3.6a,
TERM=xterm-256color,COLORTERM=truecolor - Shell: /bin/bash
- Install/channel: release
- Active plugins: superaligned-goal (local, does not touch keys)
Reproduction
- Open the TUI.
- Type
/in the prompt to open the slash list. - Compare entries of different kinds:
/modelsand/agents(harness state),/cd(session),/adaptand/ce-agent-native-architecture(custom commands that inject a skill), and an MCP command.
Expected Behavior
Each entry says what it is, in the same spirit as the desktop app, whose slash popover already badges non-command sources (prompt.slash.badge.skill, prompt.slash.badge.mcp, prompt.slash.badge.custom in packages/app/src/components/prompt-input/slash-popover.tsx).
Actual Behavior
The TUI shows /name and the description only. In packages/tui/src/component/prompt/autocomplete.tsx server commands are appended with a :mcp suffix for MCP sources and no marker otherwise, and entries whose source === "skill" are skipped entirely, so skills have no presence in the TUI list at all.
Observed list (2.0.16, this machine):
/adapt Responsive layout pass covering breakpoints, touch targets, safe areas
/agents Switch agent
/animate Motion design pass — adds purposeful animations or removes excessive ones
/audit Technical UI audit — a11y, performance, responsive
/brief Write or update the project's durable design brief
/btw One-shot answer from the session's context without adding to the conversation
/cd Change working directory
/ce-agent-native-architecture Build applications where agents are first-class citizens
Nothing separates a command that changes harness state (model, agent, directory) from one that spends tokens and runs tools, and skill-injecting commands are invisible.
Additional Context
Directions, not prescriptions:
- A leading glyph per origin (skill, agent, harness/session, MCP, custom), or the same trailing badges the app uses, dimmed so the list stays calm.
- Do not rely on a glyph alone: a short word (
skill,mcp) reads in a terminal and in a screen reader, where a symbol does not. - Surface skills in the TUI. They are filtered out today, so a skill-only workflow has no discoverability there while the same skills are visible in the app.
- The data is already present on each command:
type: "builtin" | "custom"andsource?: "command" | "mcp" | "skill".
Activity
argszero commentedon Sep 26, 2026
I read the current sources on both branches before touching this, and the two code paths cited in the report are from the default branch (
dev), not from the 2.0.x line the report was filed against.Confirmed on
v2(rootpackage.jsonis 2.0.18):packages/tui/src/component/prompt/autocomplete.tsxbuilds the slash list incommands()at:474-494: keymap commands at:475-483, server commands at:486-493. Every option is{ display, description, onSelect }, so no entry carries or renders a source marker and built-in, custom, skill and MCP entries do look identical.Does not carry over to
v2:packages/app/src/components/prompt-input/slash-popover.tsx, cited as the badge precedent withprompt.slash.badge.skill|mcp|custom, does not exist onv2: the wholepackages/app/src/components/prompt-input/directory is absent, and noprompt.slash.badge.*key exists in v2packages/ui/src/i18n/en.ts.source === "skill"skipped,":mcp"suffix otherwise) sits atdevpackages/tui/src/component/prompt/autocomplete.tsx:451-452. Onv2there is no such branch, and there cannot be:packages/schema/src/command.tsonv2declaresInfo = { name, description? }with nosourcefield.What that implies for scope:
v2this is not a rendering tweak. It needs asourcefield onCommand.Info, which is a public Protocol surface, and perAGENTS.mdthat also means regenerating the client frompackages/client(bun run generate) plus new i18n keys. How to mark a source in a terminal list is also a design choice, so it seems worth agreeing the shape before implementing.v2: the list comes fromdata.location.command.list(...), so whether skills appear depends on what that endpoint returns.If the report was actually taken from a 1.18.32 build rather than 2.0.16, the TUI half is much smaller, since
devalready readssourcethere. Worth confirming which build, because the two lines need different changes.rhighs commentedon Sep 26, 2026
v2 bro
holny commentedon Sep 26, 2026
I'll take this on v2. The desktop popover already badges non-command sources via
prompt.slash.badge.skill/prompt.slash.badge.mcp/prompt.slash.badge.custom, so the data model knows the difference — the TUI slash list just doesn't surface it. On v2 the sources live inpackages/tui/src/component/prompt/slash-popover(built-in registry vs. custom command/skill/MCP directories), so this is about threading the source kind into the row render and adding the same three badges.Plan: tag each entry with its source at list-build time, render a badge column matching the desktop wording, and cover it in the slash-popover test with one entry per kind.
Fixes #51186
fix(tui): badge slash list entries by source kind
fix(tui): badge slash list entries by source kind
fix(tui): badge slash list entries by source kind
opencodejr commentedon Oct 28, 2026
Thanks for the detailed write-up, @rhighs!
To restate the request: in the TUI
/list, mark each entry with its origin (built-in/harness, custom command, MCP, skill), using a short dimmed word as the app's slash popover does, and list skills there as well. That way you can tell what a command will do before running it.The current list matches how it was built, so I'm treating this as a feature request rather than a bug. Some context that may help:
skill,agent,reference), but only for@mentions. Skills can be found today by typing@, where they appear labelledskill. Slash entries don't get a label yet.:mcpsuffix you mention comes from the mini prompt footer (packages/tui/src/mini/footer.prompt.tsx), which builds its slash list separately.The maintainers will consider it.