Desktop app embedded loader ignores plugin manifest 'skills' array — serves all repo skills under every plugin, SHA-namespaced (CLI 2.1.206 correct)

Open 💬 0 comments Opened Jul 10, 2026 by infragoodboys

Summary

When a marketplace plugin's manifest restricts its skill set via a skills array (repo has a larger skills/ subdir; the array should replace the directory scan), the terminal CLI (2.1.206) honors the array correctly, but the Claude desktop app's embedded Agent SDK loader ignores it: it serves ALL skills found in the cached repo under EVERY plugin from that marketplace, and namespaces them by the install version/SHA directory name instead of the plugin name.

This looks like the same regression that was fixed for the CLI in ~2.1.206 (pre-2.1.206 the CLI also installed/served the full scan), still present in the app-embedded loader.

Environment

  • Claude desktop app (macOS): 1.20186.0
  • claude --version (terminal): 2.1.206
  • macOS: Darwin 25.5.0
  • Marketplace: single GitHub repo with source: "./" for both plugins, top-level skills/ dir containing 10 skills; plugin A's manifest lists 7 of them in its skills array, plugin B lists the other 3.

Expected (and observed on terminal CLI 2.1.206)

Session skill list contains exactly:

plugin-a:skill1 ... plugin-a:skill7
plugin-b:skill8 plugin-b:skill9 plugin-b:skill10

claude plugin details also reports 7 and 3 correctly.

Actual (desktop app session, same machine, same installed cache)

All 10 skills are served under BOTH plugins (20 entries), and the namespace prefix is the cache version directory name (first 12 chars of the git commit SHA), not the plugin name:

68dfbd7acf1d:skill1
...all 10...
68dfbd7acf1d:skill1   <- repeated block from the second plugin
...all 10 again...

Notes

  • The installed cache under ~/.claude/plugins/cache/<marketplace>/<plugin>/<sha>/skills/ contains all 10 skill folders for both plugins — expected with source: "./" (whole repo materialized), since the CLI filters at load time. The app loader appears to scan that skills/ dir wholesale instead of applying the manifest array.
  • The SHA-based namespacing (68dfbd7acf1d: instead of plugin-name:) also breaks any workflow that references skills by their documented plugin:skill name.

Impact

Audience-scoped plugin splits (e.g. ops skills vs dev skills from one team repo) silently collapse for desktop-app users: everyone gets every skill, and the namespaced names differ between app and CLI sessions on the same machine.

View original on GitHub ↗