You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Aug 16, 2026. It is now read-only.
Every skill and command an agent offers appears in the / list under whatever
name that agent reports, and several agents report namespaced names. One
prefixes every single skill with skill:. Plugin-supplied commands arrive as plugin-name:command-name. Another agent files its own commands under a user: tier, and reports sub-skills as parent.child. For some agents this
list runs to many dozens of entries, nearly all of them prefixed.
The list only narrows on what a name starts with. Typing /skill: dumps the
whole namespace, but typing /better-icons — the part of the name actually
worth remembering — matches nothing at all. Worse, a fragment that matches
nothing makes the popup disappear entirely, so it reads as "no such command"
rather than "you didn't lead with the right prefix". The only way to reach a
namespaced skill is to already know which namespace the agent happens to hang
it under, and to type that first, every time.
The descriptions shown beside each entry are never searched either, so knowing
what a skill does is no help in finding it.
The same composer already does better on both counts elsewhere: the model
picker narrows on any fragment of an id, a name, or a description, and the file
mention list ranks fuzzy matches by closeness. The command list is the
strictest matcher of the three, applied to the longest and least memorable set
of names in the app.
Goal
Typing any distinctive fragment of a command's name should find it, with or
without its namespace prefix, with the closest matches listed first.
Scope
Match a typed fragment anywhere in a command's name, not only at the start.
Treat the segments of a namespaced name as searchable in their own right, so
the last segment alone is enough to find an entry, whichever separator the
agent used.
Search the description as well, so recalling what a skill does is enough to
find it when the exact name isn't.
Rank the results closest-match-first: an exact name, then a name or segment
starting with what was typed, then a match further inside the name, with
description-only matches last. Break ties predictably so the ordering doesn't
jitter between keystrokes.
Preserve today's behaviour for anyone who already types the prefix: an exact
prefix still lists exactly what it lists now, and a looser match never
displaces the entry that matches best.
Keep opening the list from the toolbar button — with nothing typed — showing
every available command.
When an entry matches on something not visible in its name, make it clear
what matched.
Keep a long, loosely-matched list navigable, since a single agent can offer
many dozens of commands.
Apply to every agent the app can chat with, whatever naming convention it
reports.
Non-goals
Not renaming, re-prefixing, stripping, or de-duplicating what an agent
reports. What is shown and what is sent stay exactly what the agent calls it,
since that is what has to be sent back for the command to run.
Not changing where the command list can be triggered from, or the keyboard
behaviour of the popup.
Not changing the file-mention or model pickers.
Not adding usage analytics or command recommendations.
Acceptance Criteria
For an agent that reports a skill as skill:better-icons, typing /better-icons finds it, and so does a distinctive fragment such as /icons.
Typing /skill: still lists every skill in that namespace, exactly as it
does today, and typing a complete command name still puts that command
first.
A command whose description mentions the typed word is findable even when
its name does not contain it, and ranks below every name match.
Matching works for every naming convention in use across the supported
agents — bare names, plugin:name, skill:name, user:name, and parent.child — and is case-insensitive.
Selecting a match inserts the agent's full reported name, prefix
included, and the command runs as it does today.
Opening the list from the toolbar button with nothing typed shows every
command.
The ordering of results is stable for a given query — the same typed text
always produces the same order.
When a match is not visible in the row's name, the row shows why it
matched.
A fragment that genuinely matches nothing still results in an empty list,
not a silent fallback to showing everything.
Open Questions
When nothing is typed, should the full list group entries by namespace so
browsing is easier, or stay the flat list it is now?
Should recently used commands be nudged up the ranking?
Problem / Motivation
Every skill and command an agent offers appears in the
/list under whatevername that agent reports, and several agents report namespaced names. One
prefixes every single skill with
skill:. Plugin-supplied commands arrive asplugin-name:command-name. Another agent files its own commands under auser:tier, and reports sub-skills asparent.child. For some agents thislist runs to many dozens of entries, nearly all of them prefixed.
The list only narrows on what a name starts with. Typing
/skill:dumps thewhole namespace, but typing
/better-icons— the part of the name actuallyworth remembering — matches nothing at all. Worse, a fragment that matches
nothing makes the popup disappear entirely, so it reads as "no such command"
rather than "you didn't lead with the right prefix". The only way to reach a
namespaced skill is to already know which namespace the agent happens to hang
it under, and to type that first, every time.
The descriptions shown beside each entry are never searched either, so knowing
what a skill does is no help in finding it.
The same composer already does better on both counts elsewhere: the model
picker narrows on any fragment of an id, a name, or a description, and the file
mention list ranks fuzzy matches by closeness. The command list is the
strictest matcher of the three, applied to the longest and least memorable set
of names in the app.
Goal
Typing any distinctive fragment of a command's name should find it, with or
without its namespace prefix, with the closest matches listed first.
Scope
the last segment alone is enough to find an entry, whichever separator the
agent used.
find it when the exact name isn't.
starting with what was typed, then a match further inside the name, with
description-only matches last. Break ties predictably so the ordering doesn't
jitter between keystrokes.
prefix still lists exactly what it lists now, and a looser match never
displaces the entry that matches best.
every available command.
what matched.
many dozens of commands.
reports.
Non-goals
reports. What is shown and what is sent stay exactly what the agent calls it,
since that is what has to be sent back for the command to run.
behaviour of the popup.
Acceptance Criteria
skill:better-icons, typing/better-iconsfinds it, and so does a distinctive fragment such as/icons./skill:still lists every skill in that namespace, exactly as itdoes today, and typing a complete command name still puts that command
first.
its name does not contain it, and ranks below every name match.
agents — bare names,
plugin:name,skill:name,user:name, andparent.child— and is case-insensitive.included, and the command runs as it does today.
command.
always produces the same order.
matched.
not a silent fallback to showing everything.
Open Questions
browsing is easier, or stay the flat list it is now?