Dollar sign menu bloated with entirely irrelevant plugins I've never seen before or configured
Resolved 💬 7 comments Opened May 22, 2026 by SpyrosBou Closed May 26, 2026
What version of Codex CLI is running?
codex-cli 0.133.0
What subscription do you have?
Pro
Which model were you using?
Any - Irrelevant
What platform is your computer?
MacOS
What terminal emulator and version are you using (if applicable)?
Warp
Codex doctor report
codex doctor --json
{
"schemaVersion": 1,
"generatedAt": "1779482266s since unix epoch",
"overallStatus": "ok",
"codexVersion": "0.133.0",
"checks": {
"app_server.status": {
"id": "app_server.status",
"category": "app-server",
"status": "ok",
"summary": "background server is not running",
"details": {
"control socket": "/Users/warui1/.codex/app-server-control/app-server-control.sock",
"daemon state dir": "/Users/warui1/.codex/app-server-daemon",
"mode": "ephemeral",
"pid file": "/Users/warui1/.codex/app-server-daemon/app-server.pid (missing)",
"settings": "/Users/warui1/.codex/app-server-daemon/settings.json (missing)",
"status": "not running",
"update-loop pid file": "/Users/warui1/.codex/app-server-daemon/app-server-updater.pid (missing)"
},
"remediation": null,
"durationMs": 0
},
"auth.credentials": {
"id": "auth.credentials",
"category": "auth",
"status": "ok",
"summary": "auth is configured",
"details": {
"auth file": "/Users/warui1/.codex/auth.json",
"auth storage mode": "File",
"stored API key": "false",
"stored ChatGPT tokens": "true",
"stored agent identity": "false",
"stored auth mode": "chatgpt"
},
"remediation": null,
"durationMs": 0
},
"config.load": {
"id": "config.load",
"category": "config",
"status": "ok",
"summary": "config loaded",
"details": {
"CODEX_HOME": "/Users/warui1/.codex",
"config.toml": "/Users/warui1/.codex/config.toml",
"config.toml parse": "ok",
"cwd": "/Users/warui1/projects/coachhaven-local",
"enabled feature flags": "shell_tool, unified_exec, shell_snapshot, terminal_resize_reflow, sqlite, memories, hooks, enable_request_compression, multi_agent, apps, tool_suggest, plugins, plugin_hooks, in_app_browser, browser_use, browser_use_external, computer_use, plugin_sharing, image_generation, skill_mcp_dependency_install, steer, guardian_approval, goals, collaboration_modes, tool_call_mcp_elicitation, personality, fast_mode, realtime_conversation, tui_app_server, prevent_idle_sleep, workspace_dependencies",
"feature flag overrides": "memories=true, realtime_conversation=true, prevent_idle_sleep=true",
"feature flags enabled": "31",
"log dir": "/Users/warui1/.codex/log",
"mcp servers": "8",
"model": "gpt-5.5",
"model provider": "openai",
"sqlite home": "/Users/warui1/.codex"
},
"remediation": null,
"durationMs": 0
},
"installation": {
"id": "installation",
"category": "install",
"status": "ok",
"summary": "installation looks consistent",
"details": {
"PATH codex #1": "/opt/homebrew/bin/codex",
"current executable": "/opt/homebrew/bin/codex",
"install context": "brew",
"managed by bun": "false",
"managed by npm": "false",
"managed package root": "not set"
},
"remediation": null,
"durationMs": 2
},
"mcp.config": {
"id": "mcp.config",
"category": "mcp",
"status": "ok",
"summary": "MCP configuration is locally consistent",
"details": {
"configured servers": "8",
"disabled servers": "4",
"stdio servers": "5",
"streamable_http servers": "3"
},
"remediation": null,
"durationMs": 3669
},
"network.env": {
"id": "network.env",
"category": "network",
"status": "ok",
"summary": "network-related environment looks readable",
"details": {
"proxy env vars": "none"
},
"remediation": null,
"durationMs": 0
},
"network.provider_reachability": {
"id": "network.provider_reachability",
"category": "reachability",
"status": "ok",
"summary": "active provider endpoints are reachable over HTTP",
"details": {
"ChatGPT base URL": "https://chatgpt.com/backend-api/ reachable (HTTP 403)",
"reachability mode": "ChatGPT auth"
},
"remediation": null,
"durationMs": 168
},
"network.websocket_reachability": {
"id": "network.websocket_reachability",
"category": "websocket",
"status": "ok",
"summary": "Responses WebSocket handshake succeeded",
"details": {
"DNS": "2 IPv4, 2 IPv6, first IPv4",
"auth mode": "chatgpt",
"connect timeout": "15000 ms",
"endpoint": "wss://chatgpt.com/backend-api/<redacted>",
"handshake result": "HTTP 101 Switching Protocols",
"model provider": "openai",
"models etag present": "true",
"provider name": "OpenAI",
"proxy env vars": "none",
"reasoning header": "false",
"server model present": "false",
"supports websockets": "true",
"wire API": "responses"
},
"remediation": null,
"durationMs": 616
},
"runtime.provenance": {
"id": "runtime.provenance",
"category": "runtime",
"status": "ok",
"summary": "running brew on macos-aarch64",
"details": {
"commit": "unknown",
"current executable": "/opt/homebrew/bin/codex",
"install method": "brew",
"platform": "macos-aarch64",
"version": "0.133.0"
},
"remediation": null,
"durationMs": 0
},
"runtime.search": {
"id": "runtime.search",
"category": "search",
"status": "ok",
"summary": "search is OK (system)",
"details": {
"search command": "rg",
"search command readiness": "ripgrep 15.1.0",
"search provider": "system"
},
"remediation": null,
"durationMs": 2
},
"sandbox.helpers": {
"id": "sandbox.helpers",
"category": "sandbox",
"status": "ok",
"summary": "sandbox configuration is readable",
"details": {
"approval policy": "Never",
"codex-linux-sandbox helper": "none",
"execve wrapper helper": "/Users/warui1/.codex/tmp/arg0/codex-arg0yk5M9O/codex-execve-wrapper",
"filesystem sandbox": "unrestricted",
"network sandbox": "enabled"
},
"remediation": null,
"durationMs": 0
},
"state.paths": {
"id": "state.paths",
"category": "state",
"status": "ok",
"summary": "state paths and databases are inspectable",
"details": {
"CODEX_HOME": "/Users/warui1/.codex (dir)",
"active rollout files": "1001 files, 1699494210 total bytes, 1697796 average bytes",
"archived rollout files": "12 files, 31911414 total bytes, 2659284 average bytes",
"goals DB": "/Users/warui1/.codex/goals_1.sqlite (file)",
"goals DB integrity": "ok",
"log DB": "/Users/warui1/.codex/logs_2.sqlite (file)",
"log DB integrity": "ok",
"log dir": "/Users/warui1/.codex/log (dir)",
"sqlite home": "/Users/warui1/.codex (dir)",
"state DB": "/Users/warui1/.codex/state_5.sqlite (file)",
"state DB integrity": "ok"
},
"remediation": null,
"durationMs": 9366
},
"terminal.env": {
"id": "terminal.env",
"category": "terminal",
"status": "ok",
"summary": "terminal metadata was detected",
"details": {
"COLORTERM": "truecolor",
"TERM_PROGRAM": "WarpTerminal",
"color output": "enabled",
"effective locale": "en_US.UTF-8",
"stderr is terminal": "true",
"stdin is terminal": "true",
"stdout is terminal": "true",
"terminal": "Warp",
"terminal size": "94x52",
"terminal version": "v0.2026.05.18.05.32.stable_02"
},
"remediation": null,
"durationMs": 0
},
"updates.status": {
"id": "updates.status",
"category": "updates",
"status": "ok",
"summary": "update configuration is locally consistent",
"details": {
"cached latest version": "0.133.0",
"check for update on startup": "true",
"last checked at": "2026-05-22T12:53:39.886729Z",
"latest version": "0.133.0",
"latest version status": "current version is not older",
"update action": "brew upgrade --cask codex",
"version cache": "/Users/warui1/.codex/version.json"
},
"remediation": null,
"durationMs": 206
}
}
}
What issue are you seeing?
<img width="557" height="98" alt="Image" src="https://github.com/user-attachments/assets/c2f75866-1a5d-4ff0-a77d-9f62374a656a" />
A million irrelevant plugins are bloating my CLI's dollar sign menu and impeding my workflow.
What steps can reproduce the bug?
Type "$" into the input area and scroll or search.
What is the expected behavior?
Codex only shows the skills I've curated and installed myself.
Additional information
_No response_
7 Comments
I took a quick look at the current code path I checked. I have not reproduced this on macOS/Warp, so this is only a code pointer, not a confirmed diagnosis.
What I found:
ChatWidget::refresh_plugin_mentions, which sendsAppEvent::RefreshPluginMentions.fetch_plugin_mentionsreadsplugin/list, keeps entries whereplugin.installed && plugin.enabled, then enriches them fromPluginsManager::plugins_for_config(...).capability_summaries().$popup alongside skill candidates:ChatComposer::mention_itemspushes[Plugin]entries withinsert_text: "$<plugin_name>".build_search_catalogextends candidates withplugins.iter().map(plugin_candidate).mention_items_show_plugin_owned_skill_and_app_duplicatesthat currently expects a Google Calendar skill, plugin wrapper, and app connector to appear as separate[Skill],[Plugin], and[App]entries.So if the intended UX is “only locally curated/installed skills should appear after typing
$”, the current implementation seems broader: installed+enabled plugins with skills/MCP/apps are first-class$mention candidates, and the same capability can appear as separate skill/app entries alongside the plugin wrapper.Three questions that may help narrow the fix:
$popup exclude[Plugin]entries and show only skills/apps unless the user explicitly opens/plugins?I believe #24205 is a duplicate of this issue, but it includes some additional local-state diagnostics that may help narrow down one source of the bloated
$menu.In my repro, the unexpected
$menu entries are[App]suggestions and are present in:with entries like:
The same app names do not appear in:
Deleting the app directory cache only removes them temporarily; it is regenerated on restart and the suggestions return.
So at least one source of the bloated
$menu appears to be inaccessible App Directory catalog entries being included in autocomplete.this is happening to me too. it is really really annoying tbh.
the random apps seem to be coming from codex's local app directory cache:
if delete them (which i shouldn't), the issue disappears, but it comes again as soon as codex regenerates them.
edit: worth mentioning i think that this only happens in the CLI.
I think this is caught somewhere between being a bug and a missed edge-case in a new feature implementation. Seeing how the codex team is basically merging the functionality between the TUI and CLI, so there's one consistent model of operation - my guess is this was either intentional that these are picked up there but not properly QA-vetted, or something that should have been handled/adjusted for the TUI but was missed.
Started seeing this also, it is not ideal. Just typing $ pops up 1-800-flowers.
While here I'd throw in an appeal for thumbs ups on my appeal for recognition of the easier to type and muscle-memory performant
/as an option in the TUI: https://github.com/openai/codex/issues/19427<img width="446" height="154" alt="Image" src="https://github.com/user-attachments/assets/41e9eec6-8dcd-4dfb-96eb-d327f8f8bac0" />
One narrower
mentions-v2detail I did not call out clearly above: this can still happen before fuzzy ranking has any chance to do the right thing.For the
$picker,build_search_catalogis fed skills plus plugin capability summaries. On the plugin side, the TUI derives mention entries fromplugin/list, but the mention eligibility check appears to be onlyinstalled && enabled; the row is then enriched from localPluginCapabilitySummary, includingapp_connector_ids. In that path I do not see connector accessibility/setup state (is_accessible/is_enabledfrom the app connector inventory) being used before plugin candidates are added.The v2 filter also sorts
Pluginrows ahead ofSkillrows before within-rank fuzzy scoring. That means an installed/enabled plugin whose only advertised capability is app connector ids that are not currently accessible/enabled can still appear ahead of a directly usable skill.A narrow fix shape might be: once connector inventory is available, filter app-only plugin candidates when none of their connector ids are accessible/enabled, or gate app-connector-only plugin candidates before they enter
build_search_catalog. A regression test could cover one matching skill plus one app-only plugin candidate with unavailable connector state and assert the skill is not displaced.Thank you @canvrno-oai .