dsh-web
zhu1090093659
DeepSeek Harness (DSH) Web 插件聚合生态 · 万物皆插件,通过创意工坊分发||DeepSeek Harness (DSH) Web Plugin Aggregation Ecosystem · Everything is a plugin, distributed via the Creative Workshop
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:aklnaaw/dsh-claude-theme
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
![]() |
![]() |
|---|
我看鲸小妹和克小妹也是一对苦命鸳鸯啊。
Anthropic 觉得侵权可以联系我下架。
把 DSH Web GUI 的观感重做成 claude.ai 应用界面的样子:暖米色画布、衬线正文、珊瑚色强调。
本仓库分发三个产物,其中两个插件完全独立于皮肤,可以单独安装:
| 产物 | 位置 | 需要皮肤中心? | 安装方式 |
|---|---|---|---|
| 皮肤 | claude/ |
需要 | 拷贝到 $DSH_HOME/skins/claude/,在设置里选中 |
| Claude 插件 | brand-plugin/ |
不需要 | dsh plugin --profile web add link:<绝对路径> + 重启 |
| Clawd 插件 | crab-plugin/ |
不需要 | dsh plugin --profile web add link:<绝对路径> + 重启 |
皮肤是纯资源目录,不含任何可执行代码,由第三方皮肤中心 @linxin666/dsh-client-ui-skin-center 读取和渲染。它必须通过皮肤中心加载——这是皮肤这类产物的唯一入口。
两个插件不经过皮肤中心,它们是普通的 Cordis 客户端插件,由 DSH 自己的插件系统加载。它们只依赖官方的东西:
| 插件 | Cordis 服务 | CSS 变量 |
|---|---|---|
brand-plugin |
slots |
--dsw-*(官方主题服务提供) |
crab-plugin |
timer |
--dsw-* + 自己定义的 --dcc-* |
关键点:两个插件都不引用任何皮肤变量(皮肤变量是 --cl-* 前缀,引用次数为 0)。Clawd 插件的像素帧数据是内置的,不依赖皮肤提供。
所以可以只装插件、不装皮肤——蟹和品牌替换照常工作,只是配色会跟随你当前用的主题。反过来只装皮肤不装插件也可以,皮肤自带问候语旁的像素粒子。
为什么品牌替换不做成皮肤的一部分:本地皮肤无法运行 hooks.mjs(加载器只对官方市场来源放行,见已知限制),而换品牌标记需要替换插槽占用者,那是插件才能做的事。
状态:三个产物都已在本机实测生效——皮肤校验零告警,Claude 插件与 Clawd 插件均已 link: 进 web profile 并通过真实页面 DOM 验证(侧栏是 Claude 星芒 SVG + 文字字标;输入框上沿有可交互的 Clawd)。


上图为真实运行界面的截图(1440×900)。采样验证:亮色画布 rgb(250,249,245) = #faf9f5,暗色画布 rgb(24,23,21) = #181715,均为设计值。
#faf9f5 取代默认的冷灰白,层级用 #f5f0e8 / #efe9de / #e8e0d2 逐级压深。#181715,不是纯黑。box-shadow 像素画——不是图片、不发请求、不占资产体积,且完全跟随主题色。分两层:crab-plugin/):把同一只蟹换成可交互的真元素——眼睛跟随鼠标(四向帧)、空闲眨眼、戳一下会跳起来说一句话。body:has(.dcc-crab) 判断插件蟹是否真的在 DOM 里,在则让位、不在则自己顶上。所以任何一边失败,结果都是恰好一只蟹,不会出现两只、也不会一只都没有。[data-composer-card])。原因见下方「已知限制」。patches.css 用 L3 自由选择器重排圆角、输入框、卡片与滚动条。moon 和内置头像;只存在这台浏览器里,不上传。只对没有记录的新用户生效——主动清空不会被默认值覆盖。dsh-claude-theme/
├── claude/ # 皮肤(纯资源目录)
│ ├── skin.json # 清单 v2:id=claude、accent=#d97757、contributes
│ ├── skin.css # 278 个 --dsw-* token(亮 + 暗)+ @font-face
│ ├── patches.css # L3 自由选择器补丁
│ ├── assets/fonts/ # 自托管字体(latin 子集,共 364 KB)
│ │ ├── newsreader-normal.woff2 # 可变字重 200–800
│ │ ├── newsreader-italic.woff2 # 可变字重 200–800
│ │ ├── inter-normal.woff2 # 可变字重 100–900
│ │ ├── jetbrains-mono-normal.woff2 # 可变字重 100–800
│ │ ├── fonts.generated.css # build-fonts.sh 的产物,被 gen-skin-css.py 内联
│ │ └── build-fonts.sh # 重新下载上述 woff2
│ ├── preview/ # 预览图(1440×900)
│ │ ├── light.jpg
│ │ └── dark.jpg
│ ├── crab.generated.css # 问候语像素粒子(gen-crab.py 生成,勿手改)
│ └── patches.base.css # 手写的 L3 选择器层(patches.css 的输入)
├── crab-plugin/ # Clawd 插件 dsh-claude-crab(自包含)
│ ├── package.json # 声明 dsh.bundle.patch 与 dsh.client.platform=web
│ ├── cordis.patch.yml # 向 web roster 插入 dsh-claude-crab 行
│ ├── LICENSE # MIT + Clawd 署名
│ ├── README.md # 插件自己的说明
│ ├── docs/preview.png # 插件预览图
│ └── lib/
│ ├── index.js # host 半边:有意留空
│ └── client.js # 浏览器半边:内置像素帧 + DOM 挂载
├── pet/ # 宠物系统用的 Clawd(图集 + 清单)
├── brand-plugin/ # Claude 插件 dsh-claude-brand
│ ├── package.json # 声明 dsh.bundle.patch 与 dsh.client.platform=web
│ ├── cordis.patch.yml # 向 web roster 插入 dsh-claude-brand 行
│ ├── assets/default-avatar.webp # 内置默认头像(内联 data URL 的源文件)
│ └── lib/
│ ├── index.js # host 半边:有意留空(无 host 状态、无 RPC)
│ └── client.js # 浏览器半边:slot + 文案改写 + 名字头像编辑器
├── cover/ # 封面图,两套配色
│ ├── cover-light.png # 1920×1080,16:9,做视频封面
│ ├── cover-dark.png
│ ├── social-light.png # 1280×640,2:1,给 GitHub 仓库卡片
│ └── social-dark.png
├── scripts/
│ ├── gen-skin-css.py # 由调色板重新生成 claude/skin.css
│ ├── gen-crab.py # 生成问候语粒子并合成 patches.css
│ ├── gen-pet.py # 生成 Clawd 宠物目录的图集与清单
│ ├── gen-cover.py # 按两种比例渲染封面图
│ ├── gen-brand-avatar.py # 把默认头像切进 Claude 插件
│ ├── cover-assets.json # gen-cover.py 用的品牌图形数据
│ └── validate-skin.mjs # 用真实 skin-center 清洗器校验皮肤
├── README.md # 本文件
├── README.en.md # 英文版
├── INSTALL.md # 逐步安装与排错
├── LICENSE # MIT(代码/CSS)+ 字体与商标声明
└── .gitignore
scripts/ 的用法见 scripts/README.md。
需要先装好皮肤中心插件 @linxin666/dsh-client-ui-skin-center(本皮肤在 v0.3.23 上测试)。
拷贝整个 claude/ 目录到 $DSH_HOME/skins/ 下,目录名保持 claude:
# DSH_HOME 默认是 ~/.dsh
cp -r claude "$HOME/.dsh/skins/claude"
然后在 GUI 里打开 设置 → 皮肤中心,选中 Claude。切换是即时的,不需要重启。
验证是否被发现:
curl -s http://127.0.0.1:3080/api/skin-center/v2/catalog \
| python3 -c "import json,sys; print([ (s['manifest']['id'], s.get('warnings')) for s in json.load(sys.stdin)['skins'] if s['manifest']['id']=='claude' ])"
应输出 [('claude', [])] —— 注意 warnings 为空。
已在本机真实页面验证生效。尚未在干净环境里装过一遍。
dsh plugin --profile web add link:/path/to/dsh-claude-theme/brand-plugin
# 然后重启 DSH 一次(客户端插件在启动时加载,不能热切换)
包名 dsh-claude-brand。插件做六件事:
sidebar.brand.mark 和 conversation.hero.brand.mark 上以优先级 -10 注册,遮住官方占位的鲸鱼 logo,换成内联 SVG 的 Anthropic/Claude 放射状星芒标记(currentColor,随主题变色)。sidebar.brand.name 上把官方的字形轮廓替换成真文字 "Claude"。<link rel="icon">,浏览器会退回请求 /favicon.svg——那是 DSH 安装目录里的鲸鱼,升级会被覆盖。插件改为自己声明星芒,不去改不属于自己的文件。关于优先级:slot 遮蔽是数字越小越优先渲染,所以 -10 压过官方品牌插件的 0;同优先级注册 single slot 会直接抛错。
dsh plugin --profile web add link:/path/to/dsh-claude-theme/crab-plugin
# 同样重启 DSH 一次
包名 dsh-claude-crab。它不依赖皮肤——像素帧内置,配色走官方 --dsw-* 变量,所以单独装也能用。
装完应当恰好一只蟹:皮肤用 body:has(.dcc-crab) 检测插件蟹是否在 DOM 里,在则让位。任何一边失败,结果都是一只蟹,不会两只也不会零只。
完整的安装与排查步骤见 INSTALL.md。
嫌麻烦可以丢给dsh或者Claude Code和codex让他们装
hooks.mjs。 加载器对任何没有官方市场来源的皮肤直接拒绝,返回 HTTP 403 hooks-require-review。这就是品牌替换只能做成独立插件、而不是皮肤钩子的原因。@import、远程/协议相对 URL、绝对路径、../ 逃逸都会被清洗器拒绝(422)。字体只能放在皮肤目录内、用相对路径引用。conversation.input.overlay,但 slot 渲染抛错会被错误边界吞掉——插件确实加载了(皮肤让位),蟹却没出现,且看不到任何报错。现在改为直接挂到官方的 [data-composer-card] 上,自己完全掌握元素生命周期。代价是耦合 composer 的 DOM 契约而非 slot 体系;若该属性变更,插件蟹消失、皮肤蟹自动接管。html[data-dsh-skin="claude"] 前缀,所以皮肤只能影响选中时页面,不会污染其他皮肤。LICENSE。claude/assets/fonts/。scripts/gen-crab.py 从像素点阵数据生成,不含任何图片文件。点阵几何源自酒馆扩展 claude-web,作者 claudenoshujin——原像素美术的功劳归该作者。本项目只复用几何数据,未从该仓库复制任何文件;选择器、动画、配色、摆放均为自写。@linxin666/dsh-client-ui-skin-center:提供了皮肤加载、清单校验、CSS 清洗与热切换的整套机制。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: claude-code、dsh-skin、theme。