READMESource: main@fbabe18b
dsh-novel-launcher 📖
在 DeepSeek Harness 的界面里放一个悬浮球:点开本地书单,选一本用你自己的阅读器打开,窗口自动落在你习惯的位置。
写代码的间隙看两眼小说,不用切窗口。
界面预览
点右下角的 📖 悬浮球,展开本地书单 —— 顶部「继续读」直接续上,中间三路搜索,底部一键记住窗口位置:

悬浮球常驻在界面右下角,不占布局、不影响写代码:

它做什么
- 🟢 右下角悬浮球 —— 不占布局,点开点收
- 📚 本地书单 —— 扫描你的书库文件夹,只列出真正的电子书
- 🔍 三路搜索 —— 中文(
魔界)、全拼(mojie)、首字母(mjd)都能搜到《魔界的女婿》 - ⏯ 继续读 —— 顶部永远显示上次读到哪本、第几章
- 🪟 窗口归位 —— 打开后自动把阅读器窗口搬到预设位置,顺手收掉上一个旧窗口
- 🎨 跟随主题 —— 用 DSH 的设计变量,明暗自动适配
- 🌗 点外部关闭 / Esc / 选书即收起 / 关闭自动清空搜索
它不做什么
- 不抓网络小说、不带阅读器。书是你自己的,阅读器也是你自己的。
- 不上传任何东西,纯本地。
安装
dsh plugin --profile web add github:<you>/dsh-novel-launcher
装好后重启一次 dsh web,刷新浏览器,右下角出现 📖 即可。
开发版:把本目录放进
~/.dsh/profiles/web/node_modules/dsh-novel-launcher/, 再把dsh-novel-launcher加进~/.dsh/profiles/web/package.json的dsh.profile.bundles列表,重启即可(无需构建 —— 本插件纯 JS)。
首次使用
点悬浮球 → 自动进入设置页 → 选一个放书的文件夹 → 保存。完事。
设置项
| 设置 | 说明 |
|---|---|
| 书库目录 | 你的电子书放在哪 |
| 阅读器进程名 | 窗口归位用(macOS)。例如 OmniReader |
| 阅读器 Bundle ID | 优先用它来打开书,例如 com.shrek.masterreader |
| 阅读器 .app 路径 | 可选,填了最优先 |
| 认这些格式 | 默认 epub, txt, mobi, azw3, pdf, fb2, chm, djvu, rtf, md, html |
| 窗口归位 | 开书后搬窗口 + 收旧窗(仅 macOS) |
| 拼音搜索 | 用 macOS 系统自带的中文转拼音(仅 macOS) |
| 显示「继续读」 | 自动探测阅读器的本地数据库 |
窗口归位(macOS)是怎么工作的
macOS 不允许随便操纵别的程序的窗口,必须拿到「辅助功能」授权。为了拿到一个稳定可授权的身份,插件会:
- 首次启用时用
osacompile把assets/window-helper.applescript编译成~/Applications/小说窗口助手.app - 你在 系统设置 → 隐私与安全性 → 辅助功能 里把它加进去(只需一次)
- 之后每次开书,插件通过
/tmp下的一个小命令文件告诉它做什么模式
这样做而不是直接跑 osascript,是因为后者的授权身份挂在 Node 上 ——
Node 一升级路径就变,授权会静默失效。用一个独立小程序就没这个问题。
助手只做两件事:记住当前窗口位置 / 把窗口搬回那个位置(并关掉停在那个位置上的旧窗口)。 它永远不会关掉最前面那个窗口 —— 那是你刚打开的新书。
不想授权也完全没问题:关掉「窗口归位」,其他功能照常。
跨平台
| 功能 | macOS | Windows / Linux |
|---|---|---|
| 悬浮球 / 书单 / 搜索 / 打开书 | ✅ | ✅(交给系统默认程序) |
| 窗口归位 · 收旧窗 | ✅ | ❌ 自动隐藏该选项 |
| 拼音搜索 | ✅ | ❌ 自动关闭 |
数据与隐私
- 配置:
$DSH_HOME/novel-launcher/config.json - 窗口位置:
~/Library/Application Support/DSHNovelLauncher/frame.txt - 命令文件:
/tmp/dsh-novel-window-cmd.txt(每次开书覆盖一次) - 全部只在本机,不联网、不上传。
架构
- Host 半体(
lib/index.js):普通 Cordis 插件。扫目录、算拼音(走osascript调 macOS 的NSString转写)、探测阅读器数据库、拉起窗口助手,并注册/novel-launcher/*这组同源 JSON 接口。 - 浏览器半体(
lib/client.js):window.__ModuleLoader__.load的纯 JS bundle, 注册进shell.overlay槽位。 - 两者只用 HTTP 通信,不依赖任何私有 RPC。
License
MIT
No comments yet. Be the first to write one.