书斋 · dsh-reading-notes
一个装进 DeepSeek Harness 左侧边栏的读书笔记面板。点侧边栏的书脊图标,主区就是你的书斋。
顶部六张卡片
点两张卡片,同时开两块
深色主题
它是什么
按「一本书」组织笔记,而不是按时间。每本书下面可以放六类条目:
| 类型 | 用途 |
|---|
| 摘抄 quote | 值得抄下来的句子 |
| 感悟 insight | 读到这里想到的 |
| 问题 question | 还没想明白的 |
| 人物 character | 人物与关系 |
| 概念 concept | 术语与框架 |
| 行动 action | 读完要去做的事 |
书本身带状态(想读 / 在读 / 读完 / 搁置)、评分、标签、页码进度。
顶部六张卡片,点一张就长出一块书写区
页面顶部是六张卡片(三列两行),每张写着自己的类型名、一句提示、以及这本书里这个类型的条目数。
点一张,内容区立刻出现一块这个类型的书写区——想同时写摘抄和感悟,就点两张卡片,两块并排上下都在;同一类型点两次,就是两块。每块的格式都不一样,写的时候不会混:
| 卡片 | 块头记号 | 书写区的样子 |
|---|
| 摘抄 | “ | 18px 衬线字,左侧类型色竖线,像贴了一张稿纸 |
| 感悟 | — | 普通段落,行距放宽 |
| 问题 | Q | 前面挂一个 Q,提示「还没想明白的是…」 |
| 人物 | 人 | 两个字段:人名 + 做过什么、和谁有关系 |
| 概念 | § | 两个字段:术语(等宽字体)+ 一句话释义 |
| 行动 | ✓ | 前面一个 ☐,保存后即可勾掉 |
写完按「保存」(或 ⌘/Ctrl + Enter)就变成正式条目;「取消」「×」、Esc 关掉这块。空块不会写进数据,手滑点了卡片也不会留下垃圾。
卡片下面是一条细筛选线(全部 / 六类 / ★收藏 / 排序)——它只筛下面的列表,永远不会新建东西。「写」和「看」因此是两行,各管各的。
条目流里,每一条左边有一枚类型记号(“ / — / Q1 / 姓氏圆头像 / § / 勾选框),正文按类型换形态:摘抄是衬线引文块,感悟是段落,问题句尾一个方点,人物是「人名 + 关系说明」,概念是「术语 + 释义」,行动可以勾掉变删除线。
除了记笔记,还做了什么
- 全文检索 ⌘K:跨书、跨条目、搜标签和书名,回车跳转并滚动到那一条。
- 复习卡片:全屏翻卡,标星优先,其次摘抄与感悟。← → 或空格切换。
- 页边(右栏):面板够宽(≥1240px)时出现,显示阅读进度、六类条目的占比、标星数、最近一条时间,以及「复习这本书」。窄面板下它直接不存在,不占位置。
- 连续记录天数:底部状态条显示连续记了几天,断一天归零。
- 侧边栏顶上的 ↻:一键重载窗口。改完插件或者面板看着不对,点它比记 F5 稳。
- 导入 / 导出:单本或全库导出 Markdown;JSON 备份可导入还原。
- 浅色 / 深色:跟随系统配色,也可顶栏手动切换。深色下选中态改用朱红,不用反白纸片。
云同步(可选,默认关)
笔记默认只躺在 ~/.dsh/reading-notes/library.json。顶栏那个云朵按钮是它的开关,第一次点开会问你要往哪儿同步:
| 模式 | 适合 | 要填什么 |
|---|
| SSH 服务器 | 自己的云服务器(阿里云 / 腾讯云 VPS) | 地址、端口、用户、私钥路径、远端文件 |
| 目录 · NAS | 挂到本机的网络盘、群晖共享、OneDrive 同步目录 | 一个目录 |
| WebDAV | 群晖 WebDAV、Nextcloud、坚果云 | 地址、用户名、密码 |
用 SSH 的话只需要一把密钥,不存密码:
ssh-keygen -t ed25519 # 本机还没有密钥时,一路回车
ssh-copy-id root@你的服务器IP # 把公钥装到服务器上
ssh root@你的服务器IP # 能免密登录,就说明可以了
然后在面板里填地址 / 端口 22 / 用户 root / 私钥 C:/Users/你/.ssh/id_ed25519,点「测试连接」——
通了会告诉你云端现在有几本书;第一次连上空服务器会提示「云端还是空的」,这是正常的。
同步是怎么算的:读远处那份 → 按条目 id 合并(同一 id 取 updatedAt 新的那份)→ 合并结果写两边。
所以两台机器交替写不会互相覆盖;「仅上传」「仅下载」是给想要单向覆盖的时候用的。
删掉的笔记如果在另一侧还留着,合并时会再回来——单人笔记本宁可多留,不少掉。
凭据写在 ~/.dsh/reading-notes/sync.json(权限 0600),只在本机;浏览器每次只能读到「有没有配过密码」,
读不到密码本身。不上云就永远不配置,功能完全不存在。
数据存在哪
~/.dsh/reading-notes/library.json(可用插件 config 的 dataDir 改目录)。
- 每次改动先写 localStorage 镜像,再 500ms 防抖 POST 到宿主;宿主用 tmp + rename 原子落盘。
- 宿主不可达时降级为本地缓存,状态条显示「本地缓存」。
- 正文上限 8MB,仅接受本机回环连接,坏 JSON 返回 500 且不覆盖原文件。
接口
| 方法 | 路径 | 说明 |
|---|
| GET | /api/dsh-reading-notes/state | { library, path, exists } |
| POST | /api/dsh-reading-notes/state | body { library },原子写回 |
| GET | /api/dsh-reading-notes/health | 探活 |
客户端一律用文档相对路径 api/dsh-reading-notes/state(GUI 带 <base href="./">,绝对路径会逃出子路径部署)。
开发
node scripts/selftest.mjs # 宿主半身:假 ctx + 真 http + 目录同步往返,21 项
node scripts/render-smoke.mjs # 客户端半身:hook shim 渲染 + 模拟点击卡片 / 开云同步,48 项
node scripts/static-preview.mjs [--dark] [--draft=quote,question] [--filter=quote] [--sync]
静态预览用于在没有 GUI 鉴权的情况下看真实组件渲染结果:它把组件树序列化成 HTML,
冻结入场动画,然后用 headless Edge 截图。
安装到另一台电脑
没有构建步骤,lib/ 里就是最终代码;把仓库拷过去接进 profile 即可。
1)克隆后跑安装脚本(推荐)
git clone https://github.com/<你的用户名>/dsh-reading-notes.git
cd dsh-reading-notes
node scripts/install.mjs
脚本只改 profile 的 package.json 两处(link: 依赖 + dsh.profile.bundles 末尾追加),改前备份成 package.json.bak。profile 目录默认取 $DSH_PROFILE_DIR,没有就用 ~/.dsh/profiles/desktop,也可以 --profile "D:/..." 指定。之后重启 DSH 窗口,侧边栏会出现书脊图标。
2)不想用 git:GitHub 页面「Code → Download ZIP」,解压后进目录跑同一个脚本。
3)手动改(等价于脚本):
"dependencies": { "dsh-reading-notes": "link:<本目录绝对路径>" },
"dsh": { "profile": { "bundles": [ "…", "dsh-reading-notes" ] } }
本目录自带的 cordis.patch.yml 会把宿主半身 insert 进 loader,不需要手写 patch 行。要求 DSH >= 0.2.1-rc.3,React 18 由宿主提供。
笔记数据在哪、怎么搬
- 存在
~/.dsh/reading-notes/library.json(宿主 config 的 dataDir 可覆盖目录),不在仓库里。
- 换电脑:面板顶栏「导出 JSON」→ 新机器「导入 JSON」;导出的文件与
library.json 同构,直接拷贝也行。
- 面板里所有改动都会 500ms 防抖写回这个文件;宿主不可达时回落浏览器 localStorage,状态条会显示「本地缓存」。
上传到 GitHub(一次性)
先在网页上 New repository(不要勾「Add a README」),然后在本地:
cd dsh-reading-notes
git init
git add .
git commit -m "书斋 v0.5.0"
git branch -M main
git remote add origin https://github.com/<你的用户名>/dsh-reading-notes.git
git push -u origin main