DSH Toolbox

Which DeepSeek Harness plugins conflict

Most plugin conflicts come from two plugins patching the same row: a patch replaces the whole config, so the later layer wins and the earlier one silently disappears.

Every pair below is drawn from the peerDependencies and the conflict note on that plugin's own page — all 62 plugin pages are in the directory, so each name links somewhere. Nothing here is a guess about behaviour we did not read.

The four groups are: competing for one UI slot, competing for one config row, calling the same external endpoint, and doing the same job.

Competing for one UI slot

Package APackage BWhat you seeKeepWhy keep itWhy they cannot coexist
dsh-dream-skindsh-claude-styleBoth restyle the same components. You get one look, and changing the theme in settings only moves part of the page.dsh-dream-skinIt patches dsh-client-ui-theme and the settings pages, so theme selection lives where the user looks for it; claude-style only peers the primitives.Both write the theme row, and that row holds one value — there is no per-plugin theme layer to merge into.
dsh-plugin-wallpaper-enginedsh-petTwo overlays on the same surface — the wallpaper sits behind, the pet renders on top, and either can cover the other's controls.dsh-plugin-wallpaper-engineIt owns the background layer by design; a pet is decorative and can be removed without losing layout.Both mount into the same overlay slot of @deepseek-ai/dsh-client-ui-slots, and that slot renders one component per slot id. Neither plugin declares its own id, so the second mount replaces the first.
@chengze/dsh-skill-managerdsh-skill-browserTwo sidebar panels listing the same skills with different state. The one you toggle in is not necessarily the one the agent loads.dsh-skill-browserIt peers dsh-client-ui-slots, reads the skill directory itself and adds call ledgers; the manager keeps a second inventory that drifts.Both claim the skills panel entry in the sidebar and both read the skill directory, so the list you toggle is not necessarily the list the agent loads.
dsh-skill-browserdsh-toomuch-pluginsAfter you install it the plugin's panel looks like it never arrived — the entry is there but clicking it goes nowhere.dsh-skill-browserFold the sidebar only if you do not need a plugin whose whole UI is that sidebar entry.One plugin's entire UI is a sidebar entry that the other folds into a collapsed group, so the surface exists but cannot be reached.
dsh-genuideep-viewBoth render rich blocks inside answers; a malformed block fails in one renderer and renders in the other.dsh-genuiIt peers dsh-client-ui-slots and writes the block format into the system prompt, so the producer and the renderer stay in one package.Both register a renderer for the same answer-block content type. The block has no discriminator field, and the renderer registry keeps one handler per type, so the later registration replaces the earlier one.
@yugoo-design/dsh-design-paneldsh-genuiThree renderers for the same block type once deep-view is in the mix; the first one to claim the block wins.@yugoo-design/dsh-design-panelPick by output type: editable design files here, ad-hoc charts and forms in genui. Keep one per profile.Design panels and generated blocks share the block slot; whichever renderer registers last takes the whole slot, not just its own blocks.
@zhaoyang10/dsh-web-idedsh-codegraph-visualizerBoth add a tab to the client; the tab strip crowds but nothing errors.@zhaoyang10/dsh-web-ideThe code tab is used every session; the code graph is used when you are already debugging it.Both add a tab above the conversation, and the tab strip has a fixed order — the second tab pushes the first out of view on narrow windows.

Competing for one config row

Package APackage BWhat you seeKeepWhy keep itWhy they cannot coexist
@michengai/dsh-archive-managerdsh-session-superagentAn archived session reappears in the list, or a session you expected to see is missing entirely.@michengai/dsh-archive-managerIt peers 16 official packages including dsh-session-projection-cache and dsh-storage-domain; the supervisor peers one and needs a narrow dsh range.Both mutate the session lifecycle: one moves a session out of the active list while the other still holds it open.
@michengai/dsh-skills-managerdsh-univer-officeThe skill list shows fewer skills than you installed — the ones from one of the two are gone.@michengai/dsh-skills-managerDeclare skills in one place. The office plugin needs the skill only for document tooling; the manager is the one whose job is the list.Both patch the @deepseek-ai/dsh-skill row, and a patch replaces that row whole, so the second one leaves only its own skill list.
dshmarketuniversal-plugin-hubInstall a plugin from one of the two, then look at the list: the entry you just added is gone, or the count is one short.dshmarketIt patches dsh-settings rows and keeps its inventory in the settings surface, which is what the profile already owns.Both write the profile package.json, which has one dependency set — an install from one can drop an entry the other just wrote.
dsh-better-plugin-updaterdshmarketYou plan an update in one screen; after installing something in the other, that plugin is back on the old version.dsh-better-plugin-updaterIt only plans and never applies without approval, so it is the safer writer to keep when you want version control.Both rewrite version fields in the same manifest; an update planned in one is invalidated by an install from the other.
dsh-syn-configdsh-custom-themeConfig sync copies files between machines while a theme plugin writes its own config; the next sync overwrites the theme.dsh-syn-configChoose one authority for config files. If sync is on, keep themes inside it rather than editing them on both machines.One writes CSS and background files under the profile while the other copies that directory between machines — the next sync overwrites the theme.
@aiwayds/dsh-llm-proxydsh-providers-hubCalls from one provider go out without passing the proxy, so your split routing silently stops applying to them.@aiwayds/dsh-llm-proxyTraffic splitting is only observable if every model call goes through the one dispatcher.Both sit on the outbound model path: the proxy installs a global dispatcher, and a provider plugin with its own transport steps around it.

Calling the same external endpoint

Package APackage BWhat you seeKeepWhy keep itWhy they cannot coexist
dsh-free-search@liustack/modsearchAsk the same question twice and the answers come from different search engines, with no way for you to say which one.dsh-free-searchIt peers @deepseek-ai/dsh-tools and the command palette, so the provider is reachable from the UI; modsearch declares no peers at all.Both register a web-search tool under the same capability, so the model picks one provider and the choice is not stable across turns.
@xmanrui/dsh-im@tencent-connect/dsh-qqbotQQ messages arrive twice through two bridges, and the approval prompts differ between them.@tencent-connect/dsh-qqbotIt peers dsh-user-approval and @deepseek-ai/dsh-session, so approvals round-trip through the session that will run the tool.Both bridge the same QQ account into sessions, so one message arrives twice and the two approval flows disagree about who answered.
ds-harness-remotedsh-mobile-pluginTwo entry points into the same host. One of them is the one you forget to lock down.ds-harness-remoteIt exposes the gateway itself over P2P with end-to-end encryption, so the boundary is one place instead of two route groups.Both open their own ingress to the same host, with separate tokens and separate route tables that nobody reconciles.
ds-harness-remotedshost-pluginTwo relays exposing the same local UI; three credentials to revoke if one leaks.ds-harness-remoteIt peers dsh-api-gateway and the settings pages, which keeps the exposure beside the thing being exposed.Two relays expose the same local UI through different endpoints; revoking access means revoking it in two places, and one is easy to forget.
dsh-computersdsh-windows-mcpBoth let the agent run things on other machines; three command tools with different sandboxes and different blast radius.dsh-computersIt is built for many machines rather than one OS surface; keep windows-mcp only if every target is Windows.Both give the agent command execution on other machines, with different sandboxes, so the same task behaves differently depending on which tool the model picks.
dsh-tool-database@mzzsfy/dsh-tool-gateThe database tools never appear in a run, even though the plugin says it installed fine.dsh-tool-databaseKeep the database tool and add it to the gate whitelist; removing the gate would give up the prompt savings on every other turn.The gate defers every tool outside its whitelist, so the database tool is registered but never advertised until it is listed there.

Doing the same job

Package APackage BWhat you seeKeepWhy keep itWhy they cannot coexist
@nanmicoder/dsh-agent-teamsdsh-agent-compareInstall the second one and the button the first plugin added is simply gone.@nanmicoder/dsh-agent-teamsIt peers 23 packages and owns team roles; compare multiplies spend 2–4× per request and is a one-off diagnostic.Both patch the composer row in dsh-client-ui-chat. A patch replaces the whole row config, and that row carries a single control set, so the later layer takes the controls away from the earlier one.
@nanmicoder/dsh-agent-teams@xirang-ai/dsh-teamflowTwo orchestrators describing roles for the same requirement-to-defect pipeline.@xirang-ai/dsh-teamflowIf the pipeline is the product (issues, defects, handoffs), take the one that models it; otherwise stay with the generic teams.Two role systems describe the same requirement-to-defect pipeline, so the agent gets two conflicting sets of roles for one task.
@mzzsfy/dsh-tool-gate@logictan/dsh-tool-surfaceThe agent can call fewer tools than either plugin promised you — some you enabled never show up in a run.@mzzsfy/dsh-tool-gateOne gate is enough. Two means tools can be deferred by one and never loaded by the other.Two whitelists trim one tool list; the effective set is the intersection, and a tool deferred by one may never load through the other.
dsh-octop-memorydsh-mnemonThe agent brings up a memory you have no recollection of, or two plugins' memories contradict each other in the same answer.dsh-octop-memorydsh-octop-memory writes facts back to disk at the end of the turn, and dsh-mnemon keeps nothing on disk — so when both are installed, only octop-memory is doing that write-back.Both inject a context block into the same slot before each turn, and neither marks its block as authoritative over the other.
dsh-cost-meterdsh-whale-widgetTwo spend readouts on one screen, both calling the account API for the same numbers.dsh-cost-meterIt breaks cost down per session and per day; the widget shows balance only.Both target the conversation header slot in @deepseek-ai/dsh-client-ui-slots, which mounts one component per slot id. Neither declares a distinct id, so the two readouts cannot both stay mounted.
dsh-custom-themedsh-exv-flat-cornersTwo stylesheets setting the same radii; load order decides, not intent.dsh-custom-themeOne stylesheet that you own beats one that hard-codes a single look.Both declare the same --radius-* custom properties in the web client scope. A custom property holds one value per element, and neither plugin namespaces its selectors, so the later declaration wins outright.
@dickpy/dsh-imagegendsh-memeTwo image paths in the composer area; two buttons, not an error.@dickpy/dsh-imagegenGeneration covers more than sending; keep the meme library only if sending is the common case.Both add an image path next to the composer, and the composer area lays out one action row — two entries push a third control out.

Common questions

How were these pairs chosen?

From shared peerDependencies and from the conflict note written on both plugins' own pages. Pairs without a shared surface were left out.

Does installing two of them break the CLI?

Not usually. Patches replace a row config, so the symptom is a missing panel or a lost entry, not a crash. A crash is more likely from an engines.dsh mismatch, which the boot check reports.

What is the fastest way to see what actually won?

dsh --profile web --dump-config prints the composed tree; the row that exists once is the one that won.