[BUG] `/` no longer opens the slash-command menu mid-message — only at index 0 (regressed in 2.1.247, last good 2.1.246)
Hi, and thanks for all the work on Claude Code — it has become a core part of my daily workflow, skills especially.
Filing this as a regression rather than a feature request: the behaviour did work for me until recently, and the desktop app's own logs let me narrow it down to a single version step, so I have included that below in case it saves you a bisect. Apologies if I have missed an existing report — I searched, and the closest matches are feature requests for the TUI rather than reports that something stopped working.
Preflight
- [x] Searched existing issues
- [x] Single bug report
- [x] Using the latest version
What's Wrong?
Typing / no longer opens the slash-command / skill menu unless / is at index 0 of the message. After any preceding character, / is inserted as a literal slash and no menu appears.
Precise scope:
- Bound to index 0, not to the start of a line. In a multi-line message,
/as the first character of the second line does nothing either. - Not limited to skills. Nothing in that menu is reachable mid-message — built-in commands, plugin commands and file-based skills from
~/.claude/skills/alike. - The menu itself is healthy. At index 0 it opens and lists everything correctly. This is not #48963 / #49148 (entries missing from the picker) — only the trigger position.
- Invocation still works, discovery doesn't. Typing a skill name in full mid-message still gets picked up and run. Only the menu is gone.
- Both surfaces. Reproduced in the Claude Code desktop app and in the terminal CLI.
This used to work: until ~2026-08-29 the menu opened wherever / was typed, mid-sentence included. Nothing changed on my side — no reinstall, no settings change, no plugin change.
What Should Happen?
/ typed at a word boundary — start of the message, or immediately after whitespace or a newline — opens the menu, filters as I keep typing, and inserts the selection at the caret, leaving surrounding text intact.
/ inside a token stays silent: src/utils, and/or, http://.
Steps to Reproduce
- Any session with at least one skill in
~/.claude/skills/. - Type
/as the first character of the message. → Menu opens, lists commands and skills. Works. - Clear the input. Type
review thisand then/. → Literal/inserted, no menu. Broken. - With the caret still at the end, jump to index 0 (
Cmd+←/ Home) and type/. → Menu opens. Works. - Clear the input. Type
review this, insert a newline (Shift+Enter), then type/as the first character of the second line. → Literal/inserted, no menu. Broken.
Is this a regression?
Yes.
Last Working Version
2.1.246. First bad version: 2.1.247.
From this machine's desktop-app logs, which record every embedded-CLI bundle install:
2026-08-26 11:46:30 installed 2.1.246
2026-08-28 18:56:54 installed 2.1.247
2026-09-01 22:15:02 installed 2.1.255
2.1.246 ran from Aug 26 to Aug 28 and the menu worked throughout. 2.1.247 landed the evening of Aug 28 and would have been picked up on the next app launch — which matches when I noticed the behavior change, ~Aug 29. So the regression window is exactly 2.1.246 → 2.1.247.
The 2.1.247 changelog contains one entry that touches slash-command detection:
Fixed prompts beginning with /-- … being rejected as an unknown slash command instead of being sent to Claude
That is the obvious suspect: a fix that tightens what counts as a slash command is the kind of change that could also tighten where the menu is allowed to trigger.
Possibly also relevant, though it landed after the onset (I only reached it with 2.1.255 on Sep 1) — 2.1.250:
Changed the action menu to list slash commands in a filterable "Slash commands" dialog instead of inline; picking one runs it
Claude Code Version
2.1.257 (terminal CLI) and 2.1.255 (embedded in Claude desktop app 1.40609.1). Both reproduce.
Platform
Anthropic API
Operating System
macOS 26.4 (build 25E246, arm64)
Terminal/Shell
Terminal.app (zsh with oh-my-zsh). Also reproduced in the Claude Code desktop app, which is not a terminal.
Error Messages/Logs
None. No console error accompanies the failed trigger — the keystroke is simply inserted as text.
Additional Information
A note on the date, in case the bisect matters: I first estimated "about a week ago" and later placed it at ~Aug 29. If the onset were in fact Aug 26, the window would instead be 2.1.241 → 2.1.246 (2.1.241 was installed 2026-08-26 00:30, 2.1.246 at 11:46 the same day). My confidence is on Aug 29 and therefore on 2.1.247.
Related: #13073, #29752, #40413, #44488, #48963, #49148, #55173 — note that the mid-prompt requests among these were evaluated as feature requests for the TUI, whereas this is a report that working behavior stopped.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Still present on desktop
1.46388.4(2026-09-05) — and this release edited the exact line without changing the flagEnvironment
app.asarmtime 2026-09-05 02:07 local; bundled CLI dirs2.1.258,2.1.260; npm CLI on PATH2.1.261Adding this because it is a newer build than anything reported so far (previous reports top out at
1.37937.x/1.40609.0), and because of what changed between them.The bundle really was rebuilt
Every asset filename and hash under
Contents/Resources/ion-dist/assets/v1/is different from1.40609.1:| | 1.40609.1 | 1.46388.4 |
|---|---|---|
| composer mount |
cd089cf92-CPpbZ5h_.js|c099c328d-Bo-ro4Ku.js|| extension |
shared-11-BFWs2XIz.js|shared-12-RJIRw5sU.js|The extension's
addOptionswas also refactored from an arrow property to a method (addOptions:()=>({…})→addOptions(){return{…}}), so this is a real rebuild, not a repackage.The
configure()call itself was edited in this release — and still hardcodes the flagTwo new options were threaded through this exact argument list in this release, each with the
e.x??!1pass-through shape used by every other option.startOfInputOnlyis the only one that is a bare literal.startOfInputOnly:!0occurs exactly once in all ofion-dist.The option is designed to be dynamic
The gate resolves it as a callable:
So it accepts a function and can be decided per-keystroke — it just never is, because the only mount site passes a literal
true. Combined with the extension's own default offalse, this reads like a value that was meant to be conditional and got pinned.Not asking for a behavioural decision here — just noting that the line has been in the diff twice now (
1.40609.x,1.46388.4) and passed over both times. If mid-input triggering is being kept off deliberately, a one-line note would let ~20 open reports be closed; if not, the fix is the literal.Still present on desktop
1.52386.3— and the sibling mounts in the same bundle pass the flag dynamically, which makes the hardcoded!0look accidentalEnvironment
app.asarmtime 2026-09-11; npm CLI on PATH2.1.270Adding this because it is a newer build than anything reported so far (the last comment tested
1.46388.4), and because there is a detail in this bundle I have not seen mentioned yet.The flag survived another rebuild
Asset filenames have rotated again since
1.46388.4, so this is a fresh build, and the value is unchanged:| | 1.46388.4 | 1.52386.3 |
|---|---|---|
| composer mount |
c099c328d-Bo-ro4Ku.js|c099c328d-CyyK55oB.js|| extension |
shared-12-RJIRw5sU.js|shared-13-D4O01Gj8.js|The new part: two other mounts in the same build pass it dynamically
shared-13-D4O01Gj8.jscontains two furtherconfigure()call sites for the same extension, and neither hardcodes anything:Both read the value from a context that defaults to false:
I could not find any
dO.Providerin the bundle, so as shipped those two surfaces resolvestartOfInputOnlytofalse.And the plugin does honour the option - it is threaded straight into the suggestion wiring:
So the option is plumbed correctly end to end, the extension's own
addOptions()default is!1, two of the three mounts pass it dynamically, and exactly one mount - the one behind the composer people actually type into - passes a literal!0. Every sibling flag on that same call uses thee.X??!1pattern;startOfInputOnlyis the only one that ignorese. That reads much more like a leftover literal than a deliberate product decision, though obviously you can settle that from the source in a second.Why it stings
The distinction in the original report between invocation and discovery is the whole problem. Invocation is fine - a skill named in full mid-message still runs. But on an install with a few hundred skills in
~/.claude/skills/, index-0-only turns the menu from discovery into recall: you have to already know the exact name of the thing you wanted to find. The menu is the only affordance that makes a large skill library usable, and it is reachable only when the message is empty, which is exactly when you have not yet decided what you are asking for.The word-boundary behaviour proposed in the original report (
/after start, whitespace or newline; silent insidesrc/utils,and/or,http://) would restore that without reintroducing whatever the literal was guarding against.Opened #95735 with a consolidated write-up of this behaviour on Windows desktop 2.2553.1.0.
It carries the two rules (
/works only as the first character of an empty composer; anything before it, even a single space or an already accepted/skill, means the list never opens), six verbatim changelog lines including the 2.1.0 entry that added mid-input completion, a first-hand check, a proposed trigger rule, and a runnable reference implementation with 100 passing tests.Linking rather than duplicating. A thumbs-up there keeps the signal in one place.