dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
长按拖动即可重排设置面板左侧大项:被拖项半透明并跟随指针,顺序保存在插件自己的目录而非 settings.yaml,卸载后自动恢复官方原序。
Long-press and drag to reorder the settings panel's nav sections.
English · 中文
Long-pressing "通用设置" (General) and dragging it down — the dragged row turns translucent and follows the cursor; releasing saves.
In the DeepSeek Harness settings panel, the order of nav sections is fixed by each plugin's own order value. The more plugins you install, the harder it gets to arrange them the way you work.
This plugin adds a hidden gesture: long-press any section for ~0.3 s, drag it up or down, release to save. Next time you open the settings panel, your order is still there.
It ships no UI of its own — no new settings page, no slot registrations, no visual change to the nav. You will not find it anywhere in the interface. That is deliberate.
| Before | |
| After |
MutationObserver follows panel re-opens and React re-renders, re-applying your order every timesettings.yaml, never modifies external dataRequires Node.js plus dsh and pnpm:
npm install -g @deepseek-ai/dsh pnpm
Then install the plugin (replace web with your profile name):
dsh plugin --profile web add dsh-settings-nav-order
Restart dsh afterwards — a newly added bundle is not hot-applied to a running process:
dsh --profile web
Then refresh the browser page and open the settings panel (the gear at the bottom of the sidebar).
Installing from GitHub source also works:
dsh plugin --profile web add github:<owner>/dsh-settings-nav-order
To go back to the official order, see "Uninstall" below.
The order record is written inside the plugin's own folder:
<plugin dir>/data/order.json
It looks like this:
{
"version": 1,
"order": ["general", "models", "plugins", "agent-presets", "jet-hub"]
}
This is the plugin's entire data footprint — one file.
| Thing | Behaviour |
|---|---|
~/.dsh/settings.yaml | Never written. No settings namespace is registered |
| Other plugins' files | Never touched |
| Your existing config and sessions | Never modified |
| Any external data | Not changed |
Why not use the official ctx.settings (which writes settings.yaml)? Because that is a shared config file, and by design DSH does not clean up a plugin's namespace section when the plugin is uninstalled — it lingers forever. An order record is a preference cache, not configuration, so keeping it in the plugin's own folder is cleaner: it disappears with the folder on uninstall, leaving zero residue.
dsh plugin --profile web remove dsh-settings-nav-order
After uninstalling:
ctx.slots.entries('settings.section') sorted ascending by order); it does not rely on React happening to re-renderdsh plugin remove drops the package from the profile's dsh.profile.bundles, so the patch layer it ships stops being loadedYou need to restart
dshand refresh the page to see the nav restored. To go back to the default order without uninstalling, just deletedata/order.jsonand refresh.
The settings nav list is not a Slot — it is rendered directly by the settings panel. So the plugin:
settings.section ledger (ctx.slots.entries) and computes the row order with the exact same algorithm the panel uses[role="dialog"][aria-modal="true"] > nav > div:last-childinsertBefore and applies a translateY to the dragged row so it tracks the pointerMutationObserver (with a storm watchdog) to follow panel re-opens and re-renders, re-applying the orderGET/POST /api/settings-nav-order/orderEvery style, subscription, observer and listener hangs off the plugin's fiber, so stopping or uninstalling cleans up and restores everything automatically.
Prior art this builds on (same architecture):
dsh-settings-nav-organizer — provided the battle-tested pattern for locating the nav DOM, reading the ledger, the storm watchdog, and fiber cleanup@choi-p/dsh-footer-order — provided the "DOM child ↔ ledger entry id" pairing strategy and demonstrated a truly traceless uninstallnav > div:last-child layer), dragging breaks — the selector needs updating. Failure is silent (nothing errors, dragging just stops working), so re-verify after upgrading DSH.order value. When other plugins add or remove settings pages, entries not present in order.json appear at their official position.Open the browser console (F12); every log line from this plugin is prefixed with [settings-nav-order]:
| Log | Meaning |
|---|---|
已载入顺序记录:N 项 | Started fine; N is the number of saved entries |
顺序已保存:a → b → c | The drag was saved |
顺序记录读取失败… | The Host route is unreachable — did you restart dsh? |
mutation 风暴,挂起观察器 2 秒 | The page is re-rendering heavily; the plugin is protecting itself |
If dragging does nothing at all:
// 1) does the selector find the nav list?
document.querySelector('[role="dialog"][aria-modal="true"] > nav > div:last-child')
// 2) does its <button> count match the number of settings sections?
If clicking the nav does nothing either, check whether another full-screen overlay (such as an onboarding dialog) is on top of it — that would swallow drags too.
| DSH | Verified working on 0.1.5-rc.2 |
| Platform | web |
| Node.js | ^22.19.0 || >=24.0.0 |
| Dependencies | None at runtime (react is provided by the host) |