DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
A

dsh-accountdisplayname-edit

Accountdisplayname Edit

将侧边栏账户标签(电话号码、电子邮件或账户名称)和头像替换为您自定义的文字和图片,这些内容可在账户菜单中的新行里选择,从而避免截图暴露原始信息。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:AomiRaku/dsh-accountDisplayName-edit#fb3c073725d28e7c718a7fce6bde2d9d7ff6cf92
README兼容性版本
The account menu with the Edit display name rowThe editor dialog

兼容性与来源证明

Accountdisplayname Edit 以 dsh-accountdisplayname-edit 发布,当前版本为 0.2.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/21

版本

0.2.1stable
2026/10/21
0.2.0stable
2026/10/20

相关插件

正在加载相关插件…

最新版
0.2.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 2
周下载
0
最近提交
2026/10/29
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Session Titles Bundle@deepseek-ai/dsh-experimental-session-titles-bundle新的用户提示到达时刷新会话标题。Personalized Recommendations@deepseek-ai/dsh-personalized-recommendations回答下方以卡片形式提供个性化页面和内置插件推荐Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层

README

dsh-accountdisplayname-edit

Replaces the sidebar account label — the phone number, email, or account name DeepSeek Harness shows at the bottom-left — and the avatar above it, with a name and image you choose, so screenshots do not expose the original.

The edit entry is a new Edit display name row in the account menu, the one you open by clicking that label. The dialog it opens holds both the avatar and the name.

What it does

  • Replaces the account label text in the sidebar footer with a display name you set.
  • Replaces the launcher avatar with an image you pick from a local file.
  • Adds an Edit display name / 编辑显示名称 row to the account menu, directly under Settings.
  • Opens one editor dialog for both: pick or clear an avatar, type a name, then Save, Cancel, or Use default. Enter saves, Esc cancels.
  • Both edits are drafts until Save — Cancel leaves the sidebar untouched.
  • Saving an empty value restores the account's own text; clearing the avatar restores the account's own avatar.
  • A picked image is centre-cropped square, downscaled to 128×128 and re-encoded, so the stored copy stays in the low tens of KB.
  • Stores both per browser in localStorage, under dsh.account-display-name-edit.alias and dsh.account-display-name-edit.avatar.
  • Display only. The account, the credentials and the profile are never read or changed, and the plugin makes no network requests of its own.

Requirements

Built and verified against DSH 0.2.0-rc.2. The account launcher and Menu DOM it targets — data-signed-out, the _avatar / _label spans, the portaled div[role="menu"] with its role="presentation" viewport and itemIcon / itemLabel rows — is unchanged in 0.2.1-rc.2, which this package was checked against. The host half imports nothing and the browser half fails soft, so a build whose DOM has moved on degrades to "no override, no extra row" rather than an error — see Compatibility.

Install

From the desktop app

The desktop profile is managed exclusively by the Electron application, so install it there through the app's own plugin surface (Settings → Plugins, or dshmarket); the CLI refuses that profile by design.

From the CLI, for any profile the app does not own

dsh plugin --profile <profile> add github:AomiRaku/dsh-accountDisplayName-edit

There is no build step and no prepare script: the browser half is committed as lib/client.js, so pnpm never asks for build approval and the install is a plain file copy.

Manually, which is exactly what the commands above do

  1. Put the package where the profile resolves its bundles — <DSH_HOME>/profiles/<profile>/node_modules/dsh-accountdisplayname-edit. A directory junction/symlink to a checkout works.

  2. Add this to <DSH_HOME>/profiles/<profile>/cordis.patch.yml:

    - insert:
        - id: account-display-name-edit
          name: dsh-accountdisplayname-edit
    

    That patch layer is watched, so it applies live — no restart needed.

Use

  1. Click the account row at the bottom of the sidebar.
  2. Choose Edit display name.
  3. Optionally click Choose image… and pick a PNG / JPG / WebP; the round preview shows the cropped result. Clear avatar goes back to the account's own avatar.
  4. Type the name you want. Save an empty value to go back to the account's own text.
  5. Click Save. Nothing changes until you do.

Screenshots

The account menu, with the Edit display name row added under Settings, and the chosen name and avatar on the launcher below it:

The account menu with the Edit display name row

The editor dialog: avatar preview, name field, and Save / Cancel / Use default:

The editor dialog

Uninstall

Remove the insert from cordis.patch.yml and delete the package directory. The stored name and avatar stay in the browser's localStorage until you clear them; the plugin writes nothing else.

How it works

A dual-face plugin whose host half does almost nothing.

  • Host half — lib/index.js. Deliberately import-free. Its only job is to be a Loader entry, so the host's client-module scanner reads dsh.client from package.json and serves ./client to the browser. With no dependencies and no peerDependencies, it cannot fail to load because of a missing, renamed or version-mismatched peer package.
  • Browser half — lib/client.js. A hand-written single-file bundle, already in the window.__ModuleLoader__.load({ id, factory }) form the module system serves verbatim, so the package needs no build. It requires only react, which the shell seeds as a platform module — which is why react is not a dependency either.

Why the menu row is done in the DOM

@deepseek-ai/dsh-client-ui-settings-account renders that menu from a hard-coded items array, and its only slot (settings.launcher, a single slot) is the launcher row itself. Occupying that slot would delete 设置 / 意见反馈 / 退出登录, which this plugin must not do. There is no menu-item slot to add to.

So the row is appended to the open menu's list, cloned from a shipped row — it therefore inherits that build's exact markup, classes and styling. Appending one node leaves React's own children untouched, and the row is removed with the menu because React never tracked it.

Selectors use only stable identifiers, never a hashed CSS-module prefix:

  • the launcher is button[aria-haspopup="menu"][data-signed-out], an attribute the account component always writes; the text node is found by the _label suffix and the avatar by the _avatar suffix, with positional fallbacks;
  • the menu is a div[role="menu"] the Menu primitive portals to <body>, identified as the one that appeared after the launcher was activated.

How the avatar is replaced

The avatar span's real contents are React's — an <img> or an initial. Rather than remove them, the plugin paints the picked image as the span's background and hides the span's children with one scoped rule:

[data-dsh-accountdisplayname-edit-avatar="1"] > * { display: none !important }

That is two attribute writes and a background image; no React-owned node is detached, re-parented or replaced, so a later account refresh cannot collide with it. Clearing the avatar removes the attribute and the background, and the real avatar reappears.

Failing soft

Every DOM probe runs inside try/catch; when a probe misses, the plugin does nothing — it never edits another node and never throws into the shell's plugin loader. Clearing the name hands the account plugin's own text back.

The label is written through React's own text node (nodeValue, not textContent), so later account refreshes stay observable instead of updating a node React no longer owns.

Compatibility

  • dsh.client.immediately: true is required: the plugin works through side effects registered when its bundle materializes, so it belongs in the boot graph's immediate tier.
  • No engines.dsh range is declared, on purpose. node-semver only admits a prerelease version when some comparator in the range shares its exact major.minor.patch tuple and itself carries a prerelease tag, so any range would silently exclude a later prerelease of the harness — the failure mode the awesome-dsh-plugin contributing guide warns about. Failing soft is the safer contract here.

Verification

npm install
npm test

116 checks against a real DOM (jsdom + React 18.3.1):

  • test/dom.test.mjs — 40 checks: the bundle wrapper contract, apply() registration, label replacement, re-application after the account half re-renders, menu-row injection (label, icon, dropped shortcut, insertion position, shipped rows untouched), row activation closing the menu and opening the dialog, save and reset, and disposal.
  • test/robustness.test.mjs — 16 checks over the fail-soft paths: the account row gone entirely, the _label class renamed, the collapsed rail where the avatar is the only span, an English locale, a menu rendered before its rows exist, no document.body, the account span replaced by a React remount, and disposal after the account row was removed.
  • test/avatar.test.mjs — 28 checks: a stored image painted on the launcher, the scoped stylesheet, the real avatar left intact, the dialog's file input and pick/clear controls, draft-vs-Save semantics for the avatar, a signed-out launcher without an avatar span, a corrupted stored value, and disposal. Picking a file itself is not exercised here: jsdom has no 2D canvas and never decodes images.
  • test/edge-cases.test.mjs — 32 checks over the failure and teardown paths: a disable landing between two frames of the menu poll, a re-enable after a disable while the dialog was open, a name the browser refuses to persist, the collapsed rail before and after it expands, double disposal, re-applying, the menu closing through the launcher's own toggle instead of a document-wide Escape, the dialog's Tab containment and short-window scrolling, the click path performing zero document-wide queries while leaving the menu's own opening frame untouched, and a re-created label node, avatar node, or whole launcher button being repainted before the next frame (no flash).

It was also verified in a live DSH 0.2.0-rc.2: the host entry reached fiberPhase: active, and the running Web GUI's slot tree listed the plugin's shell.overlay entry as active, which means the host served the bundle and the page materialized and ran it.

Store listing

The awesome-dsh-plugin entry is ready to copy:

store-entry/data/plugins/AomiRaku__dsh-accountDisplayName-edit.yml
  -> data/plugins/AomiRaku__dsh-accountDisplayName-edit.yml

That one file, added to a fork of awesome-dsh-plugin, is the whole submission — do not edit the generated READMEs by hand.

Screenshots are declared in screenshots.json next to package.json, which lists two repository-relative images in display order. They live in this repository, so replacing one is a push here — not a new pull request to the list.

["assets/screenshot-1.png", "assets/screenshot-2.png"]

Known limitations

  • The menu row and the avatar override depend on the shipped account-menu DOM. A future release that restructures it silently drops that part — nothing breaks, but the row or the avatar stops updating until this package follows the change.
  • The name and the avatar live in this browser's localStorage, so they are per-origin and not synced across machines. They never reach the account.
  • The avatar is stored as a 128×128 PNG data URL. A file over 10 MB, or an encoding that still exceeds the storage cap, is rejected with a message instead of being silently dropped.
  • Only Simplified Chinese and English strings are bundled; the UI follows the client locale and falls back to Chinese.

License

MIT