Claude Code Plugins: Installed But Not Appearing

by Alex Johnson 49 views

If you've been diving into the world of Claude Code and its plugin system, you might have encountered a rather perplexing issue. You meticulously add a custom marketplace, pick out a nifty plugin, and hit install. The marketplace view even gives you a little checkmark, proudly declaring it "(installed)". Fantastic, right? Well, not so fast. When you head over to the "Installed" tab to see your new digital companion, it's nowhere to be found. Stranger still, you can't actually use any of its commands. It's like you invited a guest to a party, they arrived, announced themselves, but then decided to hide in the coat closet and refuse to join the fun. This article dives deep into this peculiar bug, explaining why it might be happening and, more importantly, how you can get your plugins to show up and play nicely.

The Mystery of the Disappearing Plugins

The core of the problem lies in a discrepancy between what the Claude Code marketplace UI reports and what the plugin system actually recognizes. You'll see โœ” my-plugin (installed) ยท 0 installs โ€“ this message is the main clue. The "(installed)" part suggests the system thinks it's installed, but the "0 installs" and the subsequent absence from the "Installed" tab reveal a deeper issue. It's a classic case of the left hand not talking to the right hand within the plugin management system. Even though the state files, like ~/.claude/plugins/installed_plugins.json, correctly list the plugin and the necessary cache directories (~/.claude/plugins/cache/my-plugin/) contain valid plugin.json files, the plugin loader simply isn't picking them up. This means no commands become available, and the plugin remains effectively dormant, despite all the indicators pointing to a successful installation. It's a frustrating experience because the process looks complete, leading you to believe everything is functioning as expected until you try to actually leverage the plugin's capabilities. The absence of any explicit error messages during the installation process further adds to the confusion, making it feel like a ghost in the machine โ€“ something is happening, but you can't quite pinpoint it.

What Should Be Happening: The Ideal Plugin Experience

In an ideal world, when you install a plugin through Claude Code's marketplace, the experience should be seamless and intuitive. Firstly, the plugin should immediately appear in the "Installed" tab. This provides clear visual confirmation that the installation was successful and that Claude Code is aware of its presence. You shouldn't have to hunt for it or wonder if something went wrong. Secondly, all the commands and hooks associated with that plugin should become available for use. This means you should be able to type commands like /my-plugin:some_command or utilize its hooks in your workflow without any issues. The plugin should be ready to contribute to your productivity right away. Thirdly, and perhaps most importantly for user confidence, the marketplace view should be consistent. If a plugin is installed, it should clearly state that it is installed, without the confusing "0 installs" suffix that currently plagues this bug. This consistency ensures users aren't left questioning the status of their installed tools. The goal is a straightforward, transparent process where installation leads directly to usability, and the user interface accurately reflects the system's state. This smooth integration is crucial for building trust in the plugin ecosystem and encouraging users to expand Claude Code's functionality with third-party tools.

Deconstructing the Bug: State Files vs. Plugin Loader

Let's get a bit technical and explore why this is happening. The issue seems to stem from a disconnect between the persistent state files that record your plugin installations and the actual plugin loader mechanism within Claude Code. When you install a plugin, information about it is written to ~/.claude/plugins/installed_plugins.json. This file acts as a ledger, noting that my-plugin from my-marketplace is indeed installed. Concurrently, the plugin's files, including its manifest (plugin.json), are placed in a cache directory, typically something like ~/.claude/plugins/cache/my-marketplace/my-plugin/. This setup suggests everything is in order from a storage perspective. However, the bug manifests because the plugin loader, the component responsible for discovering and activating these installed plugins, isn't correctly interpreting or processing this information. It might be failing to parse the cache, misinterpreting the state file entry, or there might be an internal flag or setting that isn't being updated correctly to signify that the plugin is ready for use. A key indicator is that ~/.claude/settings.json often shows an empty enabledPlugins object ({}), even though installed_plugins.json lists the plugin. This suggests that while the installation is recorded, the crucial step of enabling or registering the plugin for active use is failing. The system registers the installation but doesn't flag it as ready for execution, leaving the commands inaccessible and the plugin effectively non-existent to the running application.

Troubleshooting and Workarounds

Encountering a bug like this can be frustrating, especially when you're eager to use a new plugin. Fortunately, there's a known workaround that often resolves this issue by essentially performing a clean slate installation. The most effective solution involves manually removing the corrupted plugin state and cache, and then reinstalling the plugin. This process forces Claude Code to re-evaluate and rebuild its plugin information from scratch. To do this, you'll typically need to navigate to your Claude Code configuration directory (often ~/.claude/plugins/). First, delete the cache directory associated with the problematic marketplace and plugin. For example, if the issue is with my-plugin from my-marketplace, you would run rm -rf ~/.claude/plugins/cache/my-marketplace/my-plugin. Next, you need to remove the entry from the main installed plugins list by deleting the installed_plugins.json file: rm ~/.claude/plugins/installed_plugins.json. After performing these deletions, it's crucial to restart Claude Code. This ensures that the application reloads its configuration without the old, potentially corrupted data. Once Claude Code has restarted, you can then proceed to re-add your custom marketplace and reinstall the plugin. This fresh installation process should correctly populate the necessary files and enable the plugin loader to recognize and activate the plugin, making its commands available and appearing correctly in the "Installed" tab. While this is a manual process, it's often the quickest way to get back to a functional state.

Verifying the Installation State

To truly understand the bug and confirm if your workaround is successful, you can perform a few checks using your terminal. First, inspect the ~/.claude/plugins/installed_plugins.json file. Use a command like cat ~/.claude/plugins/installed_plugins.json | grep my-plugin (replacing my-plugin with your plugin's name). After a successful installation, this file should contain a clear entry for your plugin. If the file is empty or doesn't list the plugin after you've reinstalled it, it indicates a persistent problem with the installation recording itself. Next, verify the existence and integrity of the plugin's cache files. Navigate to ~/.claude/plugins/cache/my-marketplace/my-plugin/ (adjusting paths as necessary) and check if the plugin version directory and the .claude-plugin/plugin.json file are present. You can use ls -R ~/.claude/plugins/cache/my-marketplace/my-plugin/ to see the directory structure and cat ~/.claude/plugins/cache/my-marketplace/my-plugin/1.0.0/.claude-plugin/plugin.json to view the manifest file. If these files are missing or corrupted, the plugin loader won't be able to access the plugin's metadata. Finally, check the ~/.claude/settings.json file. Look for the enabledPlugins key. Ideally, after a successful installation and recognition, this should contain an entry for your plugin. If it remains an empty object {} even after reinstalling, it strongly suggests that the plugin isn't being enabled by the loader, even if it's correctly cached and recorded in installed_plugins.json. These verification steps are crucial for diagnosing whether the issue lies in the initial recording, the file storage, or the final enabling step within Claude Code.

Conclusion: Towards a Smoother Plugin Experience

The bug where plugins appear as "installed" in the Claude Code marketplace but fail to show up in the "Installed" tab or become usable is a known frustration for users. It highlights a critical disconnect between the UI's reporting, the persistent state files, and the actual plugin loading mechanism. While the workaround involving manual deletion of cache and state files, followed by a restart and reinstallation, is effective, it's not ideal. It requires manual intervention and a loss of potentially complex plugin configurations. Ideally, Claude Code's plugin system should handle installations, updates, and removals robustly, ensuring consistency across all its components. Developers are continuously working to improve these systems, and future versions may offer more seamless plugin management and automatic resolution of such inconsistencies. For users encountering this issue, remember the power of a clean reinstallation, and always keep an eye on the official Claude Code channels for updates and patches that might address this bug directly. A well-functioning plugin system is key to unlocking the full potential of any coding assistant, and getting this right is a priority for enhancing user productivity and satisfaction.

For more information on Claude's capabilities and development, you can refer to the official Anthropic website. If you're interested in the technical aspects of AI development and tools, exploring resources on OpenAI's developer documentation can also provide valuable context, even though Claude is a different model.