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

皮肤中心 zhu1090093659/dsh-skins

DeepSeek Harnessv0.4.14
zhu10900936595 天前有提交已提供中文文档扫描:含敏感能力

DSH Web GUI 的皮肤中心插件与内置皮肤:皮肤就是纯资源目录,由皮肤中心加载渲染,按需从 dsh-market.com 安装。

50.9/100
综合分
30
GitHub 星标
45,467
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @linxin666/dsh-client-ui-skin-center
npm 源 · @linxin666/dsh-client-ui-skin-center 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · market
装得上吗
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

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

✓npm 包@linxin666/dsh-client-ui-skin-center @ 0.4.14
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖要求 >=0.2.1-rc.3 · 最新 0.2.1-rc.5 兼容
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 17:39:54

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 70 处,展示前 27 条)
  • 读取本地文件
    lib/index.js:263
    return createHash("sha256").update(readFileSync(abs)).digest("hex");
  • 读取本地文件
    lib/index.js:277
    raw = JSON.parse(readFileSync(join(dir, MARKET_PROVENANCE_FILENAME), "utf8"));
  • 读取本地文件
    lib/index.js:326
    raw = JSON.parse(readFileSync(join(dir, MARKET_PROVENANCE_FILENAME), "utf8"));
  • 读取本地文件
    lib/index.js:412
    for (const name of readdirSync(dir)) {
  • 读取本地文件
    lib/index.js:416
    const st = statSync(abs);
  • 读取本地文件
    lib/index.js:432
    const localDir = options.localSourceDir ?? (existsSync(join(import.meta.dirname, "..", "skins", skinId, "skin.json")) ? join(import.meta.dirname, ".."
  • 写入本地文件
    lib/index.js:437
    mkdirSync(destDir, { recursive: true });
  • 写入本地文件
    lib/index.js:442
    if (guard) mkdirSync(join(destDir, guard), { recursive: true });
  • 写入本地文件
    lib/index.js:455
    writeFileSync(join(destDir, MARKET_PROVENANCE_FILENAME), JSON.stringify(provenance, null, 2) + "\n");
  • 写入本地文件
    lib/index.js:479
    mkdirSync(tmp, { recursive: true });
  • 写入本地文件
    lib/index.js:489
    if (guard) mkdirSync(join(tmp, guard), { recursive: true });
  • 写入本地文件
    lib/index.js:490
    writeFileSync(target, buf);
  • 删除本地文件
    lib/index.js:502
    if (existsSync(destDir)) rmSync(destDir, {
  • 删除本地文件
    lib/index.js:522
    if (existsSync(tmp)) rmSync(tmp, {
  • 删除本地文件
    lib/index.js:1538
    rmSync(target, {
  • 删除本地文件
    lib/index.js:1692
    rmSync(tmpDir, {
  • 执行外部命令来自配置/变量
    lib/index.js:1894
    this.forkImpl = options.forkImpl ?? ((modulePath, forkOptions) => fork(modulePath, forkOptions));
  • 删除本地文件
    lib/index.js:3349
    rmSync(tmpDir, {
  • 删除本地文件
    lib/index.js:3357
    rmSync(tmpDir, {
  • 写入剪贴板
    lib/client.js:2215
    await navigator.clipboard.writeText(text);
  • 发起网络请求
    lib/client.js:2235
    fetch(EXTERNAL_WALLPAPER_API).then((res) => res.ok ? res.json() : null).then((payload) => {
  • 写入剪贴板
    lib/client.js:2404
    await navigator.clipboard.writeText(text);
  • 发起网络请求
    lib/client.js:3355
    const res = await fetch("/api/skin-center/v2/verify", {
  • 发起网络请求
    lib/client.js:3398
    const res = await fetch("/api/skin-center/v2/skins/versions", { cache: "no-store" });
  • 发起网络请求
    lib/client.js:3431
    if (!(await fetch(`/api/skin-center/v2/skins/${encodeURIComponent(id)}/repair`, { method: "POST" })).ok) failed++;
  • 发起网络请求
    lib/client.js:3489
    if (!(await fetch(`/api/skin-center/v2/skins/${encodeURIComponent(skin.manifest.id)}/uninstall`, { method: "POST" })).ok) failed++;
  • 发起网络请求
    lib/client.js:3513
    const res = await fetch(`/api/skin-center/v2/skins/${encodeURIComponent(id)}/uninstall`, {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-workspace-controller@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-theme@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

3 张 · 点击查看大图

功能亮点

  • 加载渲染皮肤
  • 按需安装皮肤
  • 内置皮肤资源
v0.4.132026-10-31
皮肤中心发布 0.4.13,沿用 dsh-web 家族的统一版本号。本版本主要解决 Windows 平台下 lightningcss 原生 addon 导致插件管理器重命名 EPERM 的缺陷,将 CSS 安全转换隔绝在短生命周期 worker 进程中执行,宿主半区不再直接加载原生模块;同时在语义属性契约中补齐内置插件分组与插件管理器的相关标记。 兼容性:本版本没有破坏性变更,无须手工迁移。包名 @linxin666/dsh-client-ui-skin-center 与安装方式保持不变;npm files 白名单仍只内置 blue-fantasy;dsh.engines.dsh 与 @deepseek-ai/dsh 对等依赖保持 >=0.2.1-rc.3。包根不再导出 CSS 转换函数,改为经由子路径 ./css-safety 导出,市场构建与 CLI 已同步适配。 · 修复 · CSS 安全转换在短生命周期 worker 进程中运行(66ec9f1):修复 Windows 下 lightningcss 原生 addon 映射进 DSH 宿主进程后阻断插件安装重命名、报错 [ERR_PNPM_EPERM] 的问题(issue #98)。宿主半区永不导入原生模块,样式表转换改由独立 worker 进程在 IPC 管道中串行执行,worker 在应答后立即退出,彻底解除对安装流程的文件占用 · 其他改动 · 契约补齐内置插件分组标记(07b684e):在 contracts/semantic-attrs-v1.md 补齐内置插件分组的展开/折叠控件与其所属 bundle 标记,并校正表格统计行数 · 契约补齐插件管理器语义属性(feca0b8):登记插件管理器在官方插件页注入的更新检查工具栏与内置插件分组相关语义属性 · 版本号推进至 0.4.13:跟随家族版本线统一发布,重新构建并校验 lib/ 产物 --- English The skin center publishes 0.4.13 on the family's shared version line. This release isolates CSS safety transforms inside short-lived worker processes to resolve Windows file-lock errors (EPERM) caused by lightningcss native addons during plugin installation, and registers semantic attribute contracts for the built-in plugin group and plugin manager surfaces. Compatibility: This release contains no breaking changes and requires no manual migration. The package name @linxin666/dsh-client-ui-skin-center and installation layout are unchanged; npm files still ships only blue-fantasy; dsh.engines.dsh and @deepseek-ai/dsh peer dependencies remain >=0.2.1-rc.3. The package root stops exporting the transform function in favor of the ./css-safety subpath export, which market builds and CLI scripts now target. · Bug Fixes · Isolate CSS safety transforms in short-lived worker processes (66ec9f1): Fixes issue #98 on Windows where lightningcss native addons mapped into the DSH host process blocked plugin manager package renames with [ERR_PNPM_EPERM]. The host process never loads native addons; transforms run serially in child worker processes over IPC and ex
v0.4.122026-10-29内容较长已截断
皮肤中心发布 0.4.12,沿用 dsh-web 家族的统一版本号。本版本收的是两件事:atelier 系列三处可见缺陷的修复(手机宽度下的主视觉、浅色主题底部座位的墨色、皮肤中心状态胶囊的对比度),以及 DIY手账本插画的个人非商业使用声明与对应证据。皮肤目录仍是 62 套,钩子记录与 npm 白名单都不动,包内照旧只内置 blue-fantasy。 兼容性:本版本没有破坏性变更,没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。以下标识是冻结的:包名 @linxin666/dsh-client-ui-skin-center;安装方式(dsh plugin --profile add 与 $DSH_HOME/skins/ 目录布局);npm files 白名单仍只内置 blue-fantasy;v2 活跃状态文档的持久化文件名与键名;data-dsh-skin、data-dsh-part 等语义属性名;线协议字段。dsh.engines.dsh 下限保持 >=0.2.1-rc.3 未动,与 0.4.11 一致。 · 修复 · 手机宽度下的 atelier 主视觉(83abadc):maid-atelier 与 phoebe-atelier 都照抄了宿主的桌面内容下限 --dsh-chat-content-width: clamp(560px, 41vw, 740px),它在 1366px 以下恒等于 560px,于是 390px 手机上的主视觉被排进 560px 的盒子:phoebe 的三栏标题把第三栏(预览徽标)压进标题里,maid 的徽标按 left: calc(100% + 8px) !important 挂在标题右缘之外、直接溢出视口。两套皮肤各自新增 @media (max-width: 480px) 块,把下限放开到 100%、给标题 min-width: 0,并让预览徽标改用自己的 max-width: 100% 摆放。做成一皮肤一块而不是共享样式表,因为皮肤是自包含的资产目录,共享表会把两个独立发布的皮肤耦在一起 · phoebe-atelier 底部座位的墨色(83abadc):浅色主题侧边栏改画象牙壁柱之后,底部座位 [data-slot='sidebar.footer.action'] 仍留着给已退役深蓝面板写的近白标签色,而座位是宿主的扩展边界、挂上去的卡继承它的文字而不是自绘,于是象牙底上落了瓷白字,实测 1.08:1。修法是把瓷白色板从座位根移到两个自绘深蓝盘面的叶子控件(设置触发器与 [data-cordis-badge]),座位根只保留表面、描边与悬停令牌、不再声明标签色,由 body:not([data-ds-dark-theme]) 作用域给它象牙底墨色(#17284f、#3a4361、#48526f、#56617c);深色主题仍是深蓝夜画廊,瓷白墨在那里本来就是对的 · 皮肤中心三个状态胶囊(83abadc):.badgeActive、.badgeTrying 与 .delegatedBadge 的文字取 --dsw-alias-brand-primary 与 --dsw-alias-state-success-primary 这类提示色,皮肤并不把这些令牌与标签令牌一起重映射,所以在 maid-atelier 或 phoebe-atelier 下胶囊留着宿主墨色、卡片正文却跟着皮肤走。三处文字改用 --dsw-alias-label-primary,语义绿与语义蓝只留在填充里,并且三个胶囊都补了 1px 令牌描边——只有委派胶囊原本带描边,另两个只靠填充对比度撑着,边缘在近似卡面的填充上会消失。深色主题的 trying 胶囊保留语义蓝,填充换成 --dsw-alias-state-business-tertiary,实测约 8.8:1(旧的中蓝盘面在真实 GUI 里只有 3.60:1) · maid-atelier 顶部饰带把页面撑出横向滚动(83abadc):hooks.mjs 追加的 body 级饰带横跨整个窗口,再按侧边栏宽度把自己向右平移,于是它自己的盒子越过视口一个侧边栏宽(390 视口配 52px 导轨时 x=52 / width=390 / right=442,1440 配 280px 侧边栏时 right=1720)。改成把饰带夹在侧边栏边缘与窗口右缘之间(left: var(--maid-sidebar-width, 280px)、right: 0、width: auto,去掉水平 translate),冠饰蝴蝶结的 left 计算同步减掉它过去重复扣的侧边栏宽度。下层仍按 repeat-x 铺满内容区,表面画法不变,也
v0.4.112026-10-27内容较长已截断
皮肤中心发布 0.4.11,沿用 dsh-web 家族的统一版本号。本版本把皮肤页挂进「Web 扩展」父页(PR #95),并把设置卡在宽容器里重排成两栏;皮肤目录、钩子记录与 npm 白名单都不动,62 套皮肤照旧只内置 blue-fantasy。除下面点名的座位变化外,没有对外承诺的变动。 兼容性:本版本没有破坏性变更,没有需要手工迁移的改动,没有重命名任何已持久化的标识符、线协议字段或 profile 格式。以下标识是冻结的:包名 @linxin666/dsh-client-ui-skin-center;安装方式(dsh plugin --profile add 与 $DSH_HOME/skins/ 目录布局);npm files 白名单仍只内置 blue-fantasy;v2 活跃状态文档的持久化文件名与键名;data-dsh-skin、data-dsh-part 等语义属性名;线协议字段。dsh.engines.dsh 下限保持 >=0.2.1-rc.3 未动,与 0.4.10 一致。「Web 扩展」父页缺席时,皮肤页仍是一级设置分区(id skin-center、order 120),独立安装看到的界面与 0.4.10 逐像素相同。 · 新功能 · 设置页挂进「Web 扩展」父页(79d1244,PR #95,作者 Nwflower):父页发布 webUiExtensions 服务时,皮肤页以 keyed 槽 web-ui.extension、key skin-center 注册进去,入口变成 设置 → Web 扩展 → 皮肤;服务缺席时回落到一级 settings.section 的 id skin-center、order 120(src/client/extension-seat.ts),独立安装保留原入口。迁移由一个槽变更对账循环独占,任何时刻只有一份存活条目,两个座位不会同时出现;keyed 注册不带 list 专属的 id、order 与 label。设置卡根暴露 data-dsh-plugin="skin-center",皮肤可以把装饰挂在卡上而不必猜类名 · 宽容器两栏布局(3a6956e、76a0dae):卡片正文在宽容器里是两栏网格,主栏放库工具条、委派皮肤行、预览网格与自定义主题,侧栏留给背景与模糊这组紧凑控件;窄容器回落单栏,预览网格保持响应式。宽度靠 CSS 容器查询(container-type: inline-size)测量而不是读 viewport,所以同一份卡片在设置弹窗与独立页面里都不会错栏 · 分段控件与步进控件(e15ffd1、76a0dae):SegmentGroup 用一个真实药丸元素在选项间滑动,每次摆放按容器的内边距盒测量当前按钮,再由 CSS 过渡 x/y/宽高,所以控制折到第二行时药丸仍落在正确那一行;ResizeObserver 在组或选项尺寸变化时重新测量,首次摆放不动画。StepperControl 对齐宿主字号设置那种步进器,配粗档滑块与 RangeBubble 数值气泡,值按步长取整以避免 0.3 + 0.1 一类的浮点漂移 · 语义属性契约补到 Web 扩展父页与子页锚点:web-ui-settings 新增 extensions(父级根,一级 settings.section id web-ui-plugins 的内容容器)与 tabs / tab / panel(二级 TAB 导航、TAB 按钮与当前页面容器,[role="tablist"] / [role="tab"] / [role="tabpanel"]);skin-center 新增 panel([data-dsh-plugin="skin-center"][data-dsh-part="panel"])。plugin 组里 pet、usage、dsh-web-ui-market、skin-center 四行改写为双席位描述:Web 扩展内的 keyed id,独立安装时的一级 settings.section id · 修复 · 插件外观卡的标题不再被徽标挤掉,窄容器不再溢出(b66fe9b):委派皮肤卡的标题行改为可收缩,徽标占固定宽度,窄宽下标题折行而不是把整行推出卡片 · 其他改动 · 插件外观卡搬到页面顶部(2b5b532):委派皮肤从网格上方的整宽行改成页面顶部「插件提供的外观」分组里的一张卡,与 Wallpaper Engine 卡并列。皮肤在预览网格里仍不占格子——格子是用来放预览图的,而本包没有别的插件画出来的外观的预览图。页面文案整体收短,删掉与目录重复的那句标语,墙纸与委派皮肤的说明各压到一行 · DIY手账本的设置页装饰改用语义面板根(skins/di
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-skins · DeepSeek Harness (DSH) 皮肤中心 DeepSeek Harness(DSH)官方 Web GUI 与桌面客户端专属主题与个性化美化引擎主题换肤 · 毛玻璃高斯模糊 · 自定义深浅色配色 · 创意工坊即时试穿 · Wallpaper Engine 由专用插件提供 @linxin666/dsh-client-ui-skin-center(cordis 插件 id ui-skin-center)是 dsh Web GUI 唯一的皮肤包:它把皮肤列表 / 试穿 / 应用放进「设置 → Web 扩展 → 皮肤」TAB(父级缺席时保留一级「皮肤中心」分区,只列已安装皮肤),并且是所有皮肤的唯一加载器与渲染器。皮肤是纯资产目录——没有 package.json、不发 npm、不接 cordis 接线——只与皮肤中心契约(contracts/)耦合;皮肤中心把对官方 DSH 的全部耦合吸收在契约之后。卡片自带总开关(关闭即停用试穿、应用与背景控制)。 - 列表:展示「官方默认」加目录册里已安装的皮肤(名称、标语、强调色),当前应用目标带「使用中」标记。目录册合并两个来源:随本包内置的默认皮肤(skins/blue-fantasy/)与放进 $DSH_HOME/skins/<id>/ 的用户皮肤(同 id 时用户皮肤遮蔽内置皮肤)。
展开完整文档(README 剩余 1 节)
dsh-skins · DeepSeek Harness (DSH) 皮肤中心

DeepSeek Harness(DSH)官方 Web GUI 与桌面客户端专属主题与个性化美化引擎主题换肤 · 毛玻璃高斯模糊 · 自定义深浅色配色 · 创意工坊即时试穿 · Wallpaper Engine 由专用插件提供

@linxin666/dsh-client-ui-skin-center(cordis 插件 id ui-skin-center)是 dsh Web GUI 唯一的皮肤包:它把皮肤列表 / 试穿 / 应用放进「设置 → Web 扩展 → 皮肤」TAB(父级缺席时保留一级「皮肤中心」分区,只列已安装皮肤),并且是所有皮肤的唯一加载器与渲染器。皮肤是纯资产目录——没有 package.json、不发 npm、不接 cordis 接线——只与皮肤中心契约(contracts/)耦合;皮肤中心把对官方 DSH 的全部耦合吸收在契约之后。卡片自带总开关(关闭即停用试穿、应用与背景控制)。

- 列表:展示「官方默认」加目录册里已安装的皮肤(名称、标语、强调色),当前应用目标带「使用中」标记。目录册合并两个来源:随本包内置的默认皮肤(skins/blue-fantasy/)与放进 $DSH_HOME/skins/<id>/ 的用户皮肤(同 id 时用户皮肤遮蔽内置皮肤)。皮肤集中的其余皮肤都是市场条目:在 DSH 市场商店一键按需安装到 $DSH_HOME/skins/<id>/,即由同一目录册作为用户皮肤管理——无需重启,重开卡片或刷新页面即收录。skin.json 校验失败的皮肤按 fail-closed 排除,并作为目录诊断上报。
- 自定义主题:列表末尾提供一张基于官方默认外观派生的用户级主题卡,与「官方默认」及目录册皮肤相互独立。浅色、深色分别编辑强调色、背景色、前景色和对比度(0–100),支持即时试穿、应用、恢复当前模式默认值和刷新持久化。生成的 CSS 只能覆盖经审计的官方 token 白名单,不接收选择器、任意 CSS 或资源 URL;不会修改任何第三方皮肤定义,目录册皮肤激活时自定义主题层自动停用。
- 试穿 / 应用:两者走同一个原子切换引擎(src/client/runtime/skin-controller.ts)。一次切换 = 一个新的 activation identity:取回已限定作用域的样式表,安装样式、背景媒体与可选 hooks,翻转 html[data-dsh-skin="<id>"],然后销毁上一个 activation(append-only 效果账本,幂等清理)。最新请求永远胜出;失败或被淘汰的切换完整保留旧皮肤。试穿是同一个切换但不落盘——「退出试穿」恢复已提交的皮肤。应用会持久化选择(POST /api/skin-center/v2/active)。不刷新页面、不改写 cordis.patch.yml、不重建启动图。
- 首屏:host 半区注册一个 index.html 转换(webServer.tapIndex,单一适配模块 src/tap-index-adapter.ts),向每份送达的文档盖 html[data-dsh-skin] 属性并插入样式表链接,刷新后直接以当前皮肤启动,无官方原貌闪屏。tap 出任何问题都 fail-closed 回官方原貌。
- 皮肤格式(v2):skin.json(fail-closed 校验,v1 字段 package/wiring/bodyAttr 忽略并给迁移警告)、skin.css(L1 token 重映射 + L2 语义选择器)、可选 patches.css(L3 自由选择器,高敏感)、可选 hooks.mjs(受信逃逸舱,高敏感)、assets/、preview/。所有 CSS 经过安全管线(src/core/css-safety/transform.ts):每个选择器强制限定在 html[data-dsh-skin] 下,@import / 远程或协议相对 URL / 越界路径直接报错。见 contracts/README.md。
- 覆盖契约:L1 重映射官方 --dsw- 设计 token;L2 样式语义属性(data-dsh-surface / data-dsh-part / data-dsh-plugin,枚举见 contracts/semantic-attrs-v1.md),由兼容适配器(src/client/runtime/semantic-adapter.ts)从稳定锚点(data-slot 出口、data-chat-flow-kind 等)为官方壳层 DOM 打标;L3 补丁任意选择器,脆弱性由皮肤作者自负。主动输出语义属性的插件获得完整 L2 覆盖;不输出的只享受 L1。目录皮肤或自定义主题激活期间还会启用公共壳层渲染适配器:它清除工作区列表末端 fade,将 composer 占位符固定为不透明的主题次级文本色,并为会话滚动口保留底部安全间距以保证吸底正文不被输入区覆盖(#978),各皮肤无需重复补丁。
- 背景优先级:壁纸渲染期间皮肤及其背景媒体整体停画(见「Wallpaper Engine」),背景完全归壁纸;否则皮肤清单背景媒体即背景。
- 背景控制:背景遮蔽滑杆(0–100%)为画背景的皮肤在面板后加纱,两个按状态的高斯模糊滑杆(0–20 px)分别控制空对话与有内容时的背景,输入卡模糊滑杆(0–20 px)只控制输入卡背后的磨砂区域,气泡不透明度滑杆(0–100%)控制支持气泡 alpha 的皮肤消息气泡。整张壁纸模糊仍是独立的壁纸设置。背景模糊通过外壳之后的固定 backdrop-filter 元素施加;0 完全关闭(无元素、无 GPU 开销)。输入卡磨砂由独立的 body 级固定跟随层(data-dsh-composer-frost 元素)承担并按输入卡尺寸跟随,不挂在卡片本体上:卡片一旦带 backdrop-filter 就会成为其中 shell fixed tooltip 的包含块,悬停时整页会话会被顶动。
- 旧版迁移:v2 升级后的首次启动,一次性桥(src/legacy-bridge.ts)读取 harness home 根 cordis.patch.yml(v1 CLI 写入处;活动 profile 的 cordis.patch.yml 作为次级位置也会探测)里已退役的 dsh-skin 受管段,把活动皮肤 id 迁进 v2 选择存储,并清除旧行。迁移幂等且 fail-closed(出错时旧状态原样保留)。仅在发生迁移、清理或失败时输出日志,无 legacy 状态的稳态保持静默(issue #788)。

核心特性与场景

| 核心使用场景 | 原生 DSH Web 局限 | 皮肤中心(dsh-skins)解决方案 |
| 个性化界面视觉与护眼暗色模式 | 仅支持单一官方默认黑白主题 | 内置经典 Blue Fantasy 蓝色幻想暗色主题,支持从创意工坊一键安装数十款精美主题 |
| Wallpaper Engine 动态壁纸交互背景 | 无法使用动态壁纸或视频背景 | 交给专用的 dsh-wallpaper-engine 插件(视频、Web 与 2D/3D WebGL 实时场景壁纸),本卡片负责安装指引并把背景让给它 |
| 毛玻璃背景模糊与输入卡磨砂控制 | 界面背景单一,无视觉层次感 | 提供全局背景遮罩(0–100%)、空会话/有内容动态高斯模糊、输入框局部磨砂跟随与气泡透明度滑杆 |
| 自定义品牌与个性配色重映射 | 无法自定义主题颜色与对比度 | 独立编辑浅色/深色强调色、背景色、前景色与对比度,自动生成审计级 CSS token 覆盖层 |
| 主题资产即时试穿与无感热切换 | 更换主题需重启服务或刷新页面 | 原子切换引擎实现一键即时试穿、退出恢复与持久化应用,刷新直接以当前皮肤启动零白屏闪烁 |

人气皮肤

dsh-market.com 创意工坊皮肤分类里人气最高的三款皮肤,按网站默认的「按人气」排序:

| 皮肤 | 作者 | 外观 |
| 深海女仆工坊(maid-atelier) | Small-tailqwq | 双女仆工坊背景、深海蓝蕾丝界面与 Q 版侧栏 |
| 鲸鱼娘 · 未至之境(whale-fantasy) | stushansusu | 赛博数据雨少女特写背景 · 冷黑蓝全息 HUD · 电光蓝与青色高光 |
| 鲸吟(whale-song) | dsh-web | 深海鲸语女神背景 · 冰蓝海洋调色板 · 金色细线点缀 |

| 深海女仆工坊 | 鲸鱼娘 · 未至之境 | 鲸吟 |
| 深海女仆工坊 | 鲸鱼娘 · 未至之境 | 鲸吟 |

三款都可从创意工坊一键安装。

安装

dsh plugin --profile web add @linxin666/dsh-client-ui-skin-center
仓库开发:dsh plugin --profile web add link:$(pwd)/packages/skins/skin-center

$(pwd) 是 dsh-web monorepo 的本地克隆。只有默认皮肤(蓝色幻想)随这个包发布;其余皮肤在 dsh-market.com 按需安装到 $DSH_HOME/skins/<id>/,社区皮肤同样是放进该目录的普通目录(均无安装命令、无需重启——重开卡片或刷新页面即收录)。新装默认激活蓝色幻想(宿主种子);升级后原激活皮肤已不可用时回退官方主题。包内只发布 skins/blue-fantasy;其余皮肤保留在仓库 skins/ 下,作为市场构建与画廊的目录来源,绝不进入 npm 包。

皮肤中心是符合官方 DSH 插件标准的自包含 bundle(dsh.bundle.patch 指向 cordis.patch.yml);也可经 git 安装:dsh plugin --profile web add github:<org>/dsh-web#<sha>(prepare 脚本就地构建 lib/)。pnpm ≥10 安装 git 依赖前需授权 allowBuilds;本地 link: 安装无此要求。

Wallpaper Engine

Wallpaper Engine 支持不再内置在本包。它由独立插件 dsh-wallpaper-engine(dsh-plugin-wallpaper-engine)提供,壁纸库、视频 / 网页 / 场景三条渲染路径、壁纸设置面与壁纸之上的玻璃都归它管。它是壁纸方面的推荐工坊条目,皮肤中心卡片可直接帮你装上。

一键安装:打开 设置 → Web 扩展 → 皮肤,在卡片的壁纸提示条上点「一键安装」。安装走宿主当前发布的插件管理面——存在官方进程内插件管理器时优先用它(与官方插件页同一个调用,也是打包版桌面客户端上唯一的写入者),否则退回家族插件管理器面;两者都没有时保留复制命令的兜底。

手工等价命令:

dsh plugin --profile web add dsh-plugin-wallpaper-engine

装完重启宿主(dsh web;DSH Desktop 需完全退出应用后重新打开)。该插件自带设置页用于选择与调节壁纸。

两者如何共处一页

两个插件轮流上阵而不是互相覆盖,切换是自动的:

- 壁纸渲染期间,该插件给 body 打上稳定属性 data-we-wallpaper。皮肤中心读取该属性并整体停掉自己的视觉工作:不加载皮肤 CSS、不画皮肤背景图、不跑 hooks、不挂输入卡磨砂,并把 html[data-dsh-skin] 属性从页面上撤下。你在皮肤中心选的皮肤会被记住但不绘制——该插件改写了同一个壳层并画自己的玻璃,其他东西只会与它相争。
- 壁纸停止时,属性清除,被记住的皮肤自动重新上妆,无需刷新、无需重新应用。
- 当你主动试穿或应用皮肤时,这一次激活会先「抢一次台」:即使壁纸仍在渲染,皮肤也会上妆并翻上 html[data-dsh-skin]——该插件正是盯这个属性把舞台让回来的。对已穿戴的同一款再点一次「应用」同样算一次动作,因此每次应用都会写这个属性,而不是只在选择变化时才写。这个让路信号只发一次:若让路窗口内始终没有回应,皮肤会自行退回停画,等壁纸停止后再按记忆恢复。
- 首屏在被渲染之前,就先认下已记住的壁纸。 上面那个属性是壁纸插件的客户端链在文档送达之后数百毫秒才写上的,而浏览器的首帧由送达的文档决定,等它到达时已经晚了。因此宿主在出页面时会同步读壁纸插件的持久化选择($DSH_WE_DATA_DIR/config.json,缺省 ~/.dsh-wallpaper-engine/config.json),里面选着壁纸时这一屏就完全不注入皮肤:不盖 html[data-dsh-skin]、不插皮肤样式表。被撤下的文档还会打一个标记,因此随后启动的界面也会先按住它的第一次激活——否则几百毫秒后那一次切换就会把这个空档重新填上。于是既有皮肤又有壁纸的页面刷新后直接开在壁纸上,没有一闪而过的皮肤要撤掉。皮肤仍然归你:若壁纸最终没能渲染,属性一撤掉、或这扇短窗关上(以先到者为准),运行时就会照旧把记住的皮肤应用回来。

停画期间卡片会写明原因,因此「皮肤不见了」读起来是一个状态而不是故障。你选中的皮肤任何时候都会落盘,壁纸没让它上场的部分也会在壁纸停止后自动生效。皮肤中心从不写该插件的状态,该插件也从不写皮肤中心的状态。

皮肤与壁纸

皮肤背景图属于皮肤自身外观的一部分,因此壁纸渲染期间会随皮肤整体停画。自带满幅底板的皮肤(目录里的 ground-plate 画布类)另把让路规则锚定在 body[data-we-wallpaper] 上,从而主动让位而不是争夺背景。

委托皮肤(由插件绘制的皮肤)

有些外观不是资产目录,而是各自作为插件发布的整套界面。Claude Code 风格就是其中一个:它在 dsh-claude-style(dsh-claude-style)里,自行重绘外壳、侧栏、输入区与对话区。它是一个独立包:本仓库不捆绑、不接管版本,也不分发它的文件。

这样的外观同样是可以选用的皮肤。它在页面顶部「插件提供的外观」分组里独占一张卡片,与 Wallpaper Engine 卡片并排,带 插件皮肤 标记;皮肤中心开启时,用起来与其他皮肤完全一致:试穿、应用,刷新后依然保留。它不占网格里的方块位:那一格是为了放预览图,而这套外观由别的插件绘制,本包里没有它的截图。区别只在于它不由本包绘制——由那个插件绘制,本包只保管这个选择。

- 插件还没装时这一行就在。 在该行点「一键安装插件」即可(与壁纸提示同一套一键路径:宿主提供官方进程内插件管理器时走它,否则走家族插件管理器,两者都没有时给出可复制的命令)。
还没装的档案正是提示该出现的地方。
- 选中它即交出页面。 皮肤中心不盖章、不加载、不绘制任何东西;由插件自己的客户端链路挂载它的 bundle。这个选择与其他皮肤一样持久化,重启后仍是这套外观。
- 换其他皮肤、官方默认,或壁纸在跑时,页面就交还回来。 走的是同一次交接的反向:皮肤中心重新盖上 html[data-dsh-skin],插件读到后收起自己的视觉,皮肤画上去。无需刷新,无需重新应用。
- 无法让路的版本不会被选用。 插件用一个 body 属性声明自己能让路;没有它时该行会说明情况,并且不提供试穿与应用——否则两者会同时绘制同一副外壳。更新插件后该行即可选用。
- 让路不影响插件的设置页与偏好。 收起的是视觉,不是卸载:别的皮肤在屏幕上时,插件自己的设置页照常可用。

皮肤中心只读插件的标记、从不写入,插件也从不写 data-dsh-skin,两边都无法把对方卡死。

配置

- 总开关:开关整张卡片(试穿 / 应用 / 背景控制);持久化在 v2 活跃状态文档中。
- 背景滑杆:遮蔽(0–100%)、两个背景模糊半径、输入卡模糊(0–20 px)与气泡不透明度(0–100%),持久化在同一 v2 文档中。
- 背景持久化(支持远程):背景设置存放在 v2 活跃状态文档($DSH_HOME/skin-center-active.json 的 background 段),经 GET|POST /api/skin-center/v2/active 读写,因此已配对的远程桌面(settings 通道仅限本机回环)也能读取并跨会话保存。插件自身配置中的 skin-background 段保留为设置页的输入面:已定制的配置在启动时一次性迁移进 v2 存储,之后的设置页修改由客户端转发。卡片内的修改不回写该设置页,因此它可能显示旧值,直到下一次从设置页修改。
- 自定义主题:浅色/深色的强调色、背景色、前景色、对比度配置及应用标记,以版本化契约持久化在插件自身配置的 skin-custom-theme 段。
- 壁纸设置:不属于本配置。它们归 dsh-plugin-wallpaper-engine,由该插件提供自己的设置页;旧 profile 里遗留的 skin-wallpaper 段会被忽略,且不会被改写。
- 这些设置放在哪里:以上两段同属一份插件配置——该 profile 条目自己的 Config。宿主据此 schema 在 GUI 中生成该条目的设置页,卡片写入的是同一批值;不存在单独的 settings 文档。
- 用户皮肤目录:$DSH_HOME/skins/<id>/;覆盖优先级为 DSH_SKINS_HOME、DSH_SKINS_DIR、$DSH_HOME/skins。

安全模型

- 所有 /api/skin-center/ 路由仅接受同源请求:写操作拒绝跨站请求(Sec-Fetch-Site / Origin 围栏),资产读取限定在各皮肤目录之内(路径逃逸 fail-closed)。
- 皮肤 CSS 在服务前经白名单净化;patches.css(L3)按设计就是任意 CSS 并如实公示——它拥有完整页面样式能力,不构成安全边界。
- 自定义主题编辑器只会从 CUSTOM_THEME_ALLOWED_TOKENS 生成固定声明,且每个 token 都对照官方 token 注册表校验。用户输入只作为规范化后的颜色/对比度数据,不会成为选择器、URL 或自由 CSS 载荷。
- hooks.mjs 是与本仓库同审同发的受信代码,仅同源 serve,其 import/apply 错误永远不会拖垮静态皮肤。hooks 对内置皮肤及可按字节验证为官方市场已审查内容的用户目录皮肤放行:当前 Workshop 安装使用 dsh-market.provenance.json,而早于 provenance 的历史安装必须同时匹配生成的 src/reviewed-hooks.generated.ts 身份中的 id、声明入口、完整 skin.json 与 hooks 字节(由 src/provenance.ts 校验,issue #1073)。回退只读且离线;任何被修改、改名、手工投放或篡改的目录都会继续拒绝 hooks facet,声明式部分仍正常加载。

已知限制

- 插件运行时写入的内联样式只能经 L3 !important 补丁覆盖。
- 不输出语义属性(且无稳定 DOM 锚点)的插件只享受 L1 token 覆盖。
- 壁纸的「隐藏时暂停」、模糊、压暗与声音都在 dsh-plugin-wallpaper-engine 自己的设置里;皮肤中心没有任何壁纸控件,卡片只报告该插件的状态。

数据遥测

浏览器半区每个 UTC 日向 dsh-market.com 发送一次匿名安装心跳:仅含一个 localStorage 随机 ID 与本包名,无其他数据。服务端只存储该 ID 的加盐哈希,不存 IP,且只暴露聚合计数。完整契约见 docs/telemetry.md。

目录结构

skins/skin-center/
contracts/ # 面向皮肤的契约面(schema、hooks API、语义属性) src/core/manifest-v2/ # manifest v2 类型 + fail-closed 校验器 src/core/css-safety/ # lightningcss 作用域限定 + 白名单管线 src/index.ts # host 入口:路由、tapIndex 适配器、旧版迁移桥 src/skin-repo.ts # 双来源皮肤目录册(内置 + $DSH_HOME/skins) src/provenance.ts # 官方市场安装 provenance 校验(hooks 信任) src/routes-v2.ts # /api/skin-center/v2/* 路由 src/tap-index-adapter.ts # 单一 tapIndex 适配器(防 FOUC) src/active-state.ts # 活动皮肤选择持久化 src/legacy-bridge.ts # 一次性 v1 → v2 迁移 src/http-utils.ts / harness-home.ts # 路由共享助手 / DSH 路径解析 src/client/runtime/ # 效果账本、装饰层、语义适配器、切换控制器、启动存储 src/client/SkinCenter.tsx # 设置卡片 src/core/custom-theme.ts # 版本化配色契约 + 经审计的纯 token CSS 生成器 src/client/custom-theme-controller.ts / CustomThemePanel.tsx # 持久化/运行时控制器 + 编辑卡片 src/client/background.ts # 遮罩 + 模糊控制 src/external-wallpaper.ts # 只读探测独立壁纸插件 src/client/runtime/external-wallpaper-engine.ts # 该插件渲染期间停画皮肤 src/client/external-wallpaper-install.ts # 经宿主插件管理面一键安装 skins/<id>/ # 内置皮肤(纯资产目录)

验收清单

- [x] 皮肤中心出现在 设置 → Web 扩展 → 皮肤,无控制台报错
- [x] 列表展示官方默认加目录册全部皮肤;当前使用者有标记;非法皮肤以诊断形式呈现
- [x] 试穿即时生效,退出完整恢复已提交皮肤;页面上永远只有一套皮肤
- [x] 一键应用原子切换、无需刷新;后续页面加载直接以该皮肤启动(无 FOUC)
- [x] 自定义主题保留独立浅色/深色配置、刷新后恢复,且不会覆盖已激活的目录册皮肤
- [x] 背景遮罩与模糊控制不受换肤影响
- [x] 独立壁纸插件渲染期间,本插件不留下任何皮肤、玻璃或背景图;它停止后被记住的皮肤自动恢复
预览分享卡片长什么样 ↓zhu1090093659/dsh-skins
分享 · DeepSeek Harness Hub
zhu1090093659/dsh-skins

DSH Web GUI 的皮肤中心插件与内置皮肤:皮肤就是纯资源目录,由皮肤中心加载渲染,按需从 dsh-market.com 安装。

回到顶部