deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:WTStarMark/dsh-myskin
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
DSH 全兼容皮肤可视化编辑框架:在真实界面上点选即可改外观、配色、字体与排版,并把整套皮肤导出为 .dshframework 皮肤包分享给他人。
Web 与 Desktop 共用同一套客户端插件管线。皮肤是一层完全可逆的覆盖层:不修改 DSH 源码、不触碰 DSH 进程; 关闭开关或点「还原默认」即回到原生外观(皮肤库里已保存的皮肤不受影响)。
已声明兼容适配 dsh-wallpaper-engine(壁纸引擎):装了就自动让出背景,卸载/关掉即恢复。
适配 DSH 0.1.7-rc.2、0.2.0-rc.1、0.2.0-rc.2(Web 与 Desktop)。
npm run check:types逐字段对照本机安装的 DSH 校验。
<style>),不修改 DSH 的源码、配置与进程。.dshframework,换机器或换 profile 一键导入。以下截图来自 DSH Desktop(Windows)。示例皮肤在原生外观上做了七处改动:主题色、壁纸、文字替换、字体、移除组件、
在侧边栏嵌入一张 正片叠底 混合模式的图片,以及在对话区嵌入一张装饰图。

主界面。 侧边栏的全身立绘与对话区右侧的装饰图都是嵌入图片,问候语与输入框提示文字为文字替换, 整体配色来自预设主题的令牌,背景为壁纸。

对话界面。 输入区右侧的装饰图跟随输入区,会话内容与背景保持可读(图中对话内容已由本人打码)。

账号与余额页。 页面上的人物图是按设置页作用域嵌入的图片,只在这一页显示(图中账号信息已打码)。

皮肤管理页。 预设主题、启用开关、兼容模式、绘制模式入口、皮肤库,以及 .dshframework 的导出与导入。

绘制模式。 顶部为工具条(保存状态、撤销重做、嵌入图片、对齐、面板停靠),右侧为编辑面板; 图中打开的是「图片」页签,列出皮肤里的四张嵌入图(各自带锚点解析状态与选中、移除操作), 画布上同时可见侧边栏与对话区两张嵌入图的选中框与缩放手柄。
截图示例皮肤使用的侧边栏插画由 @zhangyuzhangyu233 提供,在此致谢。
--dsw-alias-bg-*、--dsw-specific-sidebar-fill)、
区域 / 面板底色也不写,同时不要求壁纸插件让路;配色、边框、按钮、规则、文字、图层照常。适合与壁纸 / 玻璃 / 桌面壳特效类插件同时使用。enabled: true 并关闭设置弹窗)与「启用皮肤」开关重复,且名字承诺了它没有的"不写入"。
绘制模式内的即时预览不变。[data-dockkit-pane]),变体的质感与底色同样覆盖它。dsh-plugin-wallpaper-engine(它常挂的 data-we-* 标记)时,
没表过态的皮肤自动不接管背景;点一下开关即明确关闭,且这个决定会盖过自动检测。逐条变更与取舍见 CHANGELOG.md。
| 能力 | 说明 |
|---|---|
| 启用 / 停用 | 一键开关整套皮肤,停用即完全还原 |
| 兼容模式 | 不接管背景:不画背景图、不写背景类令牌、不要求壁纸插件让路;配色 / 边框 / 按钮 / 规则 / 文字 / 图层照常 |
| 预设主题 | 深海 / 暖阳 / 粉黛,走官方令牌通道,文字对比度经校验 |
| 绘制模式 | 在真实页面上可视化编辑 |
| 皮肤库 | 保存、重命名、排序、复制、加载、删除多个命名皮肤 |
| 导出 / 导入 | 皮肤包 .dshframework |
| 还原默认 | 清空整套皮肤并停用,回到 DSH 原生外观;皮肤库里已保存的皮肤保留 |
别人在画背景时用它:壁纸引擎、玻璃 / 背景类插件、桌面壳特效。开启后本插件变成页面上的客人——
canvas.background 背景图,也不写为此服务的表面透明规则;--dsw-alias-bg-*、--dsw-specific-sidebar-fill)——正是这些不透明表面会盖住别人的背景;html[data-dsh-skin],也就是不要求壁纸插件让路(让路会把用户的壁纸清掉,正是本模式要避免的)。在背景前面的一切照常:前景令牌(文字 / 边框 / 品牌 / 按钮)、css 规则、文字替换、注入图层、嵌入图。
令牌面板会把被跳过的条目标注为「兼容模式:不写」,绘制模式的实时预览同样遵守本模式,免得预览承诺一个保存后不会出现的背景。
自动开启:检测到壁纸插件 dsh-plugin-wallpaper-engine 时(读它常挂的 data-we-glass-page / data-we-adapter /
data-we-wallpaper),没表过态的皮肤自动进入兼容模式——装了就说明背景有人管,不必先让用户去找开关。
点一下开关即写入明确的开关状态(--dsh-myskin-compat: 1 / : 0),明确的决定永远盖过自动检测;
「还原默认」清空文档后回到自动。这条检测只读 DOM,不读对方任何配置,也不写它的任何标记。
背景图与背景类令牌仍然保存在文档里,关掉本模式即原样恢复;开关状态写成文档 css 里的标记 --dsh-myskin-compat,
因此不需要重启 DSH(新增顶层字段才需要)。
入口:设置 →「皮肤管理」→ 绘制模式。打开后设置弹窗关闭,真实页面内缩,顶部出现工具条,一侧出现面板(默认右侧)。 编辑直接作用于真实页面,不是副本。
body 的 margin,只影响应用自身的布局;第三方插件若把界面固定在窗口右侧(position: fixed),
不会跟随内缩,从而停在面板下方。换边即可解决。Esc 取消选择(再按退出并保存)、Ctrl/Cmd+Z 撤销、Ctrl/Cmd+Shift+Z 重做;输入框内不抢占按键。[role="treeitem"][aria-expanded])与对话行([role="treeitem"]:not([aria-expanded]))按 ARIA 语义区分,
不依赖构建期类哈希。面板显示将写入的选择器与当前命中数量;无法识别同类组时按钮不可用。
整组时另有间隔字段,只调整成员彼此之间的距离,第一个成员与容器顶部的距离不变;成员不是相邻兄弟时该字段不出现并说明原因。
文字替换始终只作用于当前元素。data-*、role)生成不带祖先路径的选择器,
适用于在对话、插件页、设置页各渲染一份的组件。画布为命中的每个元素描虚线框,按钮显示命中数量。
元素没有可复用标识或标识命中过多(超过 64 处,属布局类)时按钮不可用并说明原因。
只出现在设置页或插件页的元素,可先切到「交互」打开设置弹窗,再切回「选择」进行点选。body:has(<界面标记>) <组件标识> { display: none !important },
组件标识沿用「全站」的判定,因此"每个界面各渲染一份"与"单一全局节点"两种形态都适用。
设置弹窗使用 data-shortcut-modal;每个页面使用自身的语义标记(插件页 [data-plugin-panel],对话页 data-conversation-region 等)。
注意插件页不是设置弹窗的一页,需要用「本页」那一行单独控制。display,同一选择器上的其他声明原样保留,删空即整条消失。display 声明。即使移除已保存进皮肤,
恢复也立即生效——编辑器会量出元素本来的 display,在预览层中压过已提交规则,直到下次保存。--dsw-* 令牌与真实 CSS,深浅色主题自动跟随。transform。transform,元素上的宽高、内边距、字号等自定义保持原样;面板数字为只读镜像。
草稿样式表始终排在已提交样式表之后,保存后继续拖动不会被旧坐标覆盖。.woff2/.woff/.ttf/.otf(上限 30 MB)随皮肤保存;超过 2 MB 时提示代价。--dsw-font-family;
正文覆盖对话内容与 markdown(不写 !important,段落中的行内代码仍使用代码字体);代码走 --ds-font-family-code。
每行提供「本机」按钮,写入时附带同类兜底字体。[class*="_sidebarCol"])或 DSH 自身的 data-* 钩子(右侧栏 [data-sidebar-right-panel][data-sidebar-right-open] 与 [data-dockkit-pane]、
输入框 [data-composer-card]、设置页 [data-shortcut-modal]、消息列表 [data-conversation-content]),不写构建哈希。
右侧侧边栏是 DSH 自带的那一栏(文档预览 / 文件 / 浏览器 / 终端等面板)。它不是单个元素,所以锚点有三个:面板本身
[data-sidebar-right-panel][data-sidebar-right-open](「开始」引导态没有 pane,只有它能命中;[data-sidebar-right-open] 半截保证关闭时不留下色块——
那个容器关闭时仍挂在布局里)、已停靠的 pane [data-dockkit-pane] 与浮层 pane [data-dockkit-float](与面板拿同一个圆角,否则方角子元素会盖住圆角)。--dsh-myskin-panel:兼容模式据此只摘掉底色一条声明(圆角 / 模糊 / 边框 / 内边距照常),
手写规则不受影响。[class*="_markdown"],取类名语义半截),
并通过 :not([data-markdown-variant="compact"]) 排除工具预览与折叠思考的 compact 变体。--dsw-font-markdown-* 分量令牌,字号、行高、字重一起变化。data-conversation-content 内)。:root 上的 --dsh-myskin-variant,形如 radius=pill@composer):
读到某一处时,「全部区域」的选择打底、该处自己的选择覆盖其上,与页面上真实的层叠一致。--dsw-*。| 按钮 | 行为 |
|---|---|
| 保存 | 写入皮肤文档并留在绘制模式继续编辑,不改变皮肤的启用状态 |
| 应用 | 写入并启用,然后退出绘制模式 |
| ✕ 关闭 | 直接关闭并放弃未保存的改动(页面回到皮肤文档的状态);第二次 Esc 同义 |
| 还原默认 | 二次确认后把空文档写进皮肤文档(不只是丢草稿),页面真正回到原生外观;撤销栈留一步,Ctrl+Z 可把整套皮肤取回草稿 |
「导出皮肤」产出标准 ZIP(任何解压工具均可打开),配置与素材分开存放:
| 条目 | 内容 |
|---|---|
manifest.json |
完整配置:令牌、CSS、文字替换、画布、图层、皮肤库,以及格式版本、生成器、时间戳与资源清单 |
assets/… |
原始图片与字体文件(不是 base64) |
README.txt |
包内说明 |
assets/ 中的同名同格式文件,重新打包即可导入。.json 导出仍可导入;包内资源缺失或损坏会明确报错,不会导入不完整的皮肤。本插件是 profile bundle(包内自带
cordis.patch.yml,声明条目dsh-myskin),安装即"放入某个 profile 的node_modules并在该 profile 的dsh.profile.bundles中声明一次"。
打开 设置 → 插件(Plugins)→ 添加插件,填入下列任意一种地址,选择安装源后点「安装」:
| 输入 | 例子 | 说明 |
|---|---|---|
| GitHub 仓库地址 | https://github.com/WTStarMark/dsh-myskin |
走 git 安装;也可写 github:WTStarMark/dsh-myskin,需要固定版本时加 #v0.4.0 |
| npm 包名 | dsh-myskin |
走所选安装源(registry.npmmirror.com 为中国大陆镜像) |
| 本地目录路径 | ~/dsh-plugins/dsh-myskin-0.4.0 |
等价于 link:,修改源码即时生效 |
dsh-myskin 写入当前 profile 的 dsh.profile.bundles,不需要手动改配置。设置中出现 「皮肤管理」。
仅用命令行确认宿主半区(<pkg> 为实际安装目录):
node --input-type=module -e "const m = await import('<pkg>/lib/index.js'); console.log(Object.keys(m))"
# 期望输出:[ 'Config', 'apply', 'name' ]
插件包内自带 skills/dsh-myskin/SKILL.md,说明皮肤文档的字段与语义、绘制模式的各项契约、.dshframework 的读写格式与可逆性要求。
注册后助手在讨论、编写或排查皮肤时会自动加载:
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
ln -sfn /path/to/dsh-myskin/skills/dsh-myskin "$DSH_HOME/skills/dsh-myskin"
技能是目录包($DSH_HOME/skills/<名字>/SKILL.md,frontmatter 含 name / description / whenToUse),
由 skill-filesystem 提供者扫描并热监听,建立链接后不需要重启。删除该链接即注销,不影响插件本身。
dsh.profile.bundles 移除条目。卸载后刷新页面(改过 schema 的版本再重启一次 DSH)。cordis.patch.yml 中;需要彻底清理时先「导出皮肤」备份,再删除该条目。.dshframework 备份,换机器或换 profile 时导入即可。cordis.patch.yml(插件条目 dsh-myskin 的 config)。.dshframework 搬运。css 里的一条 :root 标记(--dsh-myskin-compat),
因此旧宿主也能保存,且与其它标记共用同一条 :root 规则。/dsh-myskin)在输入框输入 /dsh-myskin 即开始一次主题设计:宿主插件把一段引导交给助手,助手据此加载随包技能、确认偏好、给出方案并落地。
| 输入 | 结果 |
|---|---|
/dsh-myskin |
先询问四项偏好(明暗、主色或氛围、字体、是否需要图片),再给出 1–2 套方案 |
/dsh-myskin 深色 + 青色,界面用等宽字体 |
按给定方向直接进入方案设计 |
/dsh-myskin 做成浅色纸质,正文要衬线 |
同上,方案写到令牌级(背景、表面、边框、文字档位、品牌色) |
交付内容包括:使用的令牌与规则、对比度校验结果(正文 ≥ 4.5:1 等底线)、还原方式、导出 .dshframework 备份的方法。
落地方式有两种:由助手生成 .dshframework 后在「皮肤管理 → 导入皮肤」中选择,或给出可粘贴的清单手动填写。
助手不会直接修改 profile 配置:皮肤文档存放在其中,属于只读范围;所有改动都由你在界面中确认。
前提:该命令在 0.3.9 加入宿主半区,升级到该版本或更高需要重启一次 DSH 才会出现在 / 菜单中;仅样式与预设的升级不需要重启。
另需注册随包技能(见上节)。
Q:启动时报 dsh-myskin (dsh-myskin): failed to import?
该信息由 DSH 启动器在 Loader 未取得 fiber 时记录,真实异常被吞掉。按顺序排查:
$PROFILE/node_modules/dsh-myskin,其中应能看到 lib/index.js 与 cordis.patch.yml;node --input-type=module -e "await import('<pkg>/lib/index.js')",能打印 Config,apply,name 即正常
(lib/index.js 自带依赖,解压、拷贝、软链三种装法都不需要 node_modules);dsh.profile.bundles 中是否写入了 dsh-myskin;Q:点「应用」提示保存失败?
多为文档过大。壁纸与嵌入图会按最长边自动压缩,嵌入字体按原样保存:超过 2 MB 会明显拖慢每次保存,过大时可能被拒绝。
建议整站字体使用系统字体名,或使用子集化后的 .woff2。
Q:提示「保存失败:canvas」?
该提示表示画布字段被宿主拒绝(css 通常同时写入成功)。最常见原因是宿主 schema 比客户端旧,即安装了新版本但未重启 DSH:
客户端已写入新字段(例如锚点类型 group),运行中的宿主仍按旧 schema 校验,从而拒绝整个 canvas 字段。两种处理方式:
① 重启 DSH 后刷新页面(重启会结束当前会话);② 先不改该设置,把相关图片的锚点从「整组」改回「元素」再保存。
若画布数据确实很大(面板会显示约多少 KB),则属于体积问题,改用更小的图片。
Q:装了新版本需要重启 DSH 吗?
宿主半区(lib/index.js,负责 schema 与设置落盘)的变更需要重启;客户端半区(lib/client.js)在本机为热更新,
刷新页面即可。因此:只改样式、预设与绘制模式的版本只需刷新页面;改动字段 schema 的版本需要重启 DSH。
Q:预设主题会不会让文字看不清?
不会。三套预设的文字档位都按其实际所在背景计算过对比度:正文与次级 ≥ 4.5:1(WCAG AA)、三级 ≥ 3:1、
caption ≥ 2.6、dimmed ≥ 2.2;主按钮与对比按钮的文字同其填充色 ≥ 4.5;品牌色在主背景上 ≥ 3。
这些底线由 tests/preset-contrast.test.mjs 校验。三套预设均跟随应用的明暗模式,各自配色完整。
回到原生外观可使用「默认」或关闭「启用皮肤」。旧版内置的「极夜」(强制两种模式都为深色)已移除,
但使用它的令牌保存过的皮肤照常生效(文档保存的是令牌值,界面显示为「自定义皮肤」)。
Q:点了「本机字体」弹出授权或列表很短?
Chromium 内核使用 Local Font Access API 枚举本机字体,首次需要授权;拒绝授权或浏览器不支持该接口时, 自动退化为候选字体探测,列表顶部会标明来源。授权可在浏览器的网站设置中修改,刷新页面后重新点击按钮即可。
Q:改了没效果?
确认「启用皮肤」已打开;确认当前 profile(Web 中修改的内容不会出现在 Desktop);可先在绘制模式里确认改动本身有效。 若改的是背景图或背景类令牌,确认「兼容模式」没开——开了它就不接管背景。
Q:绘制模式里设置弹窗位置异常?
绘制模式下真实页面会内缩,设置弹窗遵守同一条内缩规则,因此它居中于应用区域内,而不是被工具条或面板遮挡。
Q:某个插件的面板被绘制模式挡住,无法操作?
点击工具条的「⇤ 面板靠左」或「⇥ 面板靠右」:页面内缩与面板一起换边,被压住的组件随即可见。 被压住时工具条第二行会显示被遮挡的元素名,该行本身即换边按钮。
Q:如何恢复原生外观?
「皮肤管理 → 还原默认」清空整套皮肤并停用,或关闭「启用皮肤」。两者都不影响 DSH 自身,也都不动皮肤库里已保存的皮肤。 绘制模式里的「还原默认」做同一件事(写进皮肤文档),只是入口在工具条上。
| 项目 | 状态 |
|---|---|
DSH 0.2.0-rc.2 |
已适配 |
DSH 0.2.0-rc.1 |
已适配 |
DSH 0.1.7-rc.2 |
已适配 |
| 平台 | DSH Web 与 DSH Desktop(Windows / macOS / Linux 的桌面壳同理) |
DSH < 0.1.7 |
不支持(0.1.7 起才有本包使用的 Config 与 profile bundle 形态) |
本项目声明并实测兼容 elysia395/dsh-wallpaper-engine(下称"壁纸引擎",对照 1.3.0-r2):
data-we-glass-page / data-we-adapter / data-we-wallpaper),
不画自己的壁纸与背景类令牌,把背景整块留给它;点一下开关即明确关闭,且这个决定盖过自动检测。html[data-dsh-skin],它的壁纸、玻璃、轮播一概不动。body[data-we-wallpaper]),本插件不画第二个壁纸,等它让出画布再画。两个插件都要画同一片像素时,靠 DOM 标记约定,谁也不 import 谁(对方可能没装、版本更旧或更新)。
壁纸插件 dsh-plugin-wallpaper-engine(1.3.0-r2 起):该插件的客户端观察 documentElement 上的
html[data-dsh-skin],看到标记就让路——清掉自己的壁纸层、把玻璃整族摘掉,并把用户选的壁纸记下来,
等标记消失后放回(它有 450ms 进场、2.6s 复位两道滞回)。本插件的行为:
html[data-dsh-skin="dsh-myskin"],停用 / 还原 / 卸载时摘掉;
另一个皮肤插件写的同名标记只读不写,绝不覆盖或删除。body[data-we-wallpaper])时,本插件不画自己的画布壁纸与那一层表面透明,
其余令牌 / 规则 / 文字 / 图层照常生效;标记一变就重新评估,对方让出画布后壁纸自动回来。html[data-dsh-skin],因此对方的壁纸、玻璃一概不动,
本插件也不画背景与背景类令牌,两边各管各的。这是那条自动互操作的手动退出。代价与边界:绘制模式的实时预览层按草稿作画,不跟随这条让位规则;皮肤在台期间壁纸插件不显示壁纸,
这是对方设计好的语义(它保留了用户的选择,不会丢)。
以上两条由 tests/interop.test.mjs 钉住。
MIT © WTStarMark · 仓库:https://github.com/WTStarMark/dsh-myskin
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。