dsh-theme-colorizer

DSH PLUGINUI 与外观

仓库 RealHacker/dsh-theme-colorizer

UI 与外观 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

为 DeepSeek Harness 的 Web UI 提供 5 种可自定义颜色主题,通过设置页选择并持久化到 localStorage,与明暗模式叠加生效。

验证等级 L5 L5 · 运行验证通过
GitHub 星标 2 复刻 0 · 未关闭 issue 未标注
最近更新 2026-08-21 创建于 2026-08-15
README 15.2 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:RealHacker/dsh-theme-colorizer
兼容 DSH 版本0.2.0-rc.2 等 11 个版本版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

4 项功能
字段来自项目仓库与公开索引,中文说明由本站标注

dsh-theme-colorizer:DeepSeek Harness 的界面颜色主题插件

  • 5 种颜色主题
  • 设置页集成
  • 偏好持久化
  • 与明暗模式叠加

适用场景

皮肤主题

上游标签

coding-agentcolor-schemedsh-plugin

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度稳定按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

上面的结论来自上游最近一次自动化验证(2026-10-08): 同一套检查会在插件发新版后重跑,页面显示的是最新一次的逐项结果。

逐项检查结果

L1 · 已找到 ✓ 通过
  • L1.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L2 · 结构化 ✓ 通过
  • L2.0_DEFAULTED_FROM_L3 由 L3 推定 默认通过——L3 安装规范已通过(全库 L3 扫描策略)
L3 · 安装规范 ✓ 通过
  • L3.1_INSTALL_COMMAND_PARSED 安装命令已解析 方式:安装规范解析
  • L3.2_DSH_VERSION_DECLARED DSH 版本已声明 方式:DSH 版本声明
L4 · 安装已测 ✓ 通过
  • L4.1_INSTALL_EXECUTED_CONFINED 受限沙盒内执行安装 方式:沙盒安装执行
  • L4.2_INSTALL_SUCCESS 沙盒安装成功 方式:沙盒安装执行
  • L4.3_ARTIFACT_CONFIRMED 安装产物已确认 方式:沙盒安装执行
L5 · 运行已测 ✓ 通过
  • L5.1_INSTALL_PASSED_SANDBOXED 沙盒安装通过 方式:沙盒安装执行
  • L5.2_WEB_BOOT_READY Web 启动就绪 方式:Web 启动
  • L5.3_HTTP_SERVED HTTP 服务响应 方式:HTTP 请求
  • L5.4_PLUGIN_INVENTORY_ACTIVE 插件清单中已激活 方式:插件清单查询
— · 其它检查项
  • L4_0_SANDBOX 沙盒安装判定 方式:沙盒安装执行

风险详情

  • 审查结论 通过
  • 结论说明 vet 静态分析未发现可疑行为,判定为干净(clean)。
  • 风险计数 严重 0 / 高 0 / 中 0
  • 风险详情 未发现严重或警告级问题。

仓库档案

UI 与外观
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方RealHacker仓库 dsh-theme-colorizer · 默认分支 未标注
分类UI 与外观skin
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言TypeScript仓库主语言
许可证NOASSERTION商用或二次分发前请确认条款原文
星标 / 复刻 / issue2 / 0 / 未标注收录时的数值,非实时
创建 / 更新2026-08-15 · 2026-08-21最后推送 未标注
本站收录2026-08-27首次进入本站目录的时间

README 全文

15.2 KB
作者原文,中文版优先;只做安全转义,不改内容

dsh-theme-colorizer

A DeepSeek Harness (DSH) plugin that adds customizable color themes to the DeepSeek Web UI. The user selects a color theme on the Settings page, and the chosen theme's --dsw-alias-* CSS token overrides are applied on top of the active light/dark base palette.

Features

  • 5 color themes: Ocean Blue, Forest Green, Sunset Orange, Royal Purple, Monochrome
  • Settings page integration: a "Color Theme" row appears in the General section of the Settings panel
  • Persisted preference: the user's choice is kept in browser localStorage and survives page refreshes
  • Composes with the built-in Appearance row: the color theme is independent of the light/dark/system preference — both layers compose through the theme service's override stacking

How it works

The DSH plugin loading model

A DSH plugin is a Cordis plugin module. It exports an apply(ctx) function that the Cordis loader calls with a context (ctx). Every registration the plugin makes — theme overrides, slot registrations — is an effect on that context, so unloading the plugin automatically tears down its contributions.

This plugin has two halves because it contributes to both the Host (Node.js server) and the Client (browser) sides of the DSH web application:

Host side (src/index.ts)

The Host half is a loadable but inert entry: the row in the composition must resolve a package main, and the browser plugin graph is served from the package's ./client export. There is no host-side work because persistence is client-side: the Host API gateway only exposes settings namespaces on a curated allowlist (WEB_SETTINGS_NAMESPACES in the apiproxy), and plugin-owned exposure is deferred harness work — a write to an unlisted namespace is refused with settings-not-exposed. Keeping the preference in localStorage makes the plugin fully self-contained (no harness source changes, no host rebuild).

When loaded: at server startup, when the Loader reads the composition and mounts this plugin entry. The host half's apply runs and returns immediately.

Client side (src/client/index.ts)

The Client half runs in the browser. It:

  1. Reads the stored color theme — synchronously from localStorage under the key dsh-theme-colorizer:theme (falling back to the default), so there is no first-paint race after a refresh.

  2. Applies token overrides — calls ctx.theme.overrideTokens('dsh-theme-colorizer', tokens) to overlay the selected theme's --dsw-alias-* CSS custom properties on top of the active base palette. The theme service composes override layers in stacking order; later layers win per-token. The plugin's layer is identified by the source string 'dsh-theme-colorizer', so re-calling with the same source replaces the layer atomically.

  3. Persists the selection — writes the chosen id back to localStorage on every change; a storage event listener keeps other open tabs in sync.

  4. Registers a settings row — injects into the settings.general.item slot and registers a ThemeColorRow React component that renders the five color-theme swatches. The component receives the current selection and a setColorTheme callback through its inject face.

When loaded: when the browser's module loader constructs the window.__DSH_BOOT__ plugin graph. The dsh.client manifest in package.json declares this is a web plugin with immediately: false, so it loads during the normal plugin graph initialization (not in the stage-one prefetch tier).

Settings row rendering

The ThemeColorRow component renders inside the General section of the Settings panel. It uses the DSH slot system:
- The ui-settings package declares the settings.general.item slot type
- The ui-settings-general package renders the General section and its item slots
- This plugin registers into that slot with id: 'theme-colorizer' and order: 20 (placing it after the built-in Appearance row at order 10)

Theme token override flow

User picks "Forest Green" in Settings
→ ThemeColorRow calls setColorTheme('forest-green')
→ Client plugin persists it to localStorage (dsh-theme-colorizer:theme)
→ Client plugin calls ctx.theme.overrideTokens('dsh-theme-colorizer', forestTokens)
→ ThemeRuntime publishes theme/change event
→ ui-layout's ThemePresenter reads the new snapshot
→ CSS variables on  update
→ All components re-render with new colors
→ On the next page load, apply() reads localStorage and re-applies the theme

Installation

Quick Installation

Execute this command:

dsh plugin --profile web add dist\dsh-theme-colorizer-1.0.1.tgz

Prerequisites

  • A working DeepSeek Harness installation (the deepseek-harness repository checkout)
  • The DSH web app is built and running (pnpm run dev:web or dsh web)

Method A (recommended): install as a bundle with dsh plugin add

The plugin is packaged as an installable bundle. Two manifest entries make that work:

  • package.json declares "dsh": { "bundle": { "patch": "./cordis.patch.yml" } } — the bundle layer
  • cordis.patch.yml at the package root inserts the plugin row into the composition

dsh plugin installs bundles into a profile with a single command, exactly like the built-in dshmarket/dsh-better-sidebar plugins in the web profile.

1. Build the plugin (the build config lives in the harness checkout):

cd E:\Deepseek\deepseek-harness
pnpm run build:lib:client

This emits packages\client\dsh-theme-colorizer\lib\ (node half index.js/invariant.js + browser half client.js).

2. Sync the built output into the workspace copy (the installable artifact):

Copy-Item -Recurse -Force packages\client\dsh-theme-colorizer\lib E:\Deepseek\Workspace\plugins\dsh-theme-colorizer\

3. Pack a tarball and install it into the web profile:

cd E:\Deepseek\Workspace\plugins\dsh-theme-colorizer
pnpm pack --pack-destination E:\Deepseek\Workspace\plugins\dist
dsh plugin --profile web add E:\Deepseek\Workspace\plugins\dist\dsh-theme-colorizer-1.0.0.tgz

That initializes the profile if needed, installs the package, and appends dsh-theme-colorizer to the profile's dsh.profile.bundles. Verify without booting:

dsh --profile web --dump-config   # shows a "# == dsh-theme-colorizer" layer with the theme-colorizer row

4. Restart dsh web.

Why a tarball and not a plain add or file: spec?

  • A plain directory add uses pnpm's link: — a junction to your source dir. Node resolves the module's realpath, so the plugin's @deepseek-ai/* imports start walking from E:\Deepseek\Workspace\... and never reach the in-box fallback $DSH_HOME/profiles/node_modules (the healed module fallback that supplies every @deepseek-ai/* package at runtime).
  • file: specs mangle Windows drive-letter paths in pnpm (ENOENT: scandir '\E:\...').
  • A tarball extracts the package inside the profile's own .pnpm store, so its realpath stays under $DSH_HOME/profiles/ and every runtime import resolves through the fallback. That is why the installable manifest declares no runtime dependencies: all @deepseek-ai/* imports are in-box packages served by the fallback, and clsx is inlined into the browser bundle. (workspace:^ ranges would also break pnpm installs outside the harness workspace — ERR_PNPM_WORKSPACE_PKG_NOT_FOUND.)

To update the plugin later: rebuild, re-sync lib/, re-pack, then dsh plugin --profile web add again (or bump the version first). To remove it: dsh plugin --profile web remove dsh-theme-colorizer.

Method B: build-integrated (manual, for development inside the checkout)

Use this only when developing against the harness source tree directly. Do not combine with Method A — both would insert the same theme-colorizer row id into the composition.

Step 1: Place the plugin in the packages directory

Copy the plugin into packages/client/ of the deepseek-harness repository:

Copy-Item -Recurse E:\Deepseek\Workspace\plugins\dsh-theme-colorizer packages\client\dsh-theme-colorizer

Or use a junction for live edits:

New-Item -ItemType Junction -Path packages\client\dsh-theme-colorizer -Target E:\Deepseek\Workspace\plugins\dsh-theme-colorizer

Step 2: Register the plugin as a TypeScript project

The DSH build is two-phase: tsc -b compiles every package and emits lib/types/*.js, then tsdown bundles each package from those files. tsc -b only compiles packages listed as project references, so add the package to tsconfig.client.json:

{ "path": "./packages/client/dsh-theme-colorizer" },

Step 3: Add the plugin to the web-app composition

In packages/bundle/web-app/cordis.patch.yml, add the entry under the dsh.client rows section:

- id: theme-colorizer
name: 'dsh-theme-colorizer'

Step 4: Add the package as a dependency

In packages/bundle/web-app/package.json, add "dsh-theme-colorizer": "workspace:^" to dependencies and devDependencies.

Step 5: Install and build

cd deepseek-harness
pnpm install
pnpm run build:lib:client

Do not use pnpm run build --filter dsh-theme-colorizer — the package has no standalone build script, and tsdown alone cannot build it (its entry points are the lib/types/*.js files that only the tsc -b phase produces). pnpm run build:lib:client runs tsc -b tsconfig.client.json then tsdown --env.DSH_BUILD_FACE client; the workspace tsdown pass auto-discovers the package through the packages/*/* glob.

Restart the web server (both methods)

If the web server is already running, restart it so the Loader re-reads the composition and the modules scan re-serves the plugin bundle:

# Using dsh CLI:
dsh web

# Or during development:
pnpm run dev:web

Verification

  1. Open the Web UI at http://127.0.0.1:3080
  2. Click the Settings icon (gear) in the sidebar
  3. In the General section, you should see the "Color Theme" row with five colored swatches
  4. Click a swatch — the UI colors should update immediately
  5. The selection persists across page reloads (it is stored in the DSH user-settings document)

Troubleshooting

[UNRESOLVED_ENTRY] Cannot resolve entry module lib/types/index.js

This means tsdown ran before TypeScript emitted lib/types/index.js — i.e. tsc -b did not compile this package. The DSH build compiles first (tsc -b emits lib/types/*.js) and bundles second (tsdown reads those files). The two usual causes:

  1. The package is not a project reference. Add { "path": "./packages/client/dsh-theme-colorizer" } to the references array of tsconfig.client.json (Method B, Step 2), then run pnpm run build:lib:client.
  2. tsdown ran directly. Run the full pipeline — pnpm run build:lib:client — instead of tsdown / pnpm run bundle alone. After a successful build, packages/client/dsh-theme-colorizer/lib/types/ should contain index.js, invariant.js, and client/index.js.

cannot get property "theme" without inject

The client half accesses ctx.theme but the plugin's Cordis inject array omitted 'theme'. Cordis refuses to hand out a provided service that was not injected. The plugin declares inject = ['slots', 'locale', 'connection', 'remote', 'settingsScope', 'theme'] — keep 'theme' in that list.

ERR_PNPM_WORKSPACE_PKG_NOT_FOUND when installing

The installable manifest must not carry workspace:^ ranges — those only resolve inside the harness workspace. The bundle's package.json deliberately declares no runtime dependencies: every @deepseek-ai/* import is an in-box package served by the $DSH_HOME/profiles/node_modules fallback at runtime, and clsx is inlined into the browser bundle.

ENOENT: scandir '\E:\...' when using a file: spec

pnpm on Windows mangles drive-letter paths in file: specs. Install from a packed tarball instead (Method A, step 3).

Nothing changes after picking a theme

  • Check the browser console for the "cannot get property" error above (stale bundle: rebuild and re-sync lib/).
  • Confirm the settings row appears: the composition must contain the theme-colorizer row (dsh --profile web --dump-config). If you installed with Method A, do not also keep a theme-colorizer row in packages/bundle/web-app/cordis.patch.yml — a duplicate row id fails the load.

File structure

dsh-theme-colorizer/
package.json              # Bundle + client manifest (dsh.bundle / dsh.client), no runtime deps
cordis.patch.yml          # Bundle patch: inserts the theme-colorizer row
tsconfig.json             # TypeScript config (extends tsconfig.base.client.json, used for the harness build)
tsdown.config.ts          # Build config using the shared clientBundle preset (harness build only)
lib/                      # Built output (copied from the harness build before packing)
index.js                # Host-side entry (bundled)
invariant.js            # Companion entry (bundled)
client.js               # Browser bundle
types/                  # Emitted declarations
src/
index.ts                # Host-side entry: inert apply (persistence is client-side)
invariant.ts            # Companion plugin for invariant checks
theme-color-settings.ts # Shared constants, types, and the localStorage key
css-modules.d.ts        # Type declarations for CSS Module imports
client/
index.ts              # Client-side entry: reads/persists theme, applies overrides, registers row
color-themes.ts       # Theme definitions (token overrides for each color theme)
ThemeColorRow.tsx      # React component for the settings row
ThemeColorRow.module.css # Styles for the settings row
locales.ts            # i18n strings (zh/en)
README.md                 # This file

Known Limitations and Deferred Work

  • Color theme does not affect the scrollbar or code-highlighting colors — those are styled by separate stylesheets (scrollbar.css, shiki.css) that use their own token sets. A future version could override those tokens as well.
  • Persistence is per-browser — the choice lives in localStorage, so it does not follow the user across machines or browsers. The DSH settings document would be the natural home, but the Host API gateway does not expose plugin-owned settings namespaces yet (settings-not-exposed is a deliberate allowlist boundary; see WEB_SETTINGS_NAMESPACES in the apiproxy). If the harness adds plugin-owned exposure, migrate the persistence to the settings seam.
  • No custom theme authoring — the five themes are built in. A future version could allow users to define custom themes.
  • The active theme is not reflected in the initial HTML bootstrap — the first paint before the client plugin tree activates uses the default theme. The built-in theme bootstrap (boot-theme.ts) only handles the light/dark/system preference. A future version could also embed the color-theme tokens in the bootstrap script.

常见问题

7 问
答案由本站依据条目字段整理,不引用上游原文
dsh-theme-colorizer 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:RealHacker/dsh-theme-colorizer` 即可。

dsh-theme-colorizer 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-theme-colorizer 安全吗?

低风险。vet 静态分析未发现可疑行为,判定为干净(clean)。

dsh-theme-colorizer 支持哪些 DSH 版本?

上游记录的兼容版本包括 0.2.0-rc.2、0.2.0-rc.1、0.1.7-rc.2、0.1.6-alpha.2、0.1.6-alpha.1、0.1.5-rc.2、0.1.3-alpha.2、0.1.3-alpha.1。版本较多,只列出前 8 个。

dsh-theme-colorizer 用的是什么许可证?

上游标注为 NOASSERTION。商用或二次分发前请到仓库确认许可证原文。

dsh-theme-colorizer 有哪些功能?

5 种颜色主题、设置页集成、偏好持久化、与明暗模式叠加。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

UI 与外观
按星标排序,可作替代方案

awesome-dsh-plugin

awesome-dsh-plugin

A curated list of plugins for DeepSeek Harness (dsh) · DeepSeek Harnes

L4 · 沙盒安装通过 1.8 万 星

deepseek-balance-whale-widget

DeepSeek-Balance-Whale-Widget

DSH 界面右下角的常驻小鲸鱼余额挂件,实时显示 DeepSeek 账户余额、今日已用与每轮对话消耗,支持拖拽吸附、Q 弹动画与音效,开箱即

L4 · 沙盒安装通过 4,492 星

dsh-better-sidebar

DSH-better-sidebar

面向 DeepSeek Harness 的服务化侧边栏工作台插件,把文件编辑、终端、Git 变更、子代理任务与侧边对话整合进右侧栏与底部面板

L4 · 沙盒安装通过 4,112 星

dsh-deep-whale

dsh-deep-whale

DSH Web 鲸鱼娘皮肤系列(深海女仆工坊 maid-atelier)。

L4 · 沙盒安装通过 2,470 星

deepseek-design

deepseek-design

可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。

L4 · 沙盒安装通过 1,438 星

superdesign-skill

superdesign-skill

Superdesign为DeepSeek Harness等编码代理提供设计判断力,将AI生成的平庸UI转化为可交付的精致前端,支持设计系统、

L3 · 安装规范通过 647 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 2026-10-08。