[FEATURE] Plugin marketplace developer experience improvements
Problem Statement
The plugin marketplace works well for basic install-and-use scenarios, but the developer experience for building, publishing, and maintaining plugins at scale has significant friction. After 6 weeks of building and maintaining 17 plugins through the marketplace system, I've accumulated a list of sharp edges — each discovered by getting burned, not from reading docs.
The issues cluster into three categories:
State management — the system creates state (cache dirs, settings entries, hook references) but doesn't clean it up. No garbage collection, no cascade deletes, no orphan detection.
Development workflow — the edit-test cycle for plugin development requires a multi-step publish pipeline (commit → push → marketplace update → install) when a local development mode would eliminate most round-trips.
Missing explicit controls — behaviors that should be configurable are instead emergent side effects (command namespacing, cache key derivation, branch tracking).
Proposed Solution
The highest-impact improvements, in priority order:
- Cache garbage collection — remove old version directories in
~/.claude/plugins/cache/when a new version is installed. Currently, stale versions persist and can shadow the active version (e.g., skills from 2.0.0 resolving instead of 2.1.17).
- Cascade cleanup on plugin removal —
plugin marketplace removesilently deletes allenabledPluginsentries fromsettings.jsonwith no confirmation. Plugin uninstall doesn't clean up hook references, leaving ghost hooks pointing to deleted cache paths. Both should prompt before destructive state changes, and plugin removal should cascade to hook cleanup.
- Local plugin development mode — a
claude plugin dev <path>command that loads a plugin directly from a local directory, bypassing the cache/clone cycle. TheextraKnownMarketplacesdirectory source is a partial workaround but is project-scoped and not discoverable.
git ls-remotebefore clone — URL-source plugins trigger a fullgit cloneon every startup even when the cached SHA matches. Check the remote HEAD SHA first and skip the clone on cache hit. Combined with parallel loading, this would eliminate ~10 seconds of startup overhead for users with many plugins.
- Explicit command namespace control — the colon-qualified form (
/plugin:command) only appears when a command and skill collide on the same name. To get namespaced commands intentionally, you must create a thin wrapper command alongside the skill (two files for one command). Anamespace: truefrontmatter field, or always-on plugin prefixing, would be cleaner.
- Document cache key derivation — the fallback chain (
plugin.json.version ?? marketplace.json.version ?? gitCommitSha ?? "1.0.0") isn't documented. Removingversionfromplugin.jsondoesn't switch to SHA-based caching becausemarketplace.jsonversion is a second fallback — this took significant debugging to discover.
Alternative Solutions
Current workarounds I've built:
- Cache GC: Custom cleanup script in
setup-marketplaces.shthat removes non-active cache directories - Ghost hooks: Manual
settings.jsonaudit after every plugin removal - Local dev:
extraKnownMarketplaceswith"source": "directory"in projectsettings.local.json - Startup perf: Reduced global URL-source plugins from 17 to 12 and moved others to per-repo install
- Namespacing: Thin command wrappers that delegate to skills to force collision-based namespace
- Nested CLI:
unset CLAUDECODEbefore everyclaude plugincommand inside a session
These work but are fragile and require tribal knowledge.
Priority
High - Significant impact on productivity
Feature Category
Configuration and settings
Use Case Example
Typical plugin development cycle today:
- Edit a skill in
~/Projects/my-plugin/skills/check/SKILL.md git add . && git commit -m "fix: update check skill" && git pushunset CLAUDECODE(because I'm inside a Claude Code session)claude plugin marketplace update workbench(must have pushed first — fetches remote, not local)claude plugin install my-plugin@workbench- Restart Claude Code to pick up the changes
- Test the skill
- Realize I need a tweak, repeat from step 1
With a claude plugin dev ~/Projects/my-plugin/ command, steps 2-6 would disappear. Edit the file, it's live immediately.
Additional Context
- I maintain 17 plugins (10 personal + 7 forked) distributed through a hub marketplace
- The startup performance issue was filed separately with detailed profiling data
- Happy to provide more detail, test patches, or help with design on any of these
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗