fix(web): skill labels show the skill's own name#27741

merged1
main
GitHub fork: fix/skill-label-keeps-name-evidence
opened11d agobyJjuuulianx
View on GitHubTwo-way sync enabledPR last imported 9d ago

Follow-up to #27454, which was closed for missing before/after screenshots. This PR adds them and narrows the change to web.

Problem

When a provider sets no displayName, formatProviderSkillDisplayName title-cases the skill name and splits it on :, _ and -. The Claude driver (ClaudeSkills.ts) never sets displayName, so every Claude skill shows a name that doesn't exist in the $ skill menu, the composer chips and the message chips. frontend-design:frontend-design becomes "Frontend Design Frontend Design" (#26295), and superpowers:brainstorming becomes "Superpowers Brainstorming". The label also hides the name you type to find the skill.

Reproduce: pick a Claude model, type $ in the composer, and look at any skill whose name contains :, - or _.

Change

The fallback returns the skill name as written. A provider displayName still wins, so Codex, Cursor and OpenCode labels don't change.

Compared with #27454, this PR drops the mobile message-chip change (enrichedSkillDisplayName). I couldn't build the native app here to screenshot it, and the shared formatter is not used by mobile. Mobile can follow in its own PR.

Scope and approval

This fixes #26295. The issue suggests collapsing the duplicate ns:ns. This PR removes the transformation that causes it, because the same code also changes the casing and drops the : namespace separator. Labels change for every provider without displayName (Claude, Grok, Pi, Antigravity, ACP). If you'd rather keep title-casing and only fix the doubling, I'll narrow it.

Verification

Environment: macOS, vp run dev with isolated state (--home-dir <clone>/.t3 --no-seed), Chrome-based T3 Browser panel at 1280×800, Claude Haiku 5.5, my real Claude user and plugin skills. Before and after come from the same dev server and thread. I took the "before" shots with inlineSkills.ts reverted to main, restored the fix, reloaded, and repeated the same steps.

$ skill menu

skill menu before and after

$superpowers search. The plugin namespace and separator are visible, and the search still finds the skills.

skill search before and after

Composer chips after picking superpowers:brainstorming and frontend-design:frontend-design

composer chips before and after

Sent message chips. This is the same sent message, rendered before and after the fix.

message chips before and after

Tests:

  • New packages/shared/src/inlineSkills.test.ts. With inlineSkills.ts from main, 3 of its 5 cases fail (mca_lab_status, frontend-design:frontend-design, superpowers:brainstorming come back title-cased). All 5 pass with the fix.
  • vp test run packages/shared/src/inlineSkills.test.ts packages/shared/src/threadFindText.test.ts apps/web/src/providerSkillSearch.test.ts: 24 passed.
  • vp run check:changed: format, lint, knip, typecheck (33 packages) and tests pass.

Not checked: mobile (this PR doesn't touch it) and the desktop Electron shell. Desktop renders the same web components.

Written with Claude Opus 5.5 in Claude Code, run from T3 Code.

🤖 Generated with Claude Code

Checks

23 successful · 14 skipped
All checks passed
2e5779a

Added 1 commit

  • fix(web): skill labels show the skill's own name2e5779a
Synced from GitHub

Review in Change Stack →

No actionable comments were generated in the recent review.

External image Recent review info
External image Run configuration
External image Commits

Reviewing files that changed from the base of the PR and between 6fc9144a60c4a5f45089316ddd5f7371bafd3bf2 and 2e5779a5b907f6de6f33c119c89910069894f436.

External image Files selected for processing: 2
  • packages/shared/src/inlineSkills.test.ts
  • packages/shared/src/inlineSkills.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Walkthrough

The provider skill display-name formatter now returns skill.name unchanged when no non-empty display name is supplied. Tests cover this fallback for several names and confirm that supplied display names are trimmed.

Changes: Provider skill display names

Layer / File(s)Summary
Preserve provider skill names
packages/shared/src/inlineSkills.ts, packages/shared/src/inlineSkills.test.ts
The formatter uses skill.name unchanged when displayName is absent or blank. Tests cover several provider names and verify trimming of supplied display names.

Priority: External image Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Low

Possibly related PRs

  • pingdotgg/t3code#27454: Changes the same formatter fallback to return skill.name unchanged when displayName is absent.
  • pingdotgg/t3code#26311: Changes the same formatter to title-case the portion after the first colon for repeated names.

Suggested reviewers: noojuno, macroscopeapp

Merge Risk: External image Minimal · up to 2e577

The provider-name fallback is compatible with the inspected web skill menus, composer chips, messages, search, and serialization paths.

Pre-merge checks: Passed 4
Check nameStatusExplanation
Title checkPassedThe title clearly and concisely describes the main change: skill labels now use the skill's own name. It follows the repository's conventional commit format.
Description checkPassedThe description is complete and follows the required Problem, Change, Scope and approval, and Verification sections. It explains the bug, implementation, scope, linked issue, screenshots, focused test…
Linked Issues checkPassedIssue #26295 requires a fix for duplicated Claude plugin skill labels and suggests a unit test for frontend-design:frontend-design. formatProviderSkillDisplayName now returns skill.name unchange…
Out of Scope Changes checkPassedThe changes are limited to packages/shared/src/inlineSkills.ts and its test file. The implementation directly supports issue #26295 by preserving the skill identifier. The tests verify the fallback …
Full details: Description check

Explanation

The description is complete and follows the required Problem, Change, Scope and approval, and Verification sections. It explains the bug, implementation, scope, linked issue, screenshots, focused tests, broader checks, and unverified areas.

Full details: Linked Issues check

Explanation

Issue #26295 requires a fix for duplicated Claude plugin skill labels and suggests a unit test for frontend-design:frontend-design. formatProviderSkillDisplayName now returns skill.name unchanged when no provider displayName exists. This preserves frontend-design:frontend-design and prevents the duplicated title-cased label. The new tests cover this case and other separators. The provider displayName path remains trimmed and preferred.

Full details: Out of Scope Changes check

Explanation

The changes are limited to packages/shared/src/inlineSkills.ts and its test file. The implementation directly supports issue #26295 by preserving the skill identifier. The tests verify the fallback and the existing provider-display-name behavior. No unrelated change is shown.

Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

verified as-is at 2e5779a5b907f6de6f33c119c89910069894f436 on this linux vm, with repository playwright and /usr/bin/google-chrome at 1440×1000.

  • reproduced on github/main (5fe18d79ac835e0f193ad61325e5b7d69a317bcf), in a separate worktree after vp i. selecting the installed real file-upload skill showed File Upload in the $ menu, composer chip, and sent-message chip.
  • stopped main's captured server process before starting the exact pr head after vp i. reused the isolated app data created through the ui: a project pointing to the real git checkout, threads, and real codex gpt-6.1-sol turns. no mocked providers, fixtures, or seeded conversations.
  • on the pr, $file-upload search, selection, composer chip, and sent-message chip preserve file-upload. the same saved message from main also renders with the preserved name.
  • neighboring behavior passed: the installed review-ai-traces skill still uses its explicit Review AI Traces display name in search and the composer; backspace removes a skill chip, and re-selection works.
  • a fresh real codex turn sent from the pr's web client completed with skill name verified. the skill chip and reply persisted after reloading the thread.
  • blacksmith ran vp test run packages/shared/src/inlineSkills.test.ts packages/shared/src/threadFindText.test.ts apps/web/src/providerSkillSearch.test.ts: 3 files, 24 tests passed. the head also has 30 successful ci checks. no source edits or pushes were needed.

matching menu captures, main then pr:

main: skill menu rewrites file-upload to File Upload

pr: skill menu preserves file-upload

same saved message, main then pr:

main: sent-message chip shows File Upload

pr: same sent-message chip preserves file-upload

pr: skill selection, removal, re-selection, and real codex response

Not verified

native ios/android, the electron shell, macos/windows, and remote/relay/tunnel connections were not exercised on this linux web run. claude plugin namespace examples and other providers were not exercised; this pass used the requested real codex provider and installed skills. namespace/underscore formatter cases are covered by the passing existing pr tests. the full suite and check:changed were not rerun because no source changes were made.