Skip to content
claudewheel.plugins
Edit
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::

/plugins/ marketplaces// the git clone -- the megabytes cache/// the installed plugin data/-/ per-plugin state installed_plugins.json, known_marketplaces.json, ...

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

python
def path(self) -> Path

The plugin tree's path, whether or not it exists.

#_names

python
def _names(directory: Path) -> tuple[str, ...]

The sorted names of the subdirectories of directory, or nothing.

#_tree_size

python
def _tree_size(root: Path) -> int

The bytes of every regular file under root, symlinks not followed.

#inventory

python
def inventory(config_dir: Path) -> PluginInventory

Read 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

python
def purge(config_dir: Path) -> bool

Remove 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.

Search