🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

原生皮肤库 huyansheng3/dsh-skin

DeepSeek 客户端
huyansheng379 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

在设置里预览并一键换装界面主题

27.4/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/huyansheng3/dsh-skin.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 79 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 66 处,展示前 37 条)
  • 读取本地文件
    src/index.js:152
    const data = readFileSync(theme.backgroundPath);
  • 读取本地文件
    src/index.js:283
    for (const entry of readdirSync(root, { withFileTypes: true })) {
  • 写入本地文件
    src/index.js:359
    writeFileSync(tempPath, file.data);
  • 删除本地文件
    src/index.js:376
    unlinkSync(tempPath);
  • 读取本地文件
    src/index.js:460
    const data = readFileSync(theme.backgroundPath);
  • 读取本地文件
    src/index.js:486
    const data = readFileSync(theme.backgroundPath);
  • 发起网络请求
    lib/client.js:128
    const data = await readJson(await fetch(`${API_PATH}/themes`, { headers: { Accept: "application/json" } }));
  • 发起网络请求
    lib/client.js:148
    const data = await readJson(await fetch(`${API_PATH}/activate`, {
  • 发起网络请求
    lib/client.js:170
    const imported = await readJson(await fetch(`${API_PATH}/import`, { method: "POST", body: form }));
  • 读取本地文件
    src/lib/theme-manager.mjs:85
    if (!existsSync(manifestPath)) throw new Error(`Missing manifest.json in ${themeDir}`);
  • 读取本地文件
    src/lib/theme-manager.mjs:86
    if (!existsSync(themeJsonPath)) throw new Error(`Missing theme.json in ${themeDir}`);
  • 读取本地文件
    src/lib/theme-manager.mjs:88
    const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
  • 读取本地文件
    src/lib/theme-manager.mjs:89
    const themeJson = JSON.parse(readFileSync(themeJsonPath, "utf-8"));
  • 读取本地文件
    src/lib/theme-manager.mjs:124
    if (existsSync(p)) { hasBackground = true; backgroundPath = p; }
  • 读取本地文件
    src/lib/theme-manager.mjs:130
    if (existsSync(p)) { hasBackground = true; backgroundPath = p; }
  • 写入本地文件
    src/lib/theme-manager.mjs:190
    mkdirSync(themesDir, { recursive: true });
  • 删除本地文件递归
    src/lib/theme-manager.mjs:198
    if (existsSync(destDir)) rmSync(destDir, { recursive: true, force: true });
  • 写入本地文件
    src/lib/theme-manager.mjs:200
    mkdirSync(destDir, { recursive: true });
  • 写入本地文件
    src/lib/theme-manager.mjs:202
    copyFileSync(join(srcDir, file), join(destDir, file));
  • 执行外部命令固定命令
    src/lib/theme-manager.mjs:236
    entries = execFileSync("unzip", ["-Z1", zipPath], { encoding: "utf-8" })
  • 写入本地文件
    src/lib/theme-manager.mjs:246
    mkdirSync(tmpDir, { recursive: true });
  • 执行外部命令固定命令
    src/lib/theme-manager.mjs:249
    execFileSync("unzip", ["-o", "-q", "-d", tmpDir, zipPath], { stdio: "pipe" });
  • 删除本地文件递归
    src/lib/theme-manager.mjs:251
    rmSync(tmpDir, { recursive: true, force: true });
  • 删除本地文件递归
    src/lib/theme-manager.mjs:258
    rmSync(tmpDir, { recursive: true, force: true });
  • 删除本地文件递归
    src/lib/theme-manager.mjs:264
    rmSync(tmpDir, { recursive: true, force: true });
  • 写入本地文件
    src/lib/theme-manager.mjs:267
    writeFileSync(join(themeRoot, "theme.css"), compatibilityCss, "utf-8");
  • 删除本地文件递归
    src/lib/theme-manager.mjs:273
    rmSync(tmpDir, { recursive: true, force: true });
  • 删除本地文件递归
    src/lib/theme-manager.mjs:278
    rmSync(tmpDir, { recursive: true, force: true });
  • 写入本地文件
    src/lib/theme-manager.mjs:380
    mkdirSync(dirname(p), { recursive: true });
  • 读取本地文件
    src/cli/dsh-skin.mjs:137
    if (!srcDir || !existsSync(srcDir)) {
  • 读取本地文件
    src/cli/dsh-skin.mjs:147
    if (existsSync(cssPath)) {
  • 读取本地文件
    src/cli/dsh-skin.mjs:148
    const { valid, errors } = validateSafeCss(readFileSync(cssPath, "utf-8"));
  • 读取本地文件
    src/cli/dsh-skin.mjs:172
    if (!existsSync(absPath)) {
  • 读取本地文件
    src/cli/dsh-skin.mjs:259
    if (!srcDir || !existsSync(srcDir)) {
  • 发起网络请求
    src/client/index.js:123
    const data = await readJson(await fetch(`${API_PATH}/themes`, { headers: { Accept: "application/json" } }));
  • 发起网络请求
    src/client/index.js:143
    const data = await readJson(await fetch(`${API_PATH}/activate`, {
  • 发起网络请求
    src/client/index.js:165
    const imported = await readJson(await fetch(`${API_PATH}/import`, { method: "POST", body: form }));
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 预览界面主题
  • 一键换装主题

README

由 DeepSeek 最新模型翻译生成
dsh-skin CI License: MIT Node.js >= 18 dsh-skin 是 DeepSeek Harness Web 的原生 Cordis 皮肤插件。主题选择、图片预览和 ZIP 导入直接集成在 Harness 自带的“设置 > 皮肤库”中,不修改 DSH 安装包,也不需要浏览器扩展或 CDP 注入器。 已在 @deepseek-ai/dsh@0.1.0-rc.6 的 Web profile 中验证。 效果预览 以下截图来自真实的 DSH Web 会话,皮肤库使用每套主题自己的背景图作为可直接应用的预览。 | 原生皮肤设置 | 金陵晴川 | | 原生皮肤库中的图片预览和 ZIP 导入 | 金陵晴川明亮主题 | | 安静氛围森林 | Gothic Void Crusade | | 安静氛围森林主题 | Gothic Void Crusade 暗色主题 | 快速安装 前置条件:已安装 DeepSeek Harness,终端中可以运行 dsh,Node.js 版本不低于 18。
展开完整文档(README 剩余 1 节)
dsh-skin

CI
License: MIT
Node.js >= 18

dsh-skin 是 DeepSeek Harness Web 的原生 Cordis 皮肤插件。主题选择、图片预览和 ZIP 导入直接集成在 Harness 自带的“设置 > 皮肤库”中,不修改 DSH 安装包,也不需要浏览器扩展或 CDP 注入器。

已在 @deepseek-ai/dsh@0.1.0-rc.6 的 Web profile 中验证。

效果预览

以下截图来自真实的 DSH Web 会话,皮肤库使用每套主题自己的背景图作为可直接应用的预览。

| 原生皮肤设置 | 金陵晴川 |
| 原生皮肤库中的图片预览和 ZIP 导入 | 金陵晴川明亮主题 |
| 安静氛围森林 | Gothic Void Crusade |
| 安静氛围森林主题 | Gothic Void Crusade 暗色主题 |

快速安装

前置条件:已安装 DeepSeek Harness,终端中可以运行 dsh,Node.js 版本不低于 18。

dsh plugin --profile web add github:huyansheng3/dsh-skin
dsh web

当前 main 安装包内置 15 套指定 Gallery 主题和 4 套项目主题;它们会自动出现在皮肤下拉框中,但首次安装仍保持“官方外观”,不会自动激活社区主题。

打开 DSH Web 页面后,进入 设置 > 皮肤库:

1. 点击任一预览图即可立即应用对应主题;
2. 点击“导入 ZIP”安装自己的 DreamSkin 主题;
3. 点击“官方外观”即可停用皮肤。

导入主题不会自动激活。若 dsh web 已经在运行,安装或升级插件后请重启服务。

升级与卸载

升级到当前 main 分支:

dsh plugin --profile web add github:huyansheng3/dsh-skin

卸载:

dsh plugin --profile web remove dsh-skin

从本地源码安装

适合开发或离线环境:

git clone https://github.com/huyansheng3/dsh-skin.git
cd dsh-skin
npm run build
dsh plugin --profile web add "$PWD"
dsh web

源码仓库已经包含随包的 19 套指定主题。需要把本地开发库扩展到审计保留的 76 套时,再执行 npm run vendor:gallery:

npm run vendor:gallery
DSH_SKIN_GALLERY_DIR="$PWD/gallery/themes" dsh web

vendor:gallery 从 DreamSkin Gallery 热门前 100 的冻结审计中排除 24 个源可读性不合格主题,再按 精选目录 下载并校验剩余 76 个具体版本,在项目的 gallery/themes/ 中生成本地内置主题库。运行时不会联网,也不会自动切换当前主题。已有 ZIP 缓存可用于完全离线物化:

npm run vendor:gallery -- --cache-dir /path/to/cache --offline

Gallery 包由社区作者发布,并不统一使用 MIT 许可。发布包只收录项目维护者指定的 15 个 Gallery 主题,目录记录每个版本的作者、发行者声明的许可、体积和 SHA-256;随包背景以不裁切、不调色的高质量 WebP 分发,将 GitHub 安装包控制在约 6.5 MB。主题归属、许可和重编码说明见 第三方声明。

功能

- 原生设置集成:独立“皮肤库”Tab,不创建额外路由、浮动按钮或 iframe;
- 图片预览:所有带背景的主题均以同源受限图片路由呈现缩略图,点击即可应用;
- 即时切换:设置成功后刷新主题 stylesheet,不替换 Harness DOM;
- 内置主题:发布包自带 4 套项目主题和 15 套指定 Gallery 主题;源码可物化 76 套;
- ZIP 导入:兼容 DreamSkin 与 legacy DSH 主题格式;
- Safe CSS:拒绝脚本、@import、危险 URL 和未经授权的布局覆盖;
- 作者保真:保留主题原始配色、玻璃透明度和自定义 CSS,不在运行时强制修色;
- 定点可读性:仅让原生代码块、行内代码和不透明控件使用作者的实色面板 token,并让侧栏展开/收起图标使用作者主文字色;不覆盖正文颜色、不加全局遮罩;
- Headless 安全:没有 webServer 时插件保持 no-op。

常见问题

设置中没有“皮肤”选项

确认插件安装在 web profile,而不是默认或其他 profile:

dsh plugin --profile web list --depth 0

列表中应包含 dsh-skin。随后停止并重新运行 dsh web。

页面仍显示旧主题

先刷新浏览器。仍未更新时,重启 dsh web;插件会用 theme@version:revision 缓存键刷新样式资源。

ZIP 导入失败

DreamSkin ZIP 必须包含 manifest.json、theme.json、非空 theme.css 和清单中一张声明的背景图。插件还会检查文件哈希、路径穿越、条目数量、压缩大小和解压大小。
完整格式见 主题规范。

固定主题后不能在页面切换

部署配置中的 activeTheme 会锁定页面选择器。删除该配置,或改用 defaultTheme 只设置首次默认主题。

工作方式

DSH Web Loader
+-- dsh-skin Host
| +-- tapIndex() 注入 /_skin/active.css
| +-- /_skin/bg/* 提供当前背景图
| +-- /_skin/api/* 提供主题查询、切换和 ZIP 导入
+-- dsh-skin Client
+-- settings.section 提供原生“皮肤库”Tab

Host 始终注入一个带缓存版本的 stylesheet link。带图主题由 body::before 绘制
pointer-events: none 的背景层,原生 UI、弹窗和 portal 仍由 DSH 管理。插件不会修改 API Key、Base URL 或官方安装包,也不会在运行时下载网络资源或启动外部常驻进程。只有开发者显式执行 vendor:gallery 时才会访问 Gallery 官方 API。

架构和生命周期详见 架构说明。

配置

仓库自带的 cordis.patch.yml 只注册插件,不默认激活主题。
部署方需要固定主题时,可以在额外 patch 中配置:

- id: dsh-skin
name: dsh-skin
config:
activeTheme: gothic-void-crusade

DSH 的 id-targeted patch 会替换整行而不是深合并,因此覆盖时要同时保留 name: dsh-skin。

| 字段 | 行为 |
| enabled: false | 禁用主题 CSS 和页面修改能力 |
| activeTheme | 固定主题并锁定页面选择 |
| defaultTheme | 仅在从未保存过选择时使用;显式“官方外观”优先 |

CLI

CLI 与 Web 设置读取同一个本地主题库:

dsh-skin install ./my-theme
dsh-skin import ./my-theme.zip
dsh-skin list
dsh-skin activate my-theme
dsh-skin deactivate
dsh-skin info my-theme
dsh-skin remove my-theme
dsh-skin pack ./my-theme

CLI 修改选择后需要刷新页面;页面设置内的切换会立即刷新 stylesheet。内置主题不复制到用户主题库,因此 CLI 的 list、info 和 activate 只管理已安装主题。

主题格式

推荐使用 DreamSkin 格式:

{
"packageVersion": 1,
"themeId": "my-theme",
"name": "My Theme",
"version": "1.0.0",
"files": [
{ "path": "theme.json", "mediaType": "application/json" },
{ "path": "theme.css", "mediaType": "text/css" },
{ "path": "background.jpg", "mediaType": "image/jpeg" }
]
}

{
"appearance": "dark",
"colors": {
"background": "#1e1e2e",
"panel": "#313244",
"panelAlt": "#45475a",
"accent": "#cba6f7",
"accentAlt": "#b4befe",
"text": "#cdd6f4",
"muted": "#a6adc8",
"line": "#45475a",
"highlight": "#585b70"
},
"art": { "focusX": 0.5, "focusY": 0.4, "taskMode": "fill" },
"backgroundOpacity": 1,
"backgroundBlur": 0
}

目录安装允许不带背景图或自定义 CSS。从 ZIP 导入 DreamSkin 时,必须同时包含清单声明的背景图和非空 theme.css。Legacy DSH schema: 1 格式继续用于已有本地主题。
完整字段与安全约束见 主题规范。

主题库位置

| 平台 | 路径 |
| macOS | ~/Library/Application Support/DSHSkin/themes/ |
| Linux | ~/.local/share/dsh-skin/themes/ |
| Windows | %LOCALAPPDATA%\\DSHSkin\\themes\\ |

测试可设置 DSH_SKIN_DATA_DIR 使用隔离的数据目录。
随安装包提供的 15 套 Gallery 主题位于 gallery/themes/,DSH 进程会自动发现。
DSH_SKIN_GALLERY_DIR=/absolute/path/to/gallery/themes 仅用于覆盖安装包内的默认目录,
例如加载开发机物化的 76 套主题。用户主题始终优先于同 ID 的 Gallery 主题,物化和扫描过程都不会改写 state.json。

开发

npm test
node --check src/index.js src/client/index.js src/lib/theme-manager.mjs
npm pack --dry-run

发布维护者需要重新生成随包背景时,安装 cwebp 后运行
npm run optimize:gallery;该命令不会在用户安装插件时执行。

Gallery 兼容性结果见 审计报告。热门前 100 中有 93 个原包通过严格 ZIP 导入,另 7 个缺少 theme.css,本地物化时使用有界兼容 CSS。24 个可导入主题因原始文字或强调色对比度不足,已由 排除清单从默认目录和本地主题库删除。剩余 76 个已在真实长会话中逐个完成背景安全、原生控件和溢出 E2E 检查;不透明文字表面低于 3:1 会直接失败,普通壁纸区域仍只报告作者效果告警。3 条不同的现有会话均逐个复验 76 套主题,结果都是 76/76 结构通过。

许可证

MIT。发布包自带第三方主题的作者与许可证记录在各自 manifest.json 和 第三方声明 中;项目许可证不会替代主题各自的许可证。
预览分享卡片长什么样 ↓huyansheng3/dsh-skin
分享 · DeepSeek Harness Hub
huyansheng3/dsh-skin

在设置里预览并一键换装界面主题

回到顶部