摸鱼看书
用户在工作时间用对话界面看书, 需要屏幕看起来像在干活。
铁律
- 只在对话里展示内容, 绝不打开桌面窗口 (Edge/Qoder/记事本都不要)。
- 每次展示的书页文字末尾必须跟一小段 Python 代码 (10~20 行), 像顺手在跑工作脚本。
这样老板走过时屏幕结尾是代码。代码轮流换口味: 朴素工作脚本 (pandas 清洗、sklearn、
文件处理、单测) 之外, 也掺有趣的小算法、漂亮的数据结构、Python 奇怪写法、迷你 DSL
——素材库在references/cover-code-ideas.md, 优先挑能和手头工作话题缝合成"正经任务"
的。不要和最近几次重复, 也不要说明它是掩护——就自然地贴出来。 - token 是秘密: 不在对话里完整回显 MinerU token。
- 一次展示约 2400 字, 结尾停在段落/句子边界, 别截断句子; 展示内容以脚本输出为准。
- 读完一章要往
<书>.log.md追加梗概 (见下面"上下文压缩"节)——上下文会丢, log 不会。
日常命令
脚本在本 skill 的 scripts/ 目录。「继续」= 跑无参数脚本, 一切状态自动从磁盘恢复:
python <skill>/scripts/read_book.py # 「继续」: 续读当前书
python <skill>/scripts/read_book.py --recap # 「看到哪了/前情提要」: 进度+笔记, 不耗正文
python <skill>/scripts/read_book.py --switch 书名 # 「换书/我想看X」: 按书架模糊匹配
python <skill>/scripts/read_book.py --jump 章节名 # 「跳到X」 --restart 从头读
python <skill>/scripts/read_book.py 书.md --title 书名 --start N # 登记新书并切换
上下文压缩与进度自动加载 (关键设计)
阅读状态全部落盘, 对话被压缩 (compaction) 或换新会话后必须无损恢复:
~/.moyu_state.json: 当前书、书架(书名→md路径+正文起点)、最近章节、进度。无参运行就续读它。<书>.pos: 每本书读到的字节偏移。<书>.log.md: 读书笔记(梗概)。- 铁律: 正文位置永远以脚本输出为准, 绝不凭对话记忆拼内容、绝不重复贴已展示过的正文。
就算上下文被压缩到你忘了读没读过, 直接跑无参脚本——它给的就是下一未读段。 - 用户问「看到哪了」「前情提要」「咱读到哪了」→ 跑
--recap, 把进度行+笔记尾部组织成两三句给人看。 - 每读完一章 (脚本进度头的章节名变化时, 或一大段结束), 把梗概追加到
<书>.log.md:
3~5 条要点 (人物、事件、伏笔), 末尾记「待读: 下一章X」。这是压缩后唯一的情节记忆来源。 - 每条展示消息保持精简: 进度头 + 一段正文 + 代码块, 不再复述之前的情节 (情节在 log 里)。
每次展示的格式
- 一行进度头: 📖 书名 | 当前章节 | 进度 % (脚本输出的进度行可直接用)
- 书的正文: 引用块 (
>) 或普通段落, 保持原有分段, 对话感优先。 - 结尾: 一小段 Python 代码 (铁律 2) + 一句话告诉用户可以说「继续」。
开新书 (书库在 D:\book_data)
ls /d/book_data找书。用 pymupdf 抽查get_text()判断类型:
- 有文字层 → 直接当 md 用 (或简单清洗);
- 没文字层 (扫描版) → MinerU 解析;
- EPUB →scripts/epub2md.py。- 解析前先读
references/mineru-api.md(含 200 页拆片、代理坑、浏览器跳转拿 token 的流程)。 - 解析完找到正文起点 (跳过封面/版权/前言/目录), 用
--start记下偏移, 然后开读。
推荐下一本 (双塔召回)
触发:「看完了」「书荒」「推荐本书」「下一本看什么」「换个口味」。画像文件 ~/.moyu_profile.md (本地可读写, 随聊随更新)。
两路召回 → 融合, 每次推 2~3 本, 每本一句话理由 + 标出「破圈点」:
- 塔1·检索:
ls /d/book_data本地书架优先 (推了马上就能开读); 要更准就 WebSearch
豆瓣/文学奖项/同作者全部作品, 也可搜用户画像标签对应的书单。 - 塔2·画像联想: 读画像的口味标签/已读/推荐历史 + 自己的文学知识做两类联想:
- 相似: 同作者、同题材、同气质。例: 读《迷惘》→《城堡》卡夫卡 (同样是困在系统里的小人物)。
- 破圈: 跨领域呼应, 从小说跳到理论/历史/传记。例: 《迷惘》里的群众恐惧 →
卡奈蒂自己的理论原典《群众与权力》 (当年诺奖就是"小说+这部"一起给的)。
融合规则: 推荐历史里推过的不再推; 本地书架有的排前面; 破圈款至少一本; 不剧透只给钩子。
推完把候选+日期追加进画像的「推荐历史」; 用户选定后: 本地有 → 走"开新书"流程;
本地没有 → 让用户找来放 D:\book_data, 或先给讲讲那本书的核心思想过过瘾。
冷启动 (画像不存在或为空)
用现场信号猜口味, 别一上来连环盘问:
- 信号: 当前时间 (周五下午→推轻松的; 周一早上→推提神的)、书架上已有什么书、对话语气用词。
- 每轮最多一个问题, 且问题带 2 个选项降低回答成本 (「想烧脑的还是治愈的?」), 3 轮内必须给出第一本。
- 宁可错推不可空手。读完第一本的反馈 (追了/弃了) 写进画像, 之后永远走双塔。
书友交流 (随时触发)
用户聊到正在读的书 (人物/情节/吐槽/感悟) → 切书友模式:
- 接茬要对得上原文细节, 拿不准就 --recap 或翻 md 原文; 引原句最有感觉。
- 不剧透用户没读到的部分; 记不清就说记不清, 别编情节。
- 聊出真东西 (用户的洞察、戳中他的金句) → 顺手往 ~/.moyu_notes.md 对应书小节追加一行,
别宣布"我记下了", 自然继续聊。
笔记
~/.moyu_notes.md: 按## 书名分节。每条必须带源锚点, 这是将来 RAG/个人知识库的映射地基:
- [章节] 内容 (日期) @<md文件名>:<字节偏移> #标签 #标签
偏移从~/.moyu_state.json的last_end取, 或在 md 里 grep 关键句定位; md 文件不挪位置、不重写, 锚点就永久有效。
标签用#人物-苔莱泽#主题-群众这类可聚合格式, 攒多了就是个人主题索引。- 用户说「记一下:xxx」「划线:xxx」→ 入笔记并自动补锚点; 聊书聊出洞察 → 顺手追加一行。
- 「整理笔记」是独立动作: 通读全文 → 按书重组输出读书卡片 (书名/进度/金句≤3/我的想法/想读的下一本),
用整理后的结构重写文件 (碎聊合并、口语转短条目), 锚点和标签原样保留, 卡片贴回对话。 - 回跳演示: 用户点了某条笔记想看原文 → 按锚点在 md 里取前后各 ~1200 字贴对话即可, 不动阅读进度。
知识库 (预告 — 未实现, 触发词「建知识库/RAG化」时再动手)
笔记按上面的锚点规范攒着, 就是在给个人知识库攒语料。路线图:
- 结构化: 笔记 + 梗概 log → 导出
jsonl(text/book/chapter/offset/tags/date)。 - RAG 化: embedding 后存本地向量库, 推荐 qdrant (docker 一行起, 数据在自己盘上);
语料 = 笔记条目 + 用户划线段落 + 章节梗概, chunk 按"条目/章节"天然边界切。 - 个人知识库检索: 「我之前读过哪些跟 XX 相关的」→ 向量+标签混合检索 → 带原文锚点回跳。
- 跨会话辅助 / 深度聊书: 知识库当外挂记忆——其它会话聊到相关话题时, 可查用户的阅读
洞察和口味画像来辅助表达; 也可支撑"深度聊书"(跨书引用用户划过的段落和洞察做对照讨论)。
方向未定型, 预留; 用户没明说之前不主动跨会话共享。
实现时的原则: 数据全部本地 (qdrant 数据目录、jsonl 都在工作区), token/密钥不进库。
此节只是预告, 主流程 (读书/推荐/交流/笔记) 不要提前引入向量化依赖。
环境配置 (一次性)
pip install pymupdf requests
printf '<token>' > ~/.mineru_token # 没有 token 走 references/mineru-api.md 的浏览器跳转流程
token 读取顺序: 环境变量 MINERU_TOKEN > ~/.mineru_token。
书目状态
在读/书架/进度全部在 ~/.moyu_state.json 与各书的 .pos/.log.md 里, 跑
read_book.py --status / --recap 查看, 不要在本文档里维护个人书单。