Claude Code lists a plugin's `agents/` and `commands/` entries with a
`readdir` that accepts only regular files, so symlinked directory entries
are skipped. Managed plugins were linked recursively, which materializes a
real directory holding one symlink per file, and wrapped with
`pkgs.symlinkJoin`, which mirrors directories and symlinks the leaf files.
Both layers dropped every agent and command a plugin provides.
Link each plugin as a single directory symlink, and wrap it with a
`runCommand` that links only top-level entries so component directories stay
symlinks to the original.
Also accept an attribute set for `plugins`, making the personal-plugin
directory name user-controlled and stable rather than derived from the
source's base name, which yields names such as `bxa1s0m3h4sh-source` that
change whenever the plugin is updated. The list form keeps working, with a
warning.
Allow for configuring marketplaces or individual plugins.
Both are provided as a list of either paths or packages.
The lone plugins are enabled by adding a --plugin-dir argument to the wrapper script.
Marketplaces are saved to the nix store and enabled by adding to the claude settings and known_marketplaces files.
With the marketplace "installed", the plugin can just be enabled via the enabledPlugins setting.