dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
葬送的芙莉莲 × 勇者辛美尔 —— DeepSeek Harness Web 界面(
dsh web)的芙莉莲主题插件
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41"
把整个 Web 界面变成充满芙莉莲元素的水彩世界:蓝紫水彩配色、魔法阵、苍月草飘花、星光、勇者金戒指印章与辛美尔的名台词,输入框支持玻璃/普通两种材质(消息区保持透明,壁纸完整可见)。所有开关都收在设置里的独立「芙莉莲主题」分区:外观模式、自定义壁纸上传(含模糊度调节)、整体材质、逐层装饰开关、名台词轮换方式。初始状态为无壁纸,用户可自行上传图片作为整体背景。
插件是部署级 bundle 插件:装进 web profile 后随 dsh web 自动加载,重启不丢失、无需批准、无需手动注册。
截图占位:把界面截图放到
screenshots/preview.png即可显示。
dsh web、磁盘写入失败等)会自动退回把图片内联进设置,功能不受影响。画廊满额时会直接拒绝,不会写入任何文件。初始状态为无壁纸,上传后壁纸以独立固定层渲染,不干扰界面布局filter: blur()(0px 清晰~20px 重度模糊),变化时平滑过渡prefers-reduced-motion 直接硬切,「省电」性能档降级为 600ms 纯叠化(不缩放不模糊),动画期模糊封顶 26px 且只在飞行期间提升图层backdrop-filter);手动调整任意一项后显示为「自定义」prefers-reduced-motion)——开启后所有装饰动画静止(星光停驻、飘花停在视口内、魔法阵不旋转、壁纸过渡移除),装饰本身依然显示0.2.0-rc.2 同发布线(rc.41 起;rc.40 及更早版本面向 0.1.x,装到 0.2.x 上会被 dsh plugin 的兼容性闸门拒绝)dsh web)pnpm 已安装且在 PATH 上(dsh plugin 通过 pnpm 管理 profile 依赖)兼容性闸门怎么判定:
dsh plugin会拿本插件package.json里所有@deepseek-ai/dsh*的peerDependencies去匹配当前 DSH 运行版本(semver.satisfies(runtime, range, { includePrerelease: true })),任一不满足就整包拒绝安装(不会装一半)。所以升级 DSH 主版本线时,插件必须同步放宽/抬升 peer 范围。
dsh-frieren-zzj/
├── README.md # 本文档
├── frieren-zzj/ # 插件源码(npm 包 @zengzhaojun/dsh-client-frieren-zzj)
│ ├── cordis.patch.yml # bundle patch 层(声明 dsh.bundle 后自动激活)
│ └── ...
└── dist/
└── zengzhaojun-dsh-client-frieren-zzj-0.1.0-rc.41.tgz # 打包产物(安装版用)
和ai说:根据 https://github.com/zzjzgz/dsh-frieren-zzj 的仓库指引在本地安装这个壁纸插件。
原理:从
0.1.0-rc.24起,本插件同时声明dsh.bundle和dsh.client,dsh plugin add安装后会自动将其加入dsh.profile.bundles层列表并激活——不再需要手动编辑cordis.patch.yml。一条命令装完,重启即生效。设置为什么能写入:dsh 的 API 网关对浏览器可写的 settings 条目有一份白名单,第三方插件走标准 settings RPC 会被拒(表现为设置里的开关点了没反应)。本插件因此不走该通道:node 半边注册一条同源 HTTP 路由(
/plugins/@zengzhaojun/dsh-client-frieren-zzj/settings)作为浏览器读写桥,直连 settings 服务。该桥依赖 node 半边,所以升级后必须完整重启dsh web。设置存在哪里(DSH 0.2):
0.2起插件设置不再是可随意注册的命名空间,而是插件自己这条 Loader 条目的config:node 半边导出Config(frieren-zzj/src/frieren-settings.ts的 schema,每个字段都标了.volatile()),SettingsForms.describe()按条目 id(本插件即frieren-zzj)读出表单值,写入经update/replace/mutate落到 profile 的cordis.patch.yml里该条目的config段。桥的 GET/PUT 语义与旧版一致,所以浏览器半边无需改动。
dsh CLI 可用。本机是通过 DSH 源码目录启动的:在 D:\dsh-dsp\deepseek-harness 下执行 pnpm dsh ...;如果你的 dsh 已在 PATH 上,下文所有命令去掉 pnpm 前缀即可。pnpm --version 能正常输出版本号(dsh plugin 内部要调用 pnpm)。dsh web——首次运行会自动初始化 web profile(组合 @deepseek-ai/dsh-base + @deepseek-ai/dsh-web-app),profile 目录就出现在 %USERPROFILE%\.dsh\profiles\web。插件已发布到 npm(@zengzhaojun/dsh-client-frieren-zzj),直接按包名安装:
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41"
dsh plugin 会检测到包声明了 dsh.bundle,自动将其加入 dsh.profile.bundles 层列表——无需手动编辑 cordis.patch.yml;pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41" --registry=https://registry.npmjs.org没有 npm 网络时,可用仓库 dist/ 里的 tgz 安装:
pnpm dsh plugin --profile web add "file:D:/JavaCode/ds-h/dsh-frieren-zzj/dist/zengzhaojun-dsh-client-frieren-zzj-0.1.0-rc.41.tgz"
⚠️ 路径注意:
dsh plugin add会把相对路径锚定到「你运行命令的目录」,而手动pnpm add的相对路径会相对 profile 目录解析——所以一律写file:+ 正斜杠的绝对路径最稳妥,不会装错地方。
验证装上了(任选其一):
# 包本体已存在:
Get-ChildItem "$env:USERPROFILE\.dsh\profiles\web\node_modules\@zengzhaojun\dsh-client-frieren-zzj\lib"
# 或让 pnpm 解释为什么安装它:
pnpm dsh plugin --profile web why @zengzhaojun/dsh-client-frieren-zzj
小知识:pnpm 写进
package.json的 spec 对本地 tgz 会变成"file:D://JavaCode//ds-h//dsh-frieren-zzj//dist//...tgz"这种盘符后带双斜杠的形式,这是 pnpm 自己的路径规范化,属正常现象;从 npm 安装则是标准的"@zengzhaojun/dsh-client-frieren-zzj": "0.1.0-rc.41"。
pnpm dsh web --dump-config
frieren-zzj 行,注释指向插件的 cordis.patch.yml bundle 层;--dump-config 只打印组合、不启动服务,随时可以运行;node_modules 里有没有包、版本号对不对。dsh web 并刷新浏览器pnpm dsh web 的终端按 Ctrl+C 停掉旧实例;pnpm dsh web;http://127.0.0.1:3080,硬刷新(Windows: Ctrl+F5;macOS: Cmd+Shift+R)——客户端 bundle 有浏览器缓存,普通刷新可能还是旧页面。小技巧:想先试试不打断现有实例,可以另开一个终端跑
pnpm dsh web --port 3081,用 3081 端口预览;确认没问题再切回正式实例。
应看到:蓝紫水彩配色、右上角旋转魔法阵、苍月草飘花、金紫星光、顶部彩带、侧边栏金戒指印章、「蒼月草が咲く頃に」徽记、输入栏下方名台词。初始状态无壁纸,可到设置中上传自定义壁纸。如果配色变了但装饰没出现,多半是浏览器缓存,再硬刷新一次。
打开设置(左下角齿轮)→ 导航里会出现「芙莉莲主题」分区,从上到下依次是:插件总开关、外观模式(浅色/深色/跟随系统)、自定义壁纸上传(含模糊度滑块与遮罩强度滑块,各带预设按钮)、壁纸轮播(2 张以上时出现)、整体材质(玻璃 / 普通)、逐层装饰开关、装饰微调(数量 / 速度 / 魔法阵大小)、性能档位、专注模式、名台词轮换方式、备份与分享(导出/导入),底部是恢复默认设置。改完立即生效,无需刷新。总开关关闭后分区里只保留开关与恢复按钮,方便随时开回来。
如果之前安装过 rc.23 或更早版本,升级到 rc.24 后可以删除 profile cordis.patch.yml 里手动注册的名录行(不再需要了):
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41"
%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml,删除之前手动加的块:
# 删掉这段(rc.24 起不再需要)
- insert:
- id: frieren-zzj
name: '@zengzhaojun/dsh-client-frieren-zzj'
dsh web——rc.24 的 bundle 层会自动注册插件行。不删也行:profile 的
cordis.patch.yml层在 bundle 层之后应用,多写一行insert只会多一条同 id 的行(Loader 去重后等效),但建议清理以保持干净。
升版本号:改 frieren-zzj/package.json 的 version(如 0.1.0-rc.33 → 0.1.0-rc.41)。必须升:npm 不允许重复发布同一版本,pnpm 也按 lockfile 校验;
重新构建 + 发布(见「从源码打包」和「发布到 npm」):
cd D:\JavaCode\ds-h\dsh-frieren-zzj\frieren-zzj
npm publish --tag rc # 账号开 2FA 的话会提示输入验证码
任何机器上按新版本号重装:
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41"
重启 dsh web + 浏览器硬刷新(设置桥依赖 node 半边,必须完整重启)。
dist/ 里的 tgz 就是安装源;需要重新打包时:
升版本号(见「更新插件」);
跑单元测试(Node 内置测试运行器,零额外依赖;需 Node ≥ 22.6,本机 v24 已支持直接运行 .ts 测试):
cd D:\JavaCode\ds-h\dsh-frieren-zzj\frieren-zzj
npm test # 等价于 node --test,自动发现 test/ 下的用例
构建出 lib/ 再打包。本仓库自带一套独立构建工具链(tsconfig.build.json + tsdown.config.build.ts + platform.build.ts,完全不改动 DSH 源码):
依赖来源:
rc.41起,TypeScript 需要的 DSH 类型全部来自frieren-zzj自己的devDependencies(已锁到 npm 上的0.2.0-rc.2),cd frieren-zzj && pnpm install即可,不再需要给仓库根的node_modules/@deepseek-ai/手工补 junction。只有仓库根的构建工具(typescript/tsdown/lightningcss)仍需存在。⚠️ 升级 DSH 线时:
peerDependencies与devDependencies里的@deepseek-ai/dsh-*要一起抬到与运行版本相同的发布线(例如^0.2.0-rc.2),否则插件要么装不上(兼容性闸门),要么类型对不上。
cd D:\JavaCode\ds-h\dsh-frieren-zzj
node node_modules/typescript/bin/tsc -p tsconfig.build.json
node node_modules/tsdown/dist/run.mjs -c tsdown.config.build.ts
cd frieren-zzj
npm pack --pack-destination ..\dist
重构前先删掉 frieren-zzj\lib,tsc 的增量构建不会清理已删除源文件遗留的产物(否则 npm pack 会把旧 .d.ts 一起打进去)。
新的 tgz 出现在 dist/ 后,可本地安装(见「安装」第 2 步),或继续发布到 npm(见「发布到 npm」)。
dsh plugin add "包名@版本" 直接安装)dsh plugin --profile web add "name@version" 本质是让 pnpm 从 npm registry 拉包,所以把插件发布到 npmjs 后,安装命令就和装任何第三方包一样:
注册/登录 npm 账号(只需一次):
npm adduser --registry=https://registry.npmjs.org
发布(在 frieren-zzj/ 目录;publishConfig.registry 已固定指向 npmjs 官方源,不受本机腾讯镜像影响;rc.* 是预发布版本,必须显式给 tag):
cd D:\JavaCode\ds-h\dsh-frieren-zzj\frieren-zzj
npm publish --tag rc
想先看打包内容:
npm publish --dry-run --tag rc。
2FA 提示:账号开启双重认证时,
npm publish会提示输入验证码(或加--otp=6位码)。想免验证码发布(适合脚本/CI),在 https://www.npmjs.com/settings/zengzhaojun/tokens 生成 Granular Access Token:All packages + Read and write + 勾选 Bypass 2FA for publish,然后npm config set //registry.npmjs.org/:_authToken=令牌。令牌等于发布权限,别提交进仓库、别分享。
版本标签(dist-tag):
--tag rc发布不会更新latest标签,所以不带版本号的安装命令装到的是latest(可能落后于 rc)。建议安装时显式写版本(@0.1.0-rc.41);想统一 latest 可补一条:npm dist-tag add @zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41 latest。
任何机器上一条命令安装(本机腾讯镜像会同步 npmjs,新包一般几分钟内可见):
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41"
如果镜像还没同步到(404),可先临时指定官方源安装:
pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41" --registry=https://registry.npmjs.org
重启 dsh web 即可——dsh.bundle 声明会让插件自动作为 profile 层激活,无需手动编辑 cordis.patch.yml。
包名规则:npm 上 scoped 包名 = 你拥有的 scope(用户名或组织)+ 包名。
@deepseek-ai/*是官方 scope,个人无法发布;本插件使用账号zengzhaojun的用户 scope(@zengzhaojun/*)。每次改源码发布前记得升版本号(npm 不允许重复发布同一版本)。
移除依赖(dsh plugin 会自动从 dsh.profile.bundles 中移除该层):
pnpm dsh plugin --profile web remove @zengzhaojun/dsh-client-frieren-zzj
# 或手动:
cd $env:USERPROFILE\.dsh\profiles\web
pnpm remove @zengzhaojun/dsh-client-frieren-zzj
如果之前手动在 cordis.patch.yml 里注册过名录行(≤ rc.23),也一并删掉;
重启 dsh web,主题消失;
想连壁纸文件一起清掉:删除 %USERPROFILE%\.dsh\plugin-data\frieren-zzj\ 整个目录即可(卸载不会自动删除,避免误删你上传的原图转存)。
安装时报“与 DSH 不兼容 / is incompatible with dsh …”?
这是 dsh plugin 的兼容性闸门:插件 peerDependencies 里的 @deepseek-ai/dsh* 范围不包含当前 DSH 版本(例如 rc.40 声明的是 ^0.1.0-rc.5,而运行的是 0.2.0-rc.2)。装对应的插件版本即可——rc.41 起声明 ^0.2.0-rc.2,可在 DSH 0.2.x 上安装。不要用 dsh plugin allow-version 硬放行旧版本:0.2 移除了 @deepseek-ai/dsh-client-runtime,并为 ctx.slots、插件设置换了归属,旧包强行加载会在浏览器端报错。
重启后主题还在吗? 在。装进 profile 就是部署级插件,随组合加载,不像动态插件那样重启即失。
需要批准吗?
不需要。加载路径与 ui-theme、ui-sidebar 等内置插件相同。
安装时会有 no dsh.bundle 警告吗?
从 rc.24 起不会了。插件现在声明了 dsh.bundle,dsh plugin add 会自动将其作为 profile 层激活。(rc.23 及更早版本会有该警告,是正常的——那时还是客户端插件,需要手动注册。)
主题没生效?
按顺序排查:① pnpm dsh web --dump-config 里有没有 frieren-zzj 行;② node_modules\@zengzhaojun\dsh-client-frieren-zzj 是否存在;③ 浏览器是否硬刷新(Ctrl+F5);④ 是否完整重启过 dsh web。
怎么临时关闭整个插件? 设置 →「芙莉莲主题」→ 顶部总开关关闭,所有主题效果立即消失、界面恢复默认;再开一次即全部回来。想连设置一起重置,点底部恢复默认设置。
朋友怎么用?
一条命令:pnpm dsh plugin --profile web add "@zengzhaojun/dsh-client-frieren-zzj@0.1.0-rc.41",重启 dsh web 即可;初始无壁纸,到设置中上传自定义壁纸。离线环境则用 dist/ 里的 tgz 走第 2 步。想连配置一起分享:设置 →「芙莉莲主题」→备份与分享 →「导出设置」得到一个 JSON 文件,对方点「导入设置」选中它即可(壁纸也在文件里,可能较大)。
离线能用吗? 能。标题字体在线时从 Google Fonts 加载,离线自动回退本地衬线字体栈;配色完全离线可用,壁纸由用户上传后离线可用。
%USERPROFILE%\.dsh\plugin-data\frieren-zzj\wallpapers\(或 $DSH_HOME 对应位置),文件名是图片内容哈希;移除某张 / 清空 / 导入配置时会立即删掉不再被引用的文件,插件每次启动还会再扫一遍兜底(5 分钟内写入的会保留,只用于保护"文件已写、设置还没落盘"的在途上传)。因为文件名是内容哈希,同一张图被两个画廊条目引用时,只有最后一个引用消失才会删文件plugin-data 后再导入,壁纸会加载不出来(需重新上传)。这是壁纸改存文件后的连带限制,后续计划在导出时把图片内联回去(届时备份会重新变大)pointer-events: none,不影响任何交互LICENSE)