Skip to content
This repository was archived by the owner on Aug 16, 2026. It is now read-only.
This repository was archived by the owner on Aug 16, 2026. It is now read-only.

Find a slash command by any part of its name, not just the namespace it starts with #130

Description

@dnviti

Problem / Motivation

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?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions