On this page
Reads what a profile's plugin tree holds -- the marketplace clone and the plugins installed from it -- and removes the whole tree when asked.
#claudewheel.plugins
#claudewheel.plugins
Claude Code's plugin tree inside a profile: inventory it, and remove it.
Left alone, Claude Code clones the official plugin marketplace into a profile on first launch and installs three language-server plugins from it -- six to ten megabytes per profile, the clone being nearly all of it, for something no claudewheel profile asked for. New launches no longer collect it (the launch environment suppresses the auto-install), but a profile that already has the tree keeps it.
Removing those is deliberately NOT part of the canonical settings reconciliation. That reconciliation is exact by design -- it rewrites each managed target to the canonical model on every run -- so folding a plugin purge into it would mean deleting plugin state every time anyone reconciled anything, including state a user installed on purpose. This is a separate opt-in operation instead, and it names what it is about to remove first.
The layout, as observed on real profiles::
A plugins entry that is a symlink is not this tree: it points at something the profile does not own, and neither the size nor the removal follows it.
#PluginInventory
What one profile's plugin tree holds, read without touching it.
#path
def path(self) -> PathThe plugin tree's path, whether or not it exists.
#_names
def _names(directory: Path) -> tuple[str, ...]The sorted names of the subdirectories of directory, or nothing.
#_tree_size
def _tree_size(root: Path) -> intThe bytes of every regular file under root, symlinks not followed.
#inventory
def inventory(config_dir: Path) -> PluginInventoryRead config_dir's plugin tree. Changes nothing.
A missing tree, and a plugins entry that is a symlink, both answer "no tree here": the second is a pointer at data the profile does not own, and reporting its size as the profile's would be reporting someone else's.
#purge
def purge(config_dir: Path) -> boolRemove config_dir's plugin tree. True when there was one to remove.
A symlinked plugins entry is left exactly as it is: following it would delete a tree belonging to whatever it points at.