READMESource: main@268d50b5
dsh-jarvis-boot
贾维斯风格的 DSH 开机动画。全屏方舟反应堆 HUD:环系生长 → 启动日志逐行打出 → 进度条走满 → 停在「系统就绪 / SYSTEM READY」,点一下(或回车)淡出,进主界面。


特性
- 3.4 秒完整节拍:环系旋转、刻度、启动日志、遥测读数、进度条,全部按时间轴推进。
- 不锁界面:播放中按
Esc直接跳就绪;就绪后点任意处 /Enter/ 空格进入;播放中也可以点「跳过引导」。 - 零依赖、单文件:
lib/client.js约 20KB,没有构建步骤,没有外部字体或图片。 - Shadow DOM 隔离:样式不会漏进宿主,宿主的样式也压不扁 HUD。
- 闸门式转场:点进主界面时,覆盖层从中间一分为二向上下滑出,接缝带一条金色发光线。
- 内置皮肤:附带
jarvis主题(暖黑底、金强调、红主按钮),在「设置 → 通用 → 外观」里选上就是同一套味道。 - 可关:
window.__JARVIS_BOOT_DISABLED__ = true直接不挂载;或从 profile 的bundles里删掉本插件。 - 尊重系统偏好:检测到
prefers-reduced-motion: reduce时直接进就绪态。
安装
先确认你有一个可用的 DSH profile(默认 desktop)。
从 GitHub 装(pnpm)
cd "$DSH_HOME/profiles/desktop"
pnpm add github:Faustinchain/dsh-jarvis-boot
然后把这两处补上:
package.json的dsh.profile.bundles数组里加"dsh-jarvis-boot";- 确认
cordis.patch.yml里有一行 insert(本包自带的 patch 会自动生效,若没生效就手动加):
- insert:
- id: jarvis-boot
name: 'dsh-jarvis-boot'
重启 DSH,打开 Web GUI 就能看到。
本地开发
# 把仓库放进 profile 的 node_modules,并按上面的步骤登记
Copy-Item .\lib "C:\Users\<you>\.dsh\profiles\desktop\node_modules\dsh-jarvis-boot\lib" -Recurse
改完 lib/client.js 后重启 DSH 生效。
内置皮肤
插件会在页面加载时把一套 jarvis 配色直接写进样式表:暖黑底、金色强调、红色主按钮、金描边、暗红气泡。宿主把 --dsw-* token 定义在 body 和 body[data-ds-dark-theme] 上,插件在 head 末尾追加一条带 !important 的覆盖,所以浅色、深色两张表都会被压住,不需要手动选主题。
如果宿主暴露了主题服务,插件也会顺手注册一个同名主题,在 设置 → 通用 → 外观 里能看到 jarvis;有它就能一眼切回深色。
不想要这套皮肤,在控制台执行一次即可,之后每次加载都会尊重这个选择:
localStorage.setItem("dsh-jarvis-boot:skin", "off");
想恢复,删掉这条记录或把它设回 "on"。
调试入口
页面里有一个调试对象:
window.__JARVIS_BOOT__.seek(1800); // 跳到第 1.8 秒
window.__JARVIS_BOOT__.skip(); // 直接进就绪
window.__JARVIS_BOOT__.dismiss(); // 立刻关掉覆盖层
window.__JARVIS_BOOT_DISABLED__ = true; // 下次加载不再播放
工作方式
宿主(@deepseek-ai/dsh-client-modules)会把 profile 里每个插件的 client bundle 合成一个 combo 下发。本包做了三件事:
package.json用dsh.client声明这是 web 端插件,exports["./client"]指向构建好的lib/client.js;lib/client.js调window.__ModuleLoader__.load({ id, factory })注册apply(ctx)/inject,apply里用ctx.effect(() => mount())挂载覆盖层并返回卸载函数;cordis.patch.yml把插件 insert 进 profile 的 loader。
inject 为空——不需要任何插槽、路由或服务,挂载完全靠客户端自己。
仓库结构
lib/client.js 浏览器端:HUD、时间轴、交互(全部逻辑都在这里)
lib/index.js Node 侧:空插件,只为满足 loader
cordis.patch.yml profile 挂载行
test/preview.html 离线预览器:stub 掉 ModuleLoader 直接跑 client.js
test/shot.mjs CDP 截图脚本(配合 headless Edge)
docs/ README 截图
已知限制
- 每次页面载入都会播一次(不是每次应用启动一次);如果你想「每次启动只播一次」,需要在 client 里加一层 sessionStorage 判断。
- 播放期间是全屏覆盖,和别的开机动画插件同时启用会互相抢屏幕——建议只留一个。
License
MIT
No comments yet. Be the first to write one.