Back to home

xiajiajun516

dsh-settings-organizer

Low-intrusion Settings presentation layer for DeepSeek Harness (DSH): group plugins, hide settings, search and restore - additive client-slot + settings-namespace seams.

Stars
1
Language
TypeScript
Created
Aug 16, 2026
Updated
Aug 16, 2026

Introduction

🧰 DSH Settings Organizer

A low-intrusion Settings presentation layer for DeepSeek Harness (DSH): group, hide, search and restore your settings — without ever changing another plugin's configuration.

English · 简体中文

npm version license


✨ Highlights

IconFeatureIn one line
🗂️Group by pluginEvery plugin's settings render as one collapsible group
🎚️Collapse / expandPer-group, state persisted across restarts
🙈Hide anythingHide a single field or a whole plugin's settings
🔍SearchMatches label / key / path / plugin name / description; ignores collapsed state
↩️Manage HiddenRestore one field, one plugin, or everything in one click
🧹Zero side effectsNever edits other plugins; uninstall leaves no trace

🚀 Quick start (30 seconds)

1️⃣ Install the plugin (one command — see below)
2️⃣ Restart DSH
3️⃣ Open Settings → "Settings Overview"
4️⃣ Collapse groups you don't care about → search → hide noise → done

📥 Installation

dsh plugin --profile web add dsh-settings-organizer@latest --config.auto-install-peers=false

💡 --config.auto-install-peers=false skips a few DSH core packages that aren't on the public registry — the DSH runtime provides them.

🐛 @latest resolves an old version? That's pnpm 11's minimumReleaseAge supply-chain policy (versions younger than ~30 days are excluded from resolution). Install an exact version once — it auto-whitelists, then @latest works:

dsh plugin --profile web add dsh-settings-organizer@0.1.1 --config.auto-install-peers=false

Or disable the age gate entirely by adding minimumReleaseAge: 0 at the top of the profile's pnpm-workspace.yaml (PowerShell one-liner):

$f = "$env:USERPROFILE\.dsh\profiles\web\pnpm-workspace.yaml"
$c = Get-Content $f -Raw
if ($c -notmatch '(?m)^minimumReleaseAge:') {
  Set-Content -LiteralPath $f -Value ("minimumReleaseAge: 0`n" + $c) -Encoding utf8
  Write-Output "已添加 minimumReleaseAge: 0"
} else {
  Write-Output "已存在,无需修改"
}

🧩 What it does

Registered as a new, additive Settings section ("Settings Overview") plus a header "Manage Hidden" action:

  1. Plugin groups — each settings namespace (ns) from settings.describe() renders as one collapsible group.
  2. Collapse / expand — per-group, with the collapsed state persisted.
  3. Hide a single setting — removes one field from the overview (pure presentation).
  4. Hide a whole plugin — hides every field of a namespace group.
  5. Search — matches label / key / path / plugin name / description; search ignores collapsed state, and a hidden item that matches shows a "Hidden · Restore" hint — it is never auto-unhidden.
  6. Manage Hidden — a header action opening a modal that restores a single hidden field, a whole hidden plugin, or everything.

🛡️ Safety guarantees

  • Hiding ≠ disabling ≠ deleting. Hiding only edits our own persisted presentation lists — another plugin's config is never updated, replaced, or unregistered.
  • Removable with zero residue. Everything this plugin registers lives on its own cordis fiber; disabling/removing it restores DSH stock settings pages exactly.
  • No DSH Core surgery. No DOM monkey-patching, no fragile CSS selectors, no private-state manipulation — only the official settings, settingsScope and slots seams.
  • Robust to bad state. Invalid persisted data is sanitized before it reaches the view — it can't crash or miswrite.

🔄 Compatibility

  • DSH web profile with the settings domain (dsh-client-ui-settings / the -general shell), client runtime/slots and the locale plugin.
  • Peer packages: @deepseek-ai/dsh-client-* ^0.1.0-rc.6, @deepseek-ai/cordis ^4.0.1, react ^18.2.0.

❓ FAQ

Q: Does hiding a setting change its value? No. Hiding only edits this plugin's own presentation lists; the setting's value and its owning plugin's config stay untouched.

Q: Will uninstalling the plugin break my settings? No. Everything is registered on the plugin's own cordis fiber and disposed on removal — other plugins' pages return to DSH stock.

Q: Is the collapsed state saved? Yes — persisted in the shared settings document (~/.dsh/settings.yaml) under this plugin's own namespace.

Q: Can search unhide things? No. A hidden item is never auto-unhidden — you'll see a "Hidden · Restore" hint and restore deliberately.

Q: Does it work if I have a lot of plugins? Yes — groups are lazy-rendered by namespace; collapse hides the noise, search finds anything instantly.


📋 Known limitation

Hiding applies to the overview page only: DSH has no per-field renderer inside other plugins' own Settings pages, so a field hidden here still appears on its owner's page. Hiding outside the overview would need an optional Core extension point (see docs).


👩‍💻 For developers

  • DEVELOPERS.md — build / typecheck / the tag-triggered auto-publish pipeline (npm via OIDC trusted publishing + GitHub Release with auto notes).
  • Spec & architecture — docs/dsh-settings-tidy.md, docs/phase-a/architecture.md, docs/phase-a/rfc-option-c-section-filter.md (hard invariants, mounting & packaging, state model).

📄 License

MIT — see LICENSE.