feat(composer): list skills with slash commands - #7737
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR introduces a new feature that adds skills to slash command menus, changing what users see when typing '/' in the composer. While well-tested and following existing patterns, new user-facing behavior warrants human review. You can add or adjust custom eligibility rules. Learn more. |
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
There was a problem hiding this comment.
Reviewed the web composer changes that add provider skills to the / menu. Two consistency issues in apps/web/src/components/chat: the slash list now mixes rows with and without a leading icon, and skill filtering is duplicated across two searchers with different field coverage, so / returns fewer skills than $ for the same query. Details inline.
Posted via Macroscope — UI Consistency
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
There was a problem hiding this comment.
One finding on the new slash-menu skill rows. The earlier alignment and double-filter comments look addressed (the source icon is now suppressed in slash mode, and / skills are filtered once through searchSlashCommandItems).
Posted via Macroscope — UI Consistency
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b86f1ff. Configure here.
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
## What's Changed * fix(web): add space above composer task tabs by @Bil0000 in pingdotgg/t3code#7740 * feat(composer): list skills with slash commands by @maria-rcks in pingdotgg/t3code#7737 * fix(web): show the full path in file link tooltips by @s243a in pingdotgg/t3code#7741 * fix(server): serve html assets with utf-8 charset by @talkingdonkeyz in pingdotgg/t3code#6409 * fix(vcs): give `git worktree add` a longer timeout on large repos by @ChamaruAmasara in pingdotgg/t3code#6326 * chore: move implementation plans out of repository by @t3-code[bot] in pingdotgg/t3code#7665 * Update user count in AGENTS.md by @saphid in pingdotgg/t3code#7658 ## New Contributors * @s243a made their first contribution in pingdotgg/t3code#7741 * @talkingdonkeyz made their first contribution in pingdotgg/t3code#6409 * @ChamaruAmasara made their first contribution in pingdotgg/t3code#6326 **Full Changelog**: pingdotgg/t3code@v0.0.34-nightly.20260821.1147...v0.0.34-nightly.20260821.1148 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34-nightly.20260821.1148
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
The skill rows pingdotgg#7737 added to the `/` menu read the provider snapshot, whose cwd is the server's own — so a project's skills reached `$` but not `/`, the split "scope skills and slash commands to the workspace" closed for provider slash commands. Read the same workspace-scoped list the `$` picker and the composer's inline skill text already use. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude Code reports a skill through two channels, and the `/` menu draws from both: the filesystem, which fills its `skill:name` rows, and the SDK init handshake, which names the same skill as a plain slash command. So every skill got two rows. It stayed invisible while the skill rows read the cwd-less snapshot, which held almost none of them, and surfaced the moment "scope the slash menu's skills to the workspace" pointed them at the real list. The previous fix dropped the `skill:` row. That was backwards: it erased, for Claude, the surface pingdotgg#7737 gave skills in this menu, leaving them reachable only as a command whose row inserts `/name`. Drop the handshake's copy instead. The name is all the two channels share — nothing marks a handshake entry as a skill — and they only meet once the `<plugin>:` prefix the filesystem probe adds for the Skill tool is dropped: the handshake names a plugin's skill bare (`ponytail`, not `ponytail:ponytail`) while keeping that prefixed shape for the plugin's own commands, so comparing the prefixed name would have dropped `/vercel:bootstrap` — `commands/bootstrap.md` in that plugin — over its like-named skill. Keyed lowercase, matching the server's own `dedupeSlashCommands`, and taking only the skills the menu actually renders so a disabled one never removes a command without offering a row in its place. `/` now needs the skills query to be correct rather than merely complete, so it waits on it like `$` already does; without that it lists the duplicates, then drops them when the answer lands, moving the highlighted row under whoever was about to press Enter. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The skill rows pingdotgg#7737 added to the `/` menu read the provider snapshot, whose cwd is the server's own — so a project's skills reached `$` but not `/`, the split "scope skills and slash commands to the workspace" closed for provider slash commands. Read the same workspace-scoped list the `$` picker and the composer's inline skill text already use. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude Code reports a skill through two channels, and the `/` menu draws from both: the filesystem, which fills its `skill:name` rows, and the SDK init handshake, which names the same skill as a plain slash command. So every skill got two rows. It stayed invisible while the skill rows read the cwd-less snapshot, which held almost none of them, and surfaced the moment "scope the slash menu's skills to the workspace" pointed them at the real list. The previous fix dropped the `skill:` row. That was backwards: it erased, for Claude, the surface pingdotgg#7737 gave skills in this menu, leaving them reachable only as a command whose row inserts `/name`. Drop the handshake's copy instead. The name is all the two channels share — nothing marks a handshake entry as a skill — and they only meet once the `<plugin>:` prefix the filesystem probe adds for the Skill tool is dropped: the handshake names a plugin's skill bare (`ponytail`, not `ponytail:ponytail`) while keeping that prefixed shape for the plugin's own commands, so comparing the prefixed name would have dropped `/vercel:bootstrap` — `commands/bootstrap.md` in that plugin — over its like-named skill. Keyed lowercase, matching the server's own `dedupeSlashCommands`, and taking only the skills the menu actually renders so a disabled one never removes a command without offering a row in its place. `/` now needs the skills query to be correct rather than merely complete, so it waits on it like `$` already does; without that it lists the duplicates, then drops them when the answer lands, moving the highlighted row under whoever was about to press Enter. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

Typing
/only showed built-in and provider commands, so users had to know about the separate$trigger to discover skills.This adds enabled skills to the slash menu on web and mobile. A bare
/lists commands and skills together, further typing filters the same list, and selecting a skill still inserts its canonical$nametoken. Skill rows use a mutedskill:prefix while keeping the skill name at the normal title color.Tests:
vp test run apps/web/src/components/chat/ComposerCommandMenu.test.tsx apps/web/src/components/chat/composerSlashCommandSearch.test.ts apps/web/src/providerSkillSearch.test.tsvp lintvp run --filter @t3tools/mobile typecheckgit diff --checkWeb typecheck still reports the existing
conditionalUIerrors insrc/components/clerk/electronPasskeys.test.ts. Browser and simulator verification were not run.before:


after:
Built with gpt-5.6-sol via Codex in T3 Code.
Note
Low Risk
Composer suggestion UI and ranking only; skill insertion still uses the existing
$namepath, with no auth or data-handling changes.Overview
Typing
/now surfaces enabled provider skills next to built-in and provider slash commands on web and mobile, so users don’t need the$trigger to discover them. Selecting a skill still inserts the existing$nametoken.Slash skill rows show a muted
skill:prefix plus the skill name (no source icon). Search treatsskill/skill:as a prefix, then ranks by name, display name, and description. Empty/keeps commands and skills in one list.Reviewed by Cursor Bugbot for commit f6afef2. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
List provider skills in slash-command suggestions for mobile and web composers
ThreadComposer(mobile) andChatComposer(web) now build skill items from the selected provider's enabled skills and include them in slash-command results.matchesSlashSkillQueryutil to filter skills; web extendssearchSlashCommandItemsandscoreSlashCommandItemto score skill items, with tie-breaker ordering commands before skills.skill:prefix followed by the skill name, and suppress the source icon on web'sComposerCommandMenuItem.scoreProviderSkillin providerSkillSearch.ts is now exported; existing in-tree callers are unaffected but external consumers of this module's surface may see the new export.Macroscope summarized f6afef2.
request provenance