Skip to content

feat(claude): discover skills for the $ picker via SDK reloadSkills#4325

Closed
colonelpanic8 wants to merge 4 commits into
pingdotgg:mainfrom
colonelpanic8:feat/claude-skill-discovery
Closed

feat(claude): discover skills for the $ picker via SDK reloadSkills#4325
colonelpanic8 wants to merge 4 commits into
pingdotgg:mainfrom
colonelpanic8:feat/claude-skill-discovery

Conversation

@colonelpanic8

@colonelpanic8 colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown

What Changed

  • The Claude provider's capability probe now issues the Claude Agent SDK's reloadSkills control request after initializationResult() and maps the returned entries into ServerProviderSkills, populating skills on the provider snapshot.
  • New pure mapper parseClaudeReloadedSkills (apps/server/src/provider/Layers/ClaudeSkillDiscovery.ts):
    • strips the trailing scope suffix reloadSkills appends to descriptions (e.g. (user)) and maps it to a snapshot scope (user; project/localproject; builtin/bundled/systemsystem);
    • resolves each skill's path best-effort against the workspace .claude/skills/<name>, then the effective Claude config dir's skills/<name>, falling back to a constructed config-dir path (the contract requires a non-empty path); plugin-qualified names skip the filesystem probe;
    • dedupes by name and skips empty names, mirroring the existing slash-command handling.
  • The control request is bounded by its own 5s timeout and any failure falls back to an empty list, so older CLIs that don't answer reload_skills never fail the capability probe.
  • Slash commands are left untouched — skills legitimately also appear as / commands for Claude, matching upstream CLI behavior.

Why

Only the Codex provider populated skills, so the composer's $ skill picker was always empty on Claude threads even though the Claude CLI discovers the same ~/.claude/skills / .claude/skills entries (refs #1480, #2736). With this change Claude skills get the same $ autocomplete, inline pill rendering, and scope labels (Personal/Project/System) that Codex skills already have.

Checklist

  • Focused tests: vp test run ClaudeSkillDiscovery.test.ts ClaudeCapabilitiesProbe.test.ts ProviderRegistry.test.ts → 3 files, 53 tests passed (plus ClaudeAdapter.test.ts regression guard → 60 passed)
  • Typecheck: tsgo --noEmit in apps/server → 0 errors
  • Lint/format: vp lint on changed files, vp fmt → clean

🤖 Generated with Claude Code


Note

Medium Risk
Touches provider health probing and filesystem path resolution for user config; skill reload is isolated with timeouts so auth/command discovery should remain stable, but probe timing and path edge cases could affect the picker on some setups.

Overview
Claude skills now populate the provider snapshot so the composer $ picker can list them like Codex already does.

After a successful SDK initialization, probeClaudeCapabilities issues a best-effort reloadSkills call with its own timeout; failures yield an empty skill list but no longer fail the whole probe. Account info and slash commands are unchanged.

New parseClaudeReloadedSkills maps SDK entries to ServerProviderSkill: strips description scope suffixes (e.g. (user)), resolves paths under workspace .claude/skills or the effective config dir (with CLAUDE_CONFIG_DIR / HOME / USERPROFILE handling), and dedupes by name. checkClaudeProviderStatus threads skills into every built snapshot.

Reviewed by Cursor Bugbot for commit aac809e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Discover Claude skills for the $ picker via SDK reloadSkills

  • After a successful capabilities probe, probeClaudeCapabilities issues a reloadSkills request to the Claude SDK subprocess and parses the response into ServerProviderSkill objects via the new parseClaudeReloadedSkills utility in ClaudeSkillDiscovery.ts.
  • Skill paths are resolved by checking <cwd>/.claude/skills/<name> then <configDir>/skills/<name>; scope is normalized from description suffix tokens or inferred from the resolved path.
  • The Claude config directory is derived from CLAUDE_CONFIG_DIR (with tilde expansion) or defaults to <home>/.claude, using a new resolveClaudeEnvironmentHomePath helper that prefers HOME over USERPROFILE.
  • Separate timeouts are now used for initialization and skills reload; a skills reload failure is non-fatal and only the initialization timeout causes the probe to return undefined.
  • The skills array is threaded through checkClaudeProviderStatus and included in the provider snapshot (empty when capabilities are absent).

Macroscope summarized aac809e.

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: eacd9fbe-7634-4689-be12-8058c40b45c7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

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

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts Outdated
Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts
Comment thread apps/server/src/provider/Layers/ClaudeSkillDiscovery.ts
@macroscopeapp

macroscopeapp Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature for skill discovery via the Claude SDK's reloadSkills API, adding new runtime behavior including SDK calls, filesystem checks, and new data flowing through provider capabilities. As a new capability from a first-time contributor, it warrants human review.

You can customize Macroscope's approvability policy. Learn more.

Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts Outdated
@colonelpanic8
colonelpanic8 force-pushed the feat/claude-skill-discovery branch 2 times, most recently from 5c7932e to 138250a Compare July 23, 2026 16:15

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 138250a. Configure here.

Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts Outdated
@colonelpanic8
colonelpanic8 force-pushed the feat/claude-skill-discovery branch 5 times, most recently from 1339974 to f44f73b Compare July 23, 2026 22:27
colonelpanic8 and others added 4 commits July 23, 2026 15:35
The Claude provider snapshot never populated `skills`, so Claude-provider
skills were absent from T3 Code's `$` skill picker (only Codex populated
them). Probe the SDK's `reloadSkills` control request after initialization
and map the returned entries into `ServerProviderSkill`s.

The new pure `parseClaudeReloadedSkills` mapper strips the trailing scope
suffix reloadSkills appends to descriptions (e.g. " (user)") and maps it to
a scope (user; project/local -> project; builtin/bundled/system -> system;
others verbatim). Paths are resolved best-effort against the workspace
`.claude/skills/<name>` (project) then the config dir `skills/<name>`
(user), falling back to a constructed config-dir path since the contract
requires a non-empty path; plugin-qualified names skip the filesystem probe.
The control request is bounded by its own timeout and failures fall back to
an empty list so older CLIs never fail the capability probe.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@colonelpanic8
colonelpanic8 force-pushed the feat/claude-skill-discovery branch from f44f73b to aac809e Compare July 23, 2026 22:35
@colonelpanic8

Copy link
Copy Markdown
Author

Superseded by the maintainer implementation in #4414, which is now merged. Closing this independent implementation in favor of the upstream-selected approach.

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

Labels

size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant