Uplink

August 14, 2026 · View on GitHub

DeepSeek Harness Web 的赛博朋克表现层皮肤:深靛蓝夜 × 电光青/品红/霓虹紫, CRT 扫描线,玻璃面板,右下角霓虹壁纸,终端式 Uplink It ... 输入框占位符动画。

所有效果都以 body[data-dsh-uplink] 作用域叠加,不改动 DSH 任何内置行为; 卸载插件即可完整还原。


目录


效果一览

  • 双主题令牌体系:暗色 = 霓虹夜,浅色 = 霓虹白昼(冰白蓝 + 电光点缀)
  • 字体:按钮/标题 Orbitron + 站酷庆科黄油体(中文),正文 Rajdhani, 代码 JetBrains Mono —— 全部自托管内嵌,离线可用
  • 全局质感:暗色 CRT 扫描线、四角霓虹辉光、霓虹选中/聚焦态
  • 玻璃面板:主表面半透明,右下角壁纸从面板后透出
  • 壁纸:右下角锚定,双向渐变 mask(从右到左、从下到上 → 0%),无硬边
  • 占位符动画Uplink ItUplink It .Uplink It ..Uplink It ... 循环闪动;prefers-reduced-motion: reduce 时静态

工作原理

皮肤 = 一个 DSH 插件包(bundle)

  1. cordis.patch.yml 声明一条接线(id ui-skin-uplink), 包名和接线名在 package.jsondsh.bundle.patch 中关联;
  2. dsh plugin --profile web add <包> 会先转交 pnpm add 把包装进 web profile 目录,然后自动扫描依赖:凡是声明了 dsh.bundle.patch 的包, 都会被追加进 profile 清单的 dsh.profile.bundles 层;
  3. dsh web 启动时按 bundles 层叠加载插件:宿主侧加载 lib/index.js (本皮肤为空操作),浏览器侧通过模块系统拉取 lib/client.js
  4. 客户端插件给 <body> 打上 data-dsh-uplink,注入内嵌样式(字体 + 令牌调色板 + 特效),所有规则都以该属性作用域,卸载即整体消失。

因为内嵌了全部素材(字体、壁纸均为 data URI),运行期零网络请求


安装

前置条件

依赖版本建议说明
DeepSeek Harnessdsh CLI 的版本执行 dsh --help 能出帮助即可
pnpm≥ 10dsh plugin 只是 pnpm 的转发器,必须能 pnpm --version
Node.js≥ 20(推荐最新 LTS)构建/安装皮肤需要

适合快速体验和二次开发。请先确认包名 scope 与作者信息已按 开源发布清单换成你自己的值。

# 1. 克隆到本地
git clone https://github.com/<你的账>/dsh-uplink-skin.git
cd dsh-uplink-skin

# 2. 构建(可选,link 安装时也会自动跑 prepare;手动跑一次能提前暴露问题)
pnpm install
pnpm check            # 类型检查 + 单元测试 + 构建

# 3. 以 link 方式装进 web profile
dsh plugin --profile web add link:"$(pwd)"

# 4. 重启(或启动)web
dsh web

link: 是 pnpm 的符号链接安装:之后你改 src/ 里的代码, 重跑 pnpm build,刷新浏览器即可看到效果,不需要重新安装。

方式二:直接从 GitHub 安装

不想克隆仓库,一步装:

dsh plugin --profile web add "github:<你的账号>/dsh-uplink-skin"
dsh web

注意(pnpm ≥ 10 会拦构建脚本):git 依赖安装时通过 prepare 脚本 构建 lib/,pnpm 默认拦截。首次安装若报 Ignored build scripts / prepare 被阻止,按 CLI 的提示把包名加入 web profile 目录下 pnpm-workspace.yamlallowBuilds,再重跑一次:

# 提示会给出精确的 key,例如:
#   dsh-uplink-skin+github.com+<账号>+dsh-uplink-skin
dsh plugin --profile web add "github:<你的账号>/dsh-uplink-skin"

也可以用 git+https://github.com/<账号>/dsh-uplink-skin.git 形式, 效果相同。

方式三:发布到 npm 后安装

发布到 npm registry 后(见开源发布清单), 任何机器只需:

dsh plugin --profile web add <你的-npm-包>
dsh web

验证安装

  1. 打开 dsh web 的地址(默认 http://127.0.0.1:3080), 硬刷新(macOS:Cmd+Shift+R;Windows/Linux:Ctrl+Shift+R);
  2. 浏览器标签标题变为 Uplink · DeepSeek Harness
  3. 界面呈霓虹配色;输入框占位符在 Uplink ItUplink It ... 间循环;
  4. 右下角出现渐变壁纸(无硬边);
  5. 设置 → 常规 → 外观的 浅色 / 深色 / 跟随系统 依旧可用—— 皮肤同时定义了两套调色板,切换主题会得到对应的霓虹白昼 / 霓虹夜。

如果什么都没变,先看常见问题


更新与卸载

# 更新到最新版(npm / git 安装均可)
dsh plugin --profile web update <>

# 卸载:从 profile 移除依赖,bundles 层会同步自动清理
dsh plugin --profile web remove <>
dsh web                      # 重启后还原为默认 UI

卸载后所有效果消失,无残留(皮肤只改 DOM/样式,不写任何用户数据)。


常见问题

Q:装上了但界面没变化? 依次检查:

  1. 是否硬刷新(皮肤资源按 rev 缓存);
  2. profile 清单里是否有本包:dsh plugin --profile web add 成功后, 包会出现在 profile 目录 package.jsondependenciesdsh.profile.bundles 中;只有声明了 dsh.bundle.patch 的包才会 进入 bundles 层——被装了却没进层时,终端会打出 declares no dsh.bundle 警告;
  3. 包是否真的构建出了 lib/client.js(本地 link 安装时确认跑过 pnpm build)。

Q:git 安装报 build script 被拦截?方式二把包名加入 profile 的 pnpm-workspace.yamlallowBuilds,重跑安装命令。

Q:标题没变成 Uplink? 标题是皮肤挂载的标志之一;没变说明 client 插件没跑起来, 回到上一问的第 2、3 条检查。

Q:壁纸想换自己的图? 替换 assets/wallpaper.webp(建议 2:3 竖图、WebP),非 2:3 时同步改 src/client/uplink.module.css 里的 --dsh-uplink-wall-ratio, 然后 pnpm embed && pnpm build(本地 link 安装)或提交后更新包。

Q:和其它皮肤冲突吗? 每个皮肤各占一个 body 属性与接线 id,理论上可共存; 但同一时刻叠加多套调色板会互相覆盖,建议一次只装一套。


参数微调

壁纸与渐变参数都集中在 src/client/uplink.module.css--dsh-uplink-wall-* 变量里:

变量默认含义
--dsh-uplink-wall-size-x85vw壁纸宽度上限
--dsh-uplink-wall-size-y85vh壁纸高度上限
--dsh-uplink-wall-ratio1000 / 1506图片宽高比
--dsh-uplink-wall-hold35%渐变保持全显的占比(调小 = 淡得更早)

修改后 pnpm embed && pnpm build

占位符动画:基文本 Uplink It 与步进周期(450ms)在 src/client/index.ts 顶部的常量里。


开源发布清单

推送 GitHub / 发布 npm 之前:

  1. 替换占位符(四处保持一致):
    • skin.jsonauthor 字段,package 的 scope 改为你的 scope
    • cordis.patch.ymlname 与上面包名一致
    • package.jsonnameauthor
    • LICENSE:版权行改为你的年份与名字
  2. 预览图preview/dark.svg 换成真实截图(≤ 5 MB)
  3. 壁纸版权assets/wallpaper.webp 出处未确认(见 ASSET_LICENSE.md),无法确认就删除并换成自己的素材
  4. 验证一次全链路pnpm check + 方式一安装 + 硬刷新确认效果
  5. 发布 npm(可选):npm publishfiles 已包含 lib/prepare 会在发布前自动构建)