# Archived development notes Historical snapshots retained from the previous README. They include obsolete installation, dependency and caching claims, plus developer-specific paths. Use the [current README](../README.md) and current source for installation and security decisions; these notes are not current instructions. --- > **这是发布副本。** 里面只有运行插件需要的东西。作者开发副本里的自检套件 > (`tools/verify-*`)与绑定了开发机路径的安装脚本**不随包发出**——下文提到它们 > 的地方属于开发记录。**安装请从 [INSTALL.md](../INSTALL.md) 开始。** > > 下文中出现的绝对路径都是**作者机器的开发记录**,不是给你的操作指令。 # dsh-boot-animation DSH 启动加载动画:短片**片尾交叉溶解进界面**、多片随机、启动进度可见、启动失败有兜底,**淡入时长 / 进入方式 / 素材池都在「设置 → 插件」里可调**。**不改 DSH 本体源码**,升级 DSH 不受影响。 ## 先看哪一份 | 文档 | 给谁 | 内容 | |---|---|---| | **[MANUAL.md](../MANUAL.md)** | 用它的人 | 设置在哪、怎么换片子、徽章什么意思、出问题怎么办 | | **[AGENTS.md](../AGENTS.md)** | 接手维护的人 / AI | 架构、**不许破坏的规则**(每条都是踩出来的)、改动后要不要重启、怎么自检 | | 本文件 | 想追根究底的人 | 每个坑的完整来龙去脉与证据 | 下面这份是全景记录,篇幅长;日常使用看 MANUAL 就够。 ## 怎么装上(给使用者) > 这一节是**能照着做**的完整说明。更详细的版本在 [INSTALL.md](../INSTALL.md), > 日常使用看 [MANUAL.md](../MANUAL.md)。 ### 你需要什么 | 条件 | 说明 | |---|---| | **DSH** | **必须 `0.2.0-rc.2` 或更新**。这一版改了插件的设置契约(改为在模块上声明 `Config`,不再注册命名空间),更旧的版本装不上;本包在 `package.json` 里声明了 `>=0.2.0-rc.2`,官方安装器会直接拒绝并说明原因 | | **Node.js** | `^22.19.0` 或 `>=24`(DSH 自己就要求,通常已经有了) | | **git** | 只有下面「路 A 贴 GitHub 地址」才需要 | | 浏览器 | Chromium 内核(Chrome / Edge)。Firefox 没测过 | ### 路 A:官方「添加插件」页面(推荐) **设置 → 插件 → 添加插件**,在输入框里贴以下任意一种,等它装完、按提示重启: | 贴什么 | 例子 | |---|---| | **npm 包名** | `@ljwei-stak/dsh-boot-animation` ← 装这个就行 | | GitHub 仓库地址 | `https://github.com/Alice-Marx/dsh-boot-animation`(简写 `github:Alice-Marx/dsh-boot-animation` 也行) | | 本地目录 | 解压出来的目录的**绝对路径**(注意下面那个坑) | | 离线包 | `xxx.tgz` 的路径或网址 | 这条路装的是「包」:pnpm 会把依赖一起装好(包括设置卡片要用的 `@deepseek-ai/schemastery`),DSH 会把它加进 profile 的插件层, **不需要手改任何配置文件**,桌面版和 `dsh web` 都能用。 > **本地目录这一路有个坑**:pnpm 把裸目录路径按「链接」处理(`package.json` 里记成 > `link:C:/...`),只建一个软链,**不装这个目录自己声明的依赖**。所以那个目录必须已经 > 是装好依赖的状态——先在里面跑一次 `npm install`,否则 `entry.js` 静态 import 的 > `@deepseek-ai/schemastery` 解析不到,装上也不会有任何反应。想省事就用 npm 包名、 > GitHub 地址或 `.tgz`,那三条路的依赖全自动。 ### 路 B:官方命令行 ```sh dsh plugin --profile web add @ljwei-stak/dsh-boot-animation ``` 和路 A 是同一条官方通道,装完**重启一次 DSH**。 > 桌面版(DSH Desktop)的 profile 名叫 `desktop`,这个命令不允许直接改它 > (会报 `managed exclusively by the Electron application`)。**桌面版请走路 A。** ### 路 C / 路 D:脚本(免 pnpm) ```powershell powershell -ExecutionPolicy Bypass -File tools\install.ps1 -ProfileName desktop # Windows ``` ```sh sh tools/install.sh --profile desktop # macOS / Linux(桌面版 profile) sh tools/install.sh # 不带参数则用于 dsh web ``` 脚本自己找 DSH 的位置(先看 `DSH_HOME`,再找用户目录下的 `.dsh`),在 profile 里建目录 链接、追加一行配置,并把设置卡片需要的 `@deepseek-ai/schemastery` 链上(要求 **3.18.4 及以上**,要有 `.volatile()` 才有设置卡片)。**不跑 pnpm、不改 `package.json`。** 找不到 profile 会明确报错并列出有哪些;装之前自动备份 `cordis.patch.yml`。 > **`-ProfileName` 一定要按你实际在跑的 DSH 填**:桌面版(DSH Desktop)跑的是 `desktop`, > `dsh web` 跑的是 `web`。脚本默认找的是 `web`。填错了会装到没人用的那个 profile 上。 ### 装完检查 1. **重启一次**(`entry.js` 的改动由 DSH 进程启动时加载,只刷新页面不生效),然后刷新浏览器 2. 看到深海底背景 + 一条短片铺满窗口 → 装好了 3. 进 **设置 → 插件**,找到「启动动画」这一行(默认收起),点开能看到 「淡入时长 / 进入方式 / 素材池」三节 → 完全正常 4. **看不到这一行** → 设置卡片没注册上。贴 npm 包名 / GitHub / `.tgz` 装的话依赖是 pnpm 跟着装的(本包声明 `^3.18.4`),几乎不会遇到;只有「本地目录」路和脚本路可能是 链接指到了旧副本。查 DSH 控制台里 `boot-animation:` 开头的黄色告警,照那句话把 `node_modules\@deepseek-ai\schemastery` 换成 3.18.4+ 的那份即可。 ### 换掉自带的片子 包里四段 mp4 随 MIT 一起给你,**可以直接换**:把你的视频丢进 `assets/videos/` (认 `.mp4` `.webm` `.m4v` `.mov`,推荐 H.264 + AAC 的 mp4),在设置卡片的素材池里看 那一行有没有黄色 **`未优化`** 徽章(有的话说明 `moov` 在文件尾,浏览器要下完整个文件才 出画面),双击 `tools\apply-faststart.bat` 处理一下,刷新页面即可。不想留作者的片子, 直接删掉那四个 `.mp4` 再放自己的——池子空了也不会卡住,只是没有画面。 ### 卸掉 | 想要 | 怎么做 | |---|---| | 暂时不要动画 | 设置卡片里关掉「开启启动动画」(**不注入任何东西**,回到原生启动页) | | 摘掉插件(路 A / B 装的) | 官方「插件」页面上卸,或 `dsh plugin --profile web remove @ljwei-stak/dsh-boot-animation`,然后重启 | | 摘掉插件(脚本装的) | `tools\uninstall.ps1 -ProfileName desktop` / `sh tools/uninstall.sh --profile desktop` | | 彻底删掉 | 先跑上面的卸载,再删掉整个目录 | 依赖(含设置卡片要用的 `@deepseek-ai/schemastery@^3.18.4`)由 pnpm 自动装好, 不用手改任何配置文件。(本地目录那路除外:pnpm 只建软链、不装该目录的依赖。) ## 设置在哪里 **设置 → 插件 → 「插件配置」**,里面会多出一行「启动动画」——**和其他插件一样是收起的**,点一下才展开: | 项 | 作用 | |---|---| | **开启启动动画** | 总开关。关掉就是**完全不注入**——没有覆盖层、不发任何素材请求,回到 DSH 原生启动页 | | **播放影片声音** | 默认开。关掉是**彻底静音**:`startClip` 不再走"先试带声、被拒再静音"那条路,直接以静音起播;声音按钮根本不生成,`audioRetry` 也不会被武装 | | **点鼠标直接进入** | 默认关。打开后指针按下就是**进入**,不再拿第一下去解锁音频;`enter()` 里那次"顺手再试一次开声音"也一并跳过——那个开关的意思正是"这一下只负责进" | | **显示底部提示文字** | 默认开。关掉只在覆盖层根节点上写 `data-hint="0"`,由一条 CSS 规则隐藏提示行;标题和进度条不动 | | **淡入时长** | 1 / 1.5 / 2 / 3 / 4 秒,默认 2 秒 | | **进入方式** | 片尾交叉溶解(默认)/ 放完再淡 / 点击才进 | | **素材池** | 勾选哪些片子参与随机轮播(**读的是设置本身,所以勾完立刻变**);每行会**实际播放一遍**给出结论:时长(读到元数据就有),外加**只在有问题时**才出现的徽章——`浏览器播不了`(解码被拒)、`一直没有画面`(能开始播但 8 秒没出画面)、`未优化`(`moov` 在文件尾) | 三个开关的取值都是 **`!== false` / `=== true` 的宽松判断**,不是直接取字段:老 profile 的设置文档里没有这三个键,宽松判断让它们落在文档化的默认值上(声音开、直接进入关、提示显示),和 Host 侧 `readField()` 的逐字段回退是同一套语义。 **总开关不是"脚本自己判断一下然后什么都不做"**,而是 Host 侧直接不加那两行注入。这样关掉之后是真的关掉:没有覆盖层占着视口,没有配置全局变量,也没有一次素材请求。`verify-settings.mjs` 断言了这一点——关掉时注入行数是 **0**,打开时是 **2**。 **默认收起**是有意的:这一页是插件清单,"哪张卡片展开"是用户的阅读动作,由卡片自己持有;一张进来就把控件摊开的卡片会把下面所有插件挤出视野。折叠头的字号、圆角、边框、层级底色和箭头动画都是从 harness 自己的卡片样式(`ui-settings-plugins/src/client/PluginCard.module.css`)抄来的,token 名同样是 `--dsw-alias-label-*` / `--dsw-alias-bg-layer-*`,所以它在清单里看起来是原生的而不是外来的。 还有一处性能上的理由:素材池要读一次清单、再给每条起一个 `