dsh plugin remove: uninstall a DSH plugin cleanly

Uninstall & CleanupPublished 2026-09-12Author: DeepSeek Plugin Market
DeepSeek HarnessDSH plugindsh plugin removeuninstall pluginprofile
dsh plugin remove uninstalls a plugin from a profile, dropping both the pnpm dependency and the loaded layer. It takes --profile; verify in package.json.

The full form of dsh plugin remove is dsh plugin --profile <name> remove <package>, and it removes both the pnpm dependency and the corresponding configuration layer — the official example, dsh plugin --profile demo remove dsh-hello-plugin, drops the dependency and the layer together (source). A DeepSeek Harness plugin is uninstalled through this one channel no matter where it came from, so the same rules cover all DSH plugins. --profile is required, the aliases rm and uninstall work, and you should confirm the layer is gone in both package.json and --dump-config.

DSH plugin uninstall overview: two things to delete, not a folder

Uninstalling a DSH plugin means clearing two things: the profile's pnpm dependency and that plugin's entry in dsh.profile.bundles — clearing only one leaves a trap behind. Keep the conclusions:

  1. dsh plugin remove clears both at once, which is why it is the recommended path;
  2. Deleting the folder under node_modules by hand touches files only; dependencies and bundles stay as they were, so the profile still resolves a package that is no longer there;
  3. In-box bundles are outside pnpm's remit — packages such as @deepseek-ai/dsh-base always resolve from the dsh installation, so remove never applies to them (source).

DSH plugin remove syntax: one command clears dependency and layer

dsh plugin --profile <name> remove <package> deletes the dependency and drops the package from the profile's bundle manifest at the same time, which is the essential difference from hand-deleting a directory (source). The standard flow:

  1. Get the exact package name from the installed list:
bash
dsh plugin --profile web list

A wrong name makes pnpm raise an error and exit nonzero, so do not type package names from memory; see dsh plugin list: installed plugins and profile scope for how to read that output.

  1. Run the removal:
bash
dsh plugin --profile web remove <package>
  1. Confirm the output shows both the dependency removal and the layer being dropped, rather than a bare "done".

  2. Remove in bulk or by group when needed — the flags are still pnpm's:

bash
# Remove several packages at once
dsh plugin --profile web remove <packageA> <packageB>

# Only remove it from dependencies
dsh plugin --profile web remove <package> -P

pnpm remove takes the package out of node_modules and the project's package.json, and -D, -O and -P restrict it to the matching dependency group (source).

DSH plugin remove: which profile, and the rm/uninstall aliases

--profile is required with no short form and decides which manifest gets edited, while remove is just one of pnpm's verbs — rm, uninstall and un are equivalent (source). Three points:

  1. Plugins belong to a profile, not to the machine. dsh plugin --profile web remove <package> only touches $DSH_HOME/profiles/web; the same plugin in another profile is unaffected. dsh web boots the profile named web, so aim at it before removing.

  2. Four equivalent spellings (everything after --profile goes to pnpm):

bash
dsh plugin --profile web remove <package>
dsh plugin --profile web rm <package>
dsh plugin --profile web uninstall <package>
dsh plugin --profile web un <package>
  1. On a machine with several profiles, confirm them first and then decide which one to clean:
bash
ls ~/.dsh/profiles

DSH plugin remove verification: package.json and --dump-config

The acceptance bar is two clean places: in the profile's package.json the package must disappear from both dependencies and dsh.profile.bundles, and dsh --profile web --dump-config must no longer print a # == <package> layer (source). Four steps in order:

  1. Check the manifest:
bash
cat ~/.dsh/profiles/web/package.json

The name in neither dependencies nor dsh.profile.bundles means dsh's bookkeeping is clean too.

  1. Check the composed tree, which shows the layers that actually load without booting:
bash
dsh --profile web --dump-config | grep -n "<package>"

No output means the layer is gone; remaining output means the manifest still carries the entry.

  1. Check that pnpm dropped it as well:
bash
dsh plugin --profile web list | grep -n "<package>"
  1. Check your own overlay layer. If the profile's cordis.patch.yml has a hand-written row referencing that plugin, clear it too — that overlay is yours and is not managed on your behalf by pnpm or by the bundle manifest (source).

DSH plugin uninstall: things to watch out for

In short: --profile picks the manifest, remove clears dependency and layer together, and verification covers two places. Five reminders:

  1. Do not hand-delete plugin folders under node_modules. The files vanish but the manifests remain, and the profile still resolves a package that no longer exists.
  2. Stop the app before removing. Deleting files while a plugin is loaded can leave a half-written state; quit dsh web first.
  3. In-box bundles cannot and should not be removed. @deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app and @deepseek-ai/dsh-headless resolve from the dsh installation, and pnpm only manages out-of-tree packages (source).
  4. Prefer the full remove spelling in scripts. Short aliases such as un hurt readability; use the complete verb for anything shared.
  5. Plugin data does not leave with the plugin. remove clears the dependency and the load layer, but data a plugin wrote elsewhere is not deleted automatically — see how to clean up DSH plugin leftovers for a full sweep.

Rather not memorize the command? Uninstall from DSH Plugin Hub

All the complexity of uninstalling is "clear both manifests", and the graphical flow does that for you. Once DSH Plugin Hub is installed, open Settings → Installed, find the plugin and click Uninstall at the end of its row. A confirmation dialog listing the plugin and its source repo appears, and only after you confirm is it removed — dependency and load layer cleared in one go, with no empty shell left behind. Compared with matching package names and diffing two manifests in a terminal, one click is harder to get wrong.

Confirm uninstall

Sources: DeepSeek Harness docs - Package and install a plugin, dsh CLI README, pnpm remove (pnpm rm / uninstall) command reference

FAQ

Does dsh plugin remove only delete the dependency, leaving the plugin still loading at startup?

**No — dsh plugin remove does not leave the plugin loading.** In the official example, dsh plugin --profile demo remove dsh-hello-plugin removes both the dependency and that configuration layer, so no empty shell keeps loading. That is exactly the difference from deleting the node_modules folder by hand: hand-deletion touches files only, while both manifests stay untouched.

What is the full dsh plugin remove command, and can I drop the --profile flag?

DeepSeek Harness provides no short form for it: the full command is dsh plugin --profile <name> remove <package>, and --profile is required — omitting it exits nonzero. It picks which profile directory the command runs in, so dsh plugin --profile web remove <package> removes from the web profile, not globally.

Are dsh plugin uninstall and dsh plugin rm the same command?

**Yes — DeepSeek Harness forwards everything after --profile to pnpm**, and pnpm remove has the aliases rm, uninstall and un, so dsh plugin --profile web rm <package> and dsh plugin --profile web uninstall <package> are equivalent. Any of the three spellings goes through the same channel.

After uninstalling, how do I confirm DeepSeek Harness no longer loads the plugin?

Confirming that DeepSeek Harness no longer loads it takes two places. In the profile's package.json the package should be gone from both dependencies and dsh.profile.bundles; then run dsh --profile web --dump-config and confirm the previous # == <package> layer no longer appears. Both clean means the removal is complete.

Why do I still get a missing-package complaint at startup after removing a plugin with dsh plugin remove?

DeepSeek Harness can reference a plugin in more than one place, so first check whether the profile's own cordis.patch.yml still has a hand-written row referencing that plugin — that overlay is not managed by pnpm, so remove will not clear it. Also confirm you removed from the right profile: dsh web boots the web profile, and plugins installed elsewhere are unaffected by the command.

Related Terms

dsh plugin remove
dsh plugin remove is the DeepSeek Harness command that uninstalls a plugin from a named profile, written in full as dsh plugin --profile <name> remove <package>. It removes both the pnpm dependency and the matching entry in the profile's bundle manifest, equivalent to running pnpm remove in the profile directory plus maintaining the load layer.DeepSeek Harness docs - Package and install a plugin
pnpm remove
pnpm remove is the pnpm command that deletes a dependency, removing the package from node_modules and from the project's package.json, with the aliases rm, uninstall and un. The dsh plugin channel forwards to it, which is why those aliases work under dsh plugin too.pnpm remove (pnpm rm / uninstall) command reference
dsh.profile.bundles
dsh.profile.bundles is the ordered bundle array inside a profile's dsh.profile manifest in package.json, defining which plugin layers are applied, in what order, at boot. Uninstalling a plugin must clear it alongside dependencies, or the manifest keeps pointing at a package that is no longer present.DeepSeek Harness docs - Package and install a plugin
in-box bundle
An in-box bundle is a bundle shipped with the dsh installation itself, such as @deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app and @deepseek-ai/dsh-headless. These always resolve from the dsh installation rather than the profile's node_modules, so they are not pnpm-managed out-of-tree packages and remove does not apply to them.DeepSeek Harness docs - Package and install a plugin

Sources