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

皮肤工坊 mysn777/dsh-skin-kit

DeepSeek Harness
mysn77776 天前有提交已提供中文文档扫描:含敏感能力

一键换肤并实时调节壁纸与配色参数

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

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

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add mysn777/dsh-skin-kit
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-skin-kit(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=18.17 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/17 15:06:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 71 处,展示前 56 条)
  • 发起网络请求
    lib/client.js:1076
    return fetch(SKIN_KIT_API + path, { credentials: 'same-origin' }).then(function (res) {
  • 发起网络请求
    lib/client.js:1083
    return fetch(SKIN_KIT_API + path, {
  • 发起网络请求
    lib/client.js:1101
    return fetch(SKIN_KIT_API + '/wallpaper' + query, {
  • 写入本地文件
    bin/dsh-skin-kit.mjs:321
    writeFileSync(out, `${JSON.stringify(pack, null, 2)}\n`, 'utf8');
  • 读取本地文件
    bin/dsh-skin-kit.mjs:330
    const pack = JSON.parse(readFileSync(resolve(process.cwd(), file), 'utf8'));
  • 读取本地文件
    src/host/index.mjs:49
    return JSON.parse(readFileSync(join(here, '..', '..', 'package.json'), 'utf8')).version ?? '?';
  • 读取本地文件
    src/host/index.mjs:327
    size = statSync(found.file).size;
  • 读取本地文件
    src/host/index.mjs:339
    createReadStream(found.file).pipe(res);
  • 读取本地文件
    src/host/index.mjs:367
    const stat = statSync(file);
  • 读取本地文件
    src/host/index.mjs:380
    createReadStream(file).pipe(res);
  • 执行外部命令固定命令
    src/diy.mjs:27
    const probe = spawnSync('ffmpeg', ['-version'], { stdio: 'ignore' });
  • 执行外部命令固定命令
    src/diy.mjs:36
    const result = spawnSync('ffmpeg', args, {
  • 读取本地文件
    src/diy.mjs:165
    if (!existsSync(file)) throw new Error(`找不到素材文件:${file}`);
  • 读取本地文件
    src/diy.mjs:167
    const originalBytes = statSync(file).size;
  • 读取本地文件
    src/diy.mjs:190
    report.optimizedBytes = statSync(out.file).size;
  • 读取本地文件
    src/diy.mjs:214
    const bytes = readFileSync(payloadPath);
  • 删除本地文件递归
    src/diy.mjs:215
    if (tempDir) rmSync(tempDir, { recursive: true, force: true });
  • 写入本地文件
    src/diy.mjs:258
    writeFileSync(temp, bytes);
  • 删除本地文件递归
    src/diy.mjs:269
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    src/profile.mjs:39
    if (!existsSync(dir)) return [];
  • 读取本地文件
    src/profile.mjs:40
    return readdirSync(dir).filter((entry) => existsSync(join(dir, entry, 'package.json')));
  • 读取本地文件
    src/profile.mjs:40
    return readdirSync(dir).filter((entry) => existsSync(join(dir, entry, 'package.json')));
  • 读取本地文件
    src/profile.mjs:56
    if (!existsSync(file)) throw new Error(`profile ${profile} 不存在(找不到 ${file})`);
  • 读取本地文件
    src/profile.mjs:57
    return JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    src/profile.mjs:64
    if (existsSync(file)) {
  • 写入本地文件
    src/profile.mjs:67
    if (!existsSync(backup)) writeFileSync(backup, readFileSync(file));
  • 写入本地文件
    src/profile.mjs:71
    writeFileSync(tmp, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
  • 写入本地文件
    src/profile.mjs:72
    renameSync(tmp, file);
  • 删除本地文件
    src/profile.mjs:83
    rmSync(join(dir, victim));
  • 删除本地文件递归
    src/profile.mjs:93
    rmSync(target, { recursive: true, force: true });
  • 写入本地文件
    src/profile.mjs:94
    mkdirSync(dirname(target), { recursive: true });
  • 写入本地文件
    src/profile.mjs:113
    mkdirSync(nm, { recursive: true });
  • 删除本地文件递归
    src/profile.mjs:115
    rmSync(link, { recursive: true, force: true });
  • 删除本地文件递归
    src/profile.mjs:170
    rmSync(link, { recursive: true, force: true });
  • 删除本地文件递归
    src/profile.mjs:171
    if (!keepData) rmSync(join(home, 'skin-kit'), { recursive: true, force: true });
  • 删除本地文件递归
    src/profile.mjs:172
    else rmSync(pluginDir(home), { recursive: true, force: true });
  • 读取本地文件
    src/store.mjs:84
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/store.mjs:84
    if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/store.mjs:91
    writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
  • 写入本地文件
    src/store.mjs:92
    renameSync(tmp, file);
  • 读取本地文件
    src/store.mjs:97
    return JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    src/store.mjs:184
    if (!existsSync(dir)) return [];
  • 读取本地文件
    src/store.mjs:186
    for (const entry of readdirSync(dir)) {
  • 读取本地文件
    src/store.mjs:190
    const recipe = normalizeRecipe({ ...JSON.parse(readFileSync(file, 'utf8')), builtin });
  • 读取本地文件
    src/store.mjs:231
    if (!existsSync(file)) return false;
  • 删除本地文件
    src/store.mjs:232
    rmSync(file);
  • 写入本地文件
    src/store.mjs:251
    if (!existsSync(file)) writeFileSync(file, bytes);
  • 删除本地文件
    src/store.mjs:336
    rmSync(join(dir, entry));
  • 读取本地文件
    src/build.mjs:54
    parts.push(deEsm(readFileSync(join(root, file), 'utf8'), file));
  • 读取本地文件
    src/build.mjs:57
    parts.push(deEsm(readFileSync(join(root, CLIENT), 'utf8'), CLIENT));
  • 写入本地文件
    src/build.mjs:92
    mkdirSync(dirname(target), { recursive: true });
  • 读取本地文件
    src/build.mjs:95
    previous = readFileSync(target, 'utf8');
  • 写入本地文件
    src/build.mjs:100
    writeFileSync(target, source, 'utf8');
  • 发起网络请求
    src/client/main.js:195
    return fetch(SKIN_KIT_API + path, { credentials: 'same-origin' }).then(function (res) {
  • 发起网络请求
    src/client/main.js:202
    return fetch(SKIN_KIT_API + path, {
  • 发起网络请求
    src/client/main.js:220
    return fetch(SKIN_KIT_API + '/wallpaper' + query, {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 一键换肤
  • 实时调节壁纸配色
  • 图片视频DIY皮肤

DeepSeek Harness 皮肤工具箱,内置 10 款壁纸,支持实时调参和图片/视频 DIY 皮肤。

README

由 DeepSeek 最新模型翻译生成
dsh-skin-kit 给 DeepSeek Harness(DSH)换皮肤的工具箱。装一次,之后全在界面里点。 English · 功能规划与架构 · 做自己的皮肤 · 故障排查 Node.js >=18.17 License: MIT DSH Desktop using the Glacier River default wallpaper 它能做什么 - 十套内置壁纸皮肤,一张壁纸对应一套完整配色:云海星球、比奇堡晴日、白崖小径、冷峻次元、冰川河谷、暮色湖灯、海岸霓虹、海边书屋、富士夜色、晴空仰望。 - 换皮肤不用重启。点一下卡片,界面立刻变。 - 三个滑杆实时调参:主界面面板不透明度、壁纸模糊、壁纸亮度。点击「设置」打开的整个对话框固定为 70%,设置之外的主界面仍可自由调节。 - 自己的图片或视频一键变皮肤。每次上传都会新增一张皮肤卡;mp4/webm 保留原始画质和帧率,ffmpeg 只负责取色,图片和其他视频格式才做必要优化。 - 调好的皮肤能打包分享。导出一个 .dshskin 文件,配色、参数、壁纸都在里面,别人导入就是一模一样的效果。 - 体检和安全卸载。DSH 有个坑:profile 里列了却解析不到的插件会让它直接启动不了。doctor 专治这个,包括别人留下的悬空依赖。
展开完整文档(README 剩余 1 节)
dsh-skin-kit

给 DeepSeek Harness(DSH)换皮肤的工具箱。装一次,之后全在界面里点。

English · 功能规划与架构 · 做自己的皮肤 · 故障排查

Node.js >=18.17 License: MIT

DSH Desktop using the Glacier River default wallpaper

它能做什么

- 十套内置壁纸皮肤,一张壁纸对应一套完整配色:云海星球、比奇堡晴日、白崖小径、冷峻次元、冰川河谷、暮色湖灯、海岸霓虹、海边书屋、富士夜色、晴空仰望。
- 换皮肤不用重启。点一下卡片,界面立刻变。
- 三个滑杆实时调参:主界面面板不透明度、壁纸模糊、壁纸亮度。点击「设置」打开的整个对话框固定为 70%,设置之外的主界面仍可自由调节。
- 自己的图片或视频一键变皮肤。每次上传都会新增一张皮肤卡;mp4/webm 保留原始画质和帧率,ffmpeg 只负责取色,图片和其他视频格式才做必要优化。
- 调好的皮肤能打包分享。导出一个 .dshskin 文件,配色、参数、壁纸都在里面,别人导入就是一模一样的效果。
- 体检和安全卸载。DSH 有个坑:profile 里列了却解析不到的插件会让它直接启动不了。doctor 专治这个,包括别人留下的悬空依赖。

快速开始

装进 DSH(默认桌面端 profile,其次 web)
npx github:mysn777/dsh-skin-kit install

重启一次 DSH,然后打开 设置 →「皮肤工坊」

不想开界面也行:

npx github:mysn777/dsh-skin-kit list # 看有哪些皮肤
npx github:mysn777/dsh-skin-kit use fuji-night # 换皮肤
npx github:mysn777/dsh-skin-kit set alpha=0.5 blur=12

把自己的素材变成皮肤:

dsh-skin-kit diy ./我的壁纸.jpg --name "我的皮肤" dsh-skin-kit diy ./城市夜景.mp4 --name "夜行" # 视频动态壁纸也行

需要更多静态或动态壁纸,可浏览哲风壁纸。它是独立第三方网站,与本项目不存在隶属、合作或授权代理关系。本项目不镜像或再分发该站素材;下载和使用前请确认具体素材许可,并遵守网站用户协议及原作者权利。

需要 Node.js ≥ 18.17。不需要 pnpm,也不需要任何构建工具——绝大多数 DSH 桌面端用户机器上没有 pnpm,所以这个工具自己完成 profile 接线。
ffmpeg 是可选的:装了可自动取色、优化图片并转换非 mp4/webm 视频;直传 mp4/webm 不转码。

十套内置皮肤

| id | 名称 | 风格 |
| bikini-breeze | 比奇堡晴日 | 明亮海蓝、珊瑚橙点缀 |
| chalk-cliffs | 白崖小径 | 海岸草坡、温柔浅色 |
| cloud-orbit | 云海星球 | 黑色太空、蓝色地球 |
| cold-anime | 冷峻次元 | 雪原灰蓝、冰蓝高光 |
| fuji-night | 富士夜色 | 深蓝山影、暖光小店 |
| glacier-river | 冰川河谷 | 雪山河流、青绿冷色 |
| ocean-avenue | 海岸霓虹 | 紫红晚霞、街头路牌 |
| seaside-study | 海边书屋 | 晴海书亭、暖木点缀 |
| skyward-blue | 晴空仰望 | 蓝天树影、清透浅蓝 |
| twilight-lake | 暮色湖灯 | 蓝调湖面、暖色路灯 |

十套内置皮肤和今后新建的图片/视频 DIY 皮肤统一默认:主界面不透明度 15%、模糊 0px、壁纸亮度 100%。这组值不模糊、不增减原片亮度,并尽量少遮挡壁纸;手动参数仍可覆盖。

命令一览

| 命令 | 作用 |
| install [--profile ] | 装进 DSH profile |
| uninstall [--purge] | 卸载;--purge 连皮肤和壁纸数据一起删 |
| doctor [--fix] | 体检所有 profile,找出会让 DSH 起不来的条目 |
| list | 列出皮肤和当前状态 |
| use | 换皮肤 / 关掉皮肤 |
| set alpha=.. blur=.. brightness=.. | 调参数 |
| diy | 生成一套自己的皮肤 |
| export [id] [--out 文件] | 导出 .dshskin |
| import | 导入 .dshskin |
| prune | 清理没人引用的壁纸文件 |

通用参数:--home 指定 DSH home(默认 $DSH_HOME 或 ~/.dsh),--json 输出机器可读结果。

它怎么工作

dsh-skin-kit(一个包,三重身份) ├─ CLI 装/卸/体检/DIY/导入导出 ├─ DSH host 半 /api/skin-kit/* 路由 + 配置读写 + 壁纸伺服 └─ DSH client 半 套用皮肤 + 「皮肤工坊」设置分区

三个值得说的设计:

皮肤改的是设计令牌,不是类名。 DSH 前端所有颜色都读 --dsw- CSS 变量,本工具覆盖其中全部 80 个。相比去命中 .pI_x6G_frame 这种构建期哈希类名,DSH 升级后不容易碎。
壁纸走 HTTP 路由,不塞进 JS。 用户上传的素材走 /api/skin-kit/wallpaper/,文件在 ~/.dsh/skin-kit/wallpapers/;随包默认壁纸走 /api/skin-kit/asset/,文件在插件的 skins/assets/。这样不会把图片或视频膨胀进 client.js。

随包资产单文件上限 600KB。 npm test 会扫描 skins/assets/,任何文件超限都直接失败。原因不是浏览器加载不了,而是项目要保持 npx github: 首次拉取够快;十张图如果不设闸门,很容易把一个轻量插件拖成几十 MB。

CSS 在浏览器里现算。 皮肤编译器是纯函数,客户端自带一份,所以换皮肤和拖滑杆都不用等服务端往返。三个实时参数还进一步做成 CSS 变量(--dsk-alpha / --dsk-blur / --dsk-brightness),拖滑杆连样式表都不用重写,只改一个变量。

用户数据都在 ~/.dsh/skin-kit/ 下:config.json(当前皮肤和参数)、skins/.json(自建皮肤)、wallpapers/(用户壁纸原文件)。十张默认壁纸随插件副本安装,不混进用户数据。

隐私与故障排查

所有图片、视频、取色和压缩都在本机完成,不会上传到 dsh-skin-kit 或哲风壁纸。遇到安装、profile、ffmpeg 或视频播放问题,请先看故障排查。安全漏洞请按 SECURITY.md 私密报告,不要直接贴到公开 Issue。

开发

npm test # 58 条用例:编译器、profile 接线、HTTP 路由、客户端 DOM 行为
npm run build # 重新生成 lib/client.js(改了 src/ 就要跑)

lib/client.js 是构建产物但要提交进仓库——用户是直接从仓库装的,不会自己构建。有一条用例专门比对它和源码是否同步。

版本记录见 CHANGELOG.md。

许可

代码使用 MIT 许可。十张随包壁纸不自动继承 MIT,来源和允许范围见 ASSET_LICENSE.md 与 skins/assets/README.md。
预览分享卡片长什么样 ↓mysn777/dsh-skin-kit
分享 · DeepSeek Harness Hub
mysn777/dsh-skin-kit

一键换肤并实时调节壁纸与配色参数

这是你的仓库?认领条目

回到顶部