在设置里预览并一键换装界面主题
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 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 79 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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 和 第三方声明 中;项目许可证不会替代主题各自的许可证。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
huyansheng3/dsh-skin
在设置里预览并一键换装界面主题
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,344已汉化DSH
71.5
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,045已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,202已汉化DSH
71.1