# dsh-study-buddy 用户使用指南(v1.0 · 文档式笔记) > 版本基线:v1.1.1 | 配套预设:「学习伙伴」(preset name)| 读者:使用者 > > 这是给**使用者**看的完整指南:安装部署、逐键配置、18 个工具、笔记规范、Obsidian 配合、排障。 > 快速总览见 [README](../README.md);文档地图见 [docs/README](README.md);笔记规范细则以 > `presets/study/skills/note-format/SKILL.md` 为准;学习闭环细则以 `presets/study/skills/study-loop/SKILL.md` 为准。 > > **v1.0 与 v0.9 的最大差别**:笔记从"原子卡片"改为**文档式笔记块**;写法不再由代码里的模板决定, > 而是由你 vault 根的 **《笔记期望.md》** 决定;归档前必须先做**文件夹规划**并经你确认(三条硬门禁)。 --- ## 目录 1. [这是什么](#1-这是什么) 2. [功能速览](#2-功能速览) 3. [安装与部署](#3-安装与部署) 4. [配置参考(逐键详解)](#4-配置参考逐键详解) 5. [核心概念](#5-核心概念) 6. [日常使用指南(按场景)](#6-日常使用指南按场景) 7. [工具参考(18 个工具)](#7-工具参考18-个工具) 8. [笔记规范](#8-笔记规范) 9. [在 Obsidian 中的配合](#9-在-obsidian-中的配合) 10. [检索原理与技巧](#10-检索原理与技巧) 11. [故障排查手册](#11-故障排查手册) 12. [性能与成本](#12-性能与成本) 13. [已知限制与路线图](#13-已知限制与路线图) 14. [隐私与数据流向](#14-隐私与数据流向) 15. [开发与测试](#15-开发与测试) 16. [附录](#16-附录) --- ## 1. 这是什么 `dsh-study-buddy` 是给 [DeepSeek Harness](https://github.com/deepseek-ai/DeepSeekHarness)(DSH)做的**「通用学习 Agent」模式**,由两部分组成: | 组成 | 是什么 | 装在哪里 | | :-- | :-- | :-- | | **插件**(本仓库 `src/`,构建产物 `lib/index.js`) | 注册 18 个 `note_*` / `study_*` 工具,用 `node:fs` 直写你的 Obsidian vault | 你的 DSH profile 的 `node_modules` | | **预设**(本仓库 `presets/study.patch.yml` + `presets/study/`) | 「学习伙伴」Agent:persona + 6 个技能(`study-loop` / `note-format` / `file-reading` / `incremental-update` / `domain-adaptation` / `memory-auto`)+ 默认期望模板 + 插件挂载行 | **随包发**:`package.json` 的 `dsh.bundle.patch` → 你在 profile 里选中本包即生效(DSH ≥ 0.1.7-rc.1) | | **机器相关配置** | `vaultRoot`(以及可选的 `skipDirs` / `searchRoots` / `domainFolders`) | **不在包里**:`DSH_STUDY_VAULT` 环境变量或 `\study-buddy.json`(见 §3.5) | 一句话定位:**快节奏、听指挥、把知识沉淀成可独立复读的文档式笔记,按你规划的目录结构写进你的 Obsidian vault**。 核心理念(与 v0.9 一致的三条不变量): - **磁盘是唯一真相**:笔记就是 vault 里普通的 `.md`(带 frontmatter)。Obsidian 手改、git 回滚永远有效;插件按 mtime/ctime/大小签名重扫索引,不与你的编辑打架。 - **决定权在你**:讲不讲、写什么、**落到哪个目录**、改不改旧笔记,都由你下令。归档前必须先看你确认过的规划。 - **fail-loud**:配置错误、状态文件损坏、门禁未满足一律抛错并给出修复步骤,不静默降级。 - **内容会出境**:vault 正文、路径、进度与记忆都会随工具结果进入会话日志并发给模型服务商;插件自身不联网。详见 [§14 隐私与数据流向](#14-隐私与数据流向)。 --- ## 2. 功能速览 | 功能 | 一句话 | 详见 | | :-- | :-- | :-- | | 四步学习闭环 | 读取 → 讲解 → 问答 → 归档,每步有模板和检查清单 | [5.1](#51-四步学习闭环) | | 指令驱动 | 读取 ≠ 讲解;默认待命,一次只执行你的一条指令 | [5.5](#55-指令驱动状态机) | | **笔记期望(热配置)** | 写法只看你 vault 根的《笔记期望.md》,代码里没有模板 | [6.3](#63-笔记期望热配置) | | **文件夹规划(硬门禁)** | 归档前先出目录+块清单提案,你拍板后才落盘 | [6.6](#66-归档整理笔记) | | **文档式块** | 一个块 = 一个可独立阅读的知识单元;无必填小节、字数不设限 | [8](#8-笔记规范) | | **微目录** | 每个主题目录都有 `微目录.md`,工具生成、手写导读保留 | [7.9](#79-note_toc--生成微目录) | | **覆盖度总览** | 按 `来源章节` 聚合出"这个主题记全了没有" | [7.6](#76-note_overview--主题总览与覆盖度) | | **历史存档** | 推翻重写时旧正文存 `.study/archive/`,正文不留历史块;可回退 | [6.10](#610-更新与回退) | | 增量更新(活笔记) | 补充追加;推翻替换并先存档;决定权在你 | [6.7](#67-增量更新活笔记) | | 多根只读检索 | `note_search` 覆盖 vault + 工作目录 + `searchRoots` 旧笔记 | [10](#10-检索原理与技巧) | | 跨会话进度与记忆 | 断点/未答追问/偏好持久化;首条消息**硬门禁** | [6.8](#68-进度与记忆附指挥词速查) | | 轻量 & 便宜 | 工具 schema 固定开销约 14.7 KB / 18 工具 | [12](#12-性能与成本) | | 可靠性 | 原子写;路径越界防护;门禁拒绝时磁盘零改动(测试布局见 [技术文档](技术文档.md) §8) | [11](#11-故障排查手册) | --- ## 3. 安装与部署 ### 3.1 前提 一份**可运行的 DSH 部署(web profile)**;Node.js ≥ 22 与 pnpm(锁文件为 pnpm 11);一个 Obsidian vault 目录(绝对路径)。 若需读取 PDF/PPTX:本机 Python 环境,PDF 需要 `PyMuPDF`(新版本 `import pymupdf`),PPTX 需要 `python-pptx`;DOCX 用标准库即可。 ### 3.2 获取插件 ```powershell git clone https://github.com/V-Reason/dsh-study-buddy.git cd dsh-study-buddy pnpm install pnpm run check # typecheck + 测试 + 构建 lib/index.js ``` 直接用发布版可以跳过这步:§3.3 的 `dsh plugin add dsh-study-buddy` 会自己取包并跑构建。 ### 3.3 装进 DSH profile(**关键步**) ```powershell dsh plugin --profile web add dsh-study-buddy # 本地开发/未发布时:plugin_manager install_bundle target=<仓库绝对路径> ``` 装完**必须确认 profile 的 `dsh.profile.bundles` 含 `dsh-study-buddy`**——本包是 bundle: 它携带的 `presets/study.patch.yml` 只有被选中才会被 DSH 读入。少了这一步的表现是 **预设整行不出现、工具全没,但没有任何报错**(这正是 2026-09-24 DSH 0.1.7 那次失效的形态)。 ### 3.4 预设是声明式的(不要再复制预设目录) DSH 0.1.7-rc.1 起**删除了目录式预设**(提交 `d1e22a7e24` / #4569):`%DSH_HOME%\.agent-presets\\` 再没有任何读者。所以: - 不要再往 `.agent-presets\study\` 复制/编辑东西;**升级前复制过请删掉那个目录**(留着只会误导排查)。 - 预设的 persona、工具行、技能、期望模板全部**随包发**(`presets/study.patch.yml` + `presets/study/{skills,assets}`); 要改就改仓库/包,再让 profile 的副本跟上(§3.7)。 - 机器相关的只有 `vaultRoot` 等少数键,走 §3.5 的用户级来源——**不会因为你重装插件而丢**。 ### 3.5 给 vaultRoot + 复制期望模板(两步) **第一步:告诉插件你的 vault 在哪**(三种给法,按优先级): ```powershell # ① 环境变量(推荐:一处生效,所有会话共用;设完重启 DSH) setx DSH_STUDY_VAULT "D:\你的vault绝对路径" # 当前用户级永久环境变量 # ② 或写用户级配置(键名与预设声明里的 config 完全一致) '{ "vaultRoot": "D:\\你的vault绝对路径", "skipDirs": ["资源"] }' | Set-Content "$env:DSH_HOME\study-buddy.json" -Encoding utf8 # ③ 或改预设声明里 study 行的 config.vaultRoot(部署侧精调;注意重装包会被覆盖) ``` 三者都没有 → 挂载失败(fail-loud),错误里会列出这三种给法。挂载日志会打印一行 `[dsh-study-buddy] vaultRoot ← <来源>:<路径>`,排障第一问不必翻配置。 `vaultRoot` 是**挂载期不变量**:改完要重启 DSH(或让预设重新挂载)才生效。 **第二步:把默认期望模板复制进 vault 根并改成你的写法**: ```powershell Copy-Item presets/study/assets/笔记期望.md "<你的vault>\笔记期望.md" ``` 这份文件是笔记写法的**唯一来源**;缺失时写入会被门禁拒绝(这是有意的,见 [6.3](#63-笔记期望热配置))。 另外可选:`domainFolders`(领域键 → 目录的**快捷方式**,不传 `path` 时的兜底)、`skipDirs`、 `searchRoots`、`includeSessionCwd` —— 都能写在 §3.5 的 `study-buddy.json` 里,见[第 4 章](#4-配置参考逐键详解)。 ### 3.6 启动并选择预设 重启 DSH,新建会话,在预设列表中选择 **「学习伙伴」**(id `study`)。 只读自检三步(不需要翻日志): ``` plugin_manager list_bundles → 本包在列(enabled) plugin_manager list_plugins → include:preset-study 且 fiberPhase: active(failed 时看 diagnostic) 新会话里 → 18 个 note_* / study_* 工具都在 ``` ### 3.7 升级插件 `dsh plugin --profile web update dsh-study-buddy`(或删掉 `\node_modules\dsh-study-buddy` 再 `pnpm install`),然后重启 DSH。**预设/技能/期望模板随包更新**,你写在 `\study-buddy.json` 里的机器配置不受影响。 改完用这两条只读命令判"到底生效了没"(10 秒出结论): ```powershell pnpm run verify:contract # 交付形态 + 插件 ↔ 本机 DSH 的平台契约 pnpm run verify:deploy -- -Profile web # 产物哈希 / 已装 bundle 的预设 patch / 技能目录 / 期望文件 ``` > **升级 DSH 本体**同样要跑上面两条:DSH 0.1.5 把 persona 行的 `text` 改成必填 `prefix` > (旧副本报 `invalid config: $.prefix missing required value`);0.1.7-rc.1 删除了目录式预设 > (症状是"预设消失且不报错")。平台改动不会变成编译错误,`pnpm run check` 对它无感—— > 这两条命令就是为这段盲区准备的。 > ⚠ 部署形态:若启动器**以 vault 目录作为 DSH 工作目录**(`vaultRoot` == `{{cwd}}`),这是**受支持**的形态;插件只拒绝"文件系统根"这一真正危险的落盘目标。 --- ## 4. 配置参考(逐键详解) 配置有**四个来源**(后者覆盖前者,逐键合并): | 序 | 来源 | 位置 | | --: | :-- | :-- | | 1 | 内置默认值 | 下表"默认"列 | | 2 | 用户级配置 | `\study-buddy.json`(键名与下表一致;不是合法 JSON / 未知键只告警,不阻断挂载) | | 3 | 环境变量 | `DSH_STUDY_VAULT`(别名 `DSH_VAULT_ROOT`);**只管 `vaultRoot`** | | 4 | 预设声明行 | `presets/study.patch.yml` 里 `study` 行的 `config`(部署侧精调;重装包会回到包内取值) | | 键 | 默认 | 预设当前值 | 说明 | | :-- | :-- | :-- | :-- | | `vaultRoot` | — | **不写**(机器相关,出包) | Obsidian vault 绝对路径。四层都没有 / 为文件系统根会**挂载失败**(fail-loud)。日志里回显来源。 | | `expectFile` | `笔记期望.md` | `笔记期望.md` | **《笔记期望.md》的文件名**(位于 vaultRoot 根)。缺失时 `note_write` 拒绝写入并给创建指引。 | | `planTtlHours` | `24` | `24` | 规划凭据有效期(小时)。超期必须重新提案——这是门禁的**防死锁**设计。 | | `stateDir` | `.study` | `.study` | 状态目录(相对 vaultRoot):`progress.json`、`memory.json`、`session.json`、`plans/`、`archive/`。 | | `fallbackDir` | `未分类` | `未分类` | 未映射领域且规划未给路径时的兜底目录,实际写入 `未分类/<领域名>/`。 | | `domainFolders` | `{}` | 见预设 | 领域键 → 目录的**快捷方式**(v1.0 起落盘目录以规划的 `path` 为主)。支持多键别名。 | | `skipDirs` | `[]` | `[资源]` | 额外跳过扫描的**顶层**目录名。内置已跳过 `.obsidian` / `.trash` / `.study` / `.git` / `node_modules`。 | | `includeSessionCwd` | `false` | `true` | 把会话工作目录(`{{cwd}}`)的旧笔记纳入检索;与 vault 相同/嵌套时自动去重。 | | `searchRoots` | `[]` | `[]` | 额外检索根(绝对路径或相对 vaultRoot):固定旧笔记库,**只读**。目录不存在 → **挂载失败**。 | | `linkIntoNotes` | `false` | `false` | `note_link` 是否允许写无 ID 的旧笔记(默认只写笔记侧);同时决定只读根是否可写。 | | `lint.residueLevel` | `warn` | 未设置 | 会话残留级别:`off` / `warn` / `error`。`off` 时报告单列 `⊘ 未执行`(不当成通过)。 | | `lint.rulesOff` | `[]` | 未设置 | 禁用的规则 id 列表。**写错/写已删除的 id 会在挂载时报错**并列出可用 id。 | | `indexTtlMs` | `2000` | 未设置 | 索引缓存 TTL(毫秒):TTL 内跳过全库 `stat`。**未命中会自动强制重扫一次**,所以在 Obsidian 里刚写完立刻就能搜到;设 `0` = 每次调用都重扫。 | | `maxWalkFiles` | `20000` | 未设置 | 每根扫描**文件数安全阀**:超限**截断扫描**并在报告里 `⚠` 提示(不再让所有工具失败)。 | > **v1.0 已删除的键**:`mocDir`(`card_moc` 退场,导航改由各级微目录承担)、`templateHints`(三型模板退场)。 > 写进 preset 也不会生效——`tests/preset.spec.ts` 会直接断言这两个键不存在。 **调优思路**:目录是大规模整理过的,就为每个主题目录建一对「子域键 → 子目录」并保留原键兜底;再用 `study_memory(set prefs.xxx=…)` 把新约定写进跨会话记忆。 --- ## 5. 核心概念 ### 5.1 四步学习闭环 ``` 阶段一·读取(摄入) 你给路径/说"读取 X" → 输出读取报告(只报告,不讲) 阶段二·讲解(拓展) 你说"讲解" → 一次一个原子点,讲完问"清晰?细化/跳过?" 阶段三·问答(反诘) 你提问 → 三明治回答:直击 ≤3 句 → 底层逻辑 → 反诘追问 阶段四·归档(笔记) 你说"整理笔记/归档" → 读期望 → 规划确认 → 落块 → 微目录 → 覆盖度 ``` 红线(persona 内建,违反即失职): - 不替用户写完整项目代码(引导拆解,单次 ≤100 行完整代码,超出拆片段并标注作用/依赖/输入输出)。 - 不假装理解图片(识别不了如实说,请补文字)。 - 读取后未经命令不讲解。 - **不跳过归档前置**:未答追问先问答;**未读期望、未确认规划不写笔记**。 - 无记忆不办事:对话历史为空的首条消息先 `study_memory(get)` + `study_progress(get)`,读取结果返回前不响应。 ### 5.2 文档块 - 一个**块** = 一个**可独立阅读的知识单元**,落成 vault 里一篇普通 `.md`,带 frontmatter(`ID`/`标题`/`领域`/`来源`/`状态` + 文档键 `来源章节`/`顺序`/`简介`)。 - **ID**:`YYYYMMDDHHmm_随机6位hex`(如 `202610241430_ab12cd`),由 `note_write` 自动生成;`note_id` 只是**预生成占位符**,`note_write` **不会使用**它。 - **三种状态**:`草稿` / `已确认` / `需更新`。 - **文件名** = 标题清洗后(Windows 非法字符替换、≤80 字符)**不加序号前缀**;同目录重名时自动加 `_ID末6位`,再冲突用完整 ID。 - 落盘目录由**文件夹规划**决定;未给 `path` 时回退 `domainFolders` 快捷方式,仍未映射落 `未分类/<领域>/`。 ### 5.3 文档类型三态 | 类型 | 判据 | 能力 | | :-- | :-- | :-- | | **块** | 有 `ID` **且**有 `来源章节` | 完整能力;计入覆盖度 | | **存量卡** | 有 `ID`,无 `来源章节` | 可检索/读取/更新;补上 `来源章节` 即升级为块(不需要专门工具) | | **旧笔记** | 无 `ID`(vault 内旧文件或只读根) | 只读;`linkIntoNotes: true` 才允许写关联 | ### 5.4 检索根 `note_search` / `note_get` 的范围是**多个根**的并集:vault(可写)、`searchRoots`(只读)、会话工作目录(只读)。 同一文件被多根扫到按规范化路径去重,**vault 标签优先**;命中会标注 `类型:块/存量卡/旧笔记` 与 `路径`。 ### 5.5 指令驱动状态机 ``` 待命 ──(给路径/"读取 X")──▶ 读取(只出报告)──▶ 待命 待命 ──("讲解/讲吧/开始讲解")──▶ 讲解(一次一个原子点)──▶ 待命 待命 ──(提问)──▶ 问答 ──▶ 待命 待命 ──("整理笔记/归档")──▶ 归档(十步含门禁)──▶ 待命 待命 ──("接着讲")──▶ 从断点续讲 ──▶ 待命 ``` 默认状态是**待命**:每次只执行你当前一条指令,不自动进入下一步、不续讲。 ### 5.6 磁盘上有什么 ``` vault/ ├── 笔记期望.md # 写法唯一来源(你自己维护) ├── <各主题目录>/块.md # 文档块(带 ID) ├── <各主题目录>/微目录.md # 主题导航入口(note_toc 生成) ├── 未分类/<领域名>/块.md # 未映射领域兜底 ├── .study/ # 过程状态(内置跳过扫描;删掉不丢笔记) │ ├── progress.json # 学习进度 │ ├── memory.json # 跨会话记忆(含 _autoPrefs 自迭代开关) │ ├── session.json # 门禁状态:期望已读签名 + 待消费规划 │ ├── plans/.json # 规划凭据与消费记录(提案只在对话里,这里只存凭据) │ └── archive//<时间戳>.md # 被推翻/替换的旧正文 └── ...旧笔记.md # 无 ID = 旧笔记(只读侧) ``` --- ## 6. 日常使用指南(按场景) ### 6.1 新会话开场(自动衔接) 新会话第一条消息,Agent 执行**硬门禁**:先 `study_memory(get)` + `study_progress(get)`(get 首行含「自迭代记忆:开/关」),读取结果返回前不响应指令。有进度/记忆 → 首行给衔接提示并问"接着讲?";无 → 正常待命。 ### 6.2 读取资料(仅读取) **触发**:给文件路径 / "读取 X" / "看一下" / 上传或粘贴截图。 工具链固定(`file-reading` 技能):图片 → `read_image`;文本/代码 → `read`;PDF → `pwsh` + Python PyMuPDF 提文本 + 含图页渲染 PNG;PPTX → python-pptx;DOCX → 标准库解 `word/document.xml`。 **输出**只有:文件信息 / 内容骨架 / 一行重叠预警(来自一次 `note_search`,只允许一行)。 ### 6.3 笔记期望(热配置) - 位置:`/笔记期望.md`(固定;文件名可用 `expectFile` 改)。 - 内容:受众、文风、详略、结构、公式与代码、图表与对比、交叉引用、命名与落盘习惯、**领域侧重**、自检清单。自由 Markdown。 - **可选**检查项语法:`- [检查] 禁止 xxx` / `- [检查] 必须 xxx`(支持 `理由:…` 与 `严重:error|warn|info`)——写了才会被 `note_lint` 检查。 - Agent 每次归档前必读(`note_expect_get`);**你中途改了期望,签名就变,Agent 必须重读**才能继续写。 - 缺这份文件时写入会被拒绝——**不回退到内建写法**(否则"约束只从期望来"就变成两处口径)。 ### 6.4 讲解(仅你命令触发) **触发**:"讲解 / 讲吧 / 开始讲解"。一次**一个原子点**,≤15 行,通俗重构;讲完出「笔记预览」(文档式块,不带 ID)并问"清晰?细化/跳过?",然后回待命。 ### 6.5 提问(三明治回答) ① 直击 ≤3 句 → ② 底层逻辑一两句 → ③ 反诘收尾("别问了"才不带)。引用笔记标 `(详见笔记:路径)`。 **领域适配**:Agent 按资料/提问切换侧重——**但侧重表在《笔记期望.md》里**(v1.0 起 `domain-adaptation` 技能不再自带标准侧重表)。期望里没写这个领域时,Agent 会先问你或建议你补一条。 ### 6.6 归档(整理笔记) **触发**:"整理笔记 / 生成笔记 / 归档"。 十步(细则见 `study-loop` 技能): ``` 1. study_progress(get) 未答追问未清 → 先提示并问答 2. note_library(check) 库状态 + 期望是否已读 + 有无待消费规划 3. note_expect_get 读《笔记期望.md》(门禁开门;改过要重读) 4. note_list(可多次) 探明现有层级,判断哪些目录可复用 5. note_plan 出提案(目录 + 块清单 + 顺序 + 来源章节)→ 你拍板 6. note_plan(confirm) 拍板后确认凭据(rootPath 传 planId);有效期从确认时刻起算 7. note_write × N 逐个落块(只重组去重,不加新知识) 8. note_link 建 prev/next/sibling 关联 9. note_toc 生成/刷新微目录 10. note_overview 回报覆盖情况与缺口 11. study_progress(set) + study_memory(set lastSummary=…) ``` **三条硬门禁**(工具会拒绝,不是靠 Agent 自觉): | 门禁 | 拒绝时的提示 | | :-- | :-- | | 未读期望 | `未读取笔记期望——请先调用 note_expect_get …` | | 期望已更新 | `笔记期望.md 已更新(内容变了)——请重新调用 note_expect_get` | | 无规划 | `本次会话没有已确认的文件夹规划——请先调用 note_plan 输出提案,用户拍板后用 note_plan(action=confirm) 确认,再写入` | | 规划未确认 | `规划尚未确认(planId:…)——请让用户拍板后用 note_plan({ action: "confirm", rootPath: "…" }) 确认` | | 规划过期 | `规划已过期(超过 24 小时,planId:…)——请重新调用 note_plan 提案并确认(确认后有效期重新起算)` | | 路径越界 | `"…" 不在本次规划范围(规划根:…)——请重新规划把该目录纳入范围` | | 重复写入 | `该块已在本规划中写入过:…(如需重写,请重新规划或改用 note_update)` | **典型对话**: ``` 你:生成笔记 Agent:已检查未答追问:0 条。 已读期望(笔记期望.md,86 行)。 规划提案(planId:202610241430_ab12cd) - 规划根:计算机通识/计算方法/第2章 线性方程组数值解法 - 本次将新建目录:…/直接法 | # | 块 | 落盘路径 | 来源章节 | 顺序 | | 1 | 高斯消元法 | …/直接法/高斯消元法.md | 《计算方法》第2章 / 2.1节 | 1 | 确认后我再逐个落盘;结构与顺序要改,直接说改哪里。 你:可以 Agent:→ note_plan(action=confirm):已确认规划(planId:202610241430_ab12cd) → note_write ×2 → note_toc:微目录.md(收录 2 块) → note_overview:《计算方法》第2章 线性方程组数值解法——2 篇(节:2.1、2.2) 已写入:计算机通识/计算方法/…/直接法/高斯消元法.md(ID:202610241431_3f9a01)……(整篇) ``` ### 6.7 增量更新(活笔记) 新内容与旧笔记相关时,Agent 先给"旧 vs 新"对比,再由你决定: | 情形 | 动作 | 结果 | | :-- | :-- | :-- | | 补充 | `note_update(append)` | 追加进正文(可指定小节);**不产生版本块** | | 推翻/大改 | `note_update(replace)` | **旧正文先存入 `.study/archive/`** 再写新版;正文里不留 `
` | | 只改一句话定位 | `note_update(definition)` | 字段级微调,不算知识更新 | | 挪目录 | `note_update(move)` | 搬到 `targetPath`;记得重跑 `note_toc` | | 无关 | `note_write` + `note_link(next)` | 新块 + 与旧块建关联 | **你拒绝 → 不写任何文件。** ### 6.8 进度与记忆(附指挥词速查) | 你说 | 发生什么 | 底层 | | :-- | :-- | :-- | | "接着讲" | 从上次断点继续 | `study_progress(get)` 找断点 | | "清空进度" | 只清进度位置,记忆保留 | `study_progress(clear)` | | "记住……" | 写跨会话记忆(偏好/约定) | `study_memory(set)`,惯例键 `prefs.*` | | "忘了……" | 删对应记忆 | `study_memory(remove)`;键不存在时明确提示且不写盘 | | "开启自迭代" / "关闭自迭代" | 偏好/约定自动记录 | `study_memory(set _autoPrefs=on/off)` | | "清空记忆" | 彻底重来(含开关) | `study_memory(clear)`(不动进度) | | "别问了" | 停止反诘追问 | persona 行为 | | "先到这 / 结束" | 收尾写小结 | `study_memory(set lastSummary=…)` | | "回退 / 恢复旧版本" | 从存档恢复 | `note_history(list)` → `note_restore` | - 进度四要素:当前资料、当前小节、未答追问队列、触及笔记 ID(`set` 为**整体替换**)。 - 记忆键名 ≤64 字符、值 ≤4000 字符;保留键 `lastSummary`(置顶)与 `_autoPrefs`(on/off,只接受 set/remove)。 - 自迭代开启后:Agent 自动把持久偏好写入 `prefs.*`(每类一个键、覆盖更新),每次标注「(已自动记入偏好:prefs.xxx)」。 - 「清空进度」与「清空记忆」互不影响。 ### 6.9 指挥词速查表 | 你输入 | Agent 行为 | | :-- | :-- | | 新会话第一条消息 | 硬门禁:先 `study_memory(get)` + `study_progress(get)`,读取结果返回前不响应 | | 给文件路径 / "读取 X" / "看一下" | 阶段一·读取:`file-reading` 技能,仅输出读取报告 | | 上传/粘贴截图 | 图片读取:`read_image`,仅输出读取报告 | | "讲解 / 讲吧 / 开始讲解" | 阶段二·讲解:一次一个原子点,讲完问"清晰?细化/跳过?" | | 提问 | 三明治回答(直击 → 底层逻辑 → 反诘) | | "查一下 / 详细讲讲 / 深入研究" | `web_search`(标 `[联网补充]`)或展开讲解 | | "接着讲" | 从上次断点续讲 | | "整理笔记 / 生成笔记 / 归档" | 十步归档:读期望 → 规划确认 → 落块 → 微目录 → 覆盖度 | | "回退 / 恢复旧版本 / 改坏了" | `note_history(list)` → `note_restore` | | "标题改成 X / 名字写错了" | `note_rename`(先 dryRun 预演) | | "记住…" / "忘了…" | `study_memory` set / remove | | "开启自迭代" / "关闭自迭代" | `study_memory(set _autoPrefs=on/off)` | | "别问了" | 停止反诘追问 | | "清空进度" / "清空记忆" | `study_progress(clear)` / `study_memory(clear)` | ### 6.10 更新与回退 - **回退**:`note_history({ref})` 看存档清单 → `note_restore({ref, archiveId})` 恢复。恢复前**当前正文也会先存档**,所以可以反复来回。 - **改名**:`note_rename({ref, title})` 同步四件事——frontmatter 标题 → 文件名(仅当文件名 = 旧标题清洗结果)→ 全库 wikilink 入链 → 断链检测。冲突时**不做任何写入**;`dryRun` 先预演。 --- ## 7. 工具参考(18 个工具) 插件注册 18 个工具,**只在「学习伙伴」预设作用域内可见**。工具面按"一个工具一个动词"设计。 | 工具 | 作用 | 必填 | 可选 | | :-- | :-- | :-- | :-- | | `note_library` | 库状态自检(vault/期望/规划/计数) | `action=check` | — | | `note_expect_get` | 读《笔记期望.md》并标记已读(门禁开门) | — | — | | `note_list` | 逐层导航(子目录 + 笔记 + 是否缺微目录) | — | `path`、`depth` | | `note_get` | 读一篇完整原文 | `ref` | — | | `note_search` | 关键词全库检索(多根) | `query` | `domain`、`status`、`kind`、`path`、`limit` | | `note_overview` | 主题总览 + 覆盖度 | — | `path`、`material` | | `note_plan` | 文件夹规划提案 / 确认 / 放弃 | `rootPath`、`items` | `action(create\|confirm\|abandon)`、`material`、`notes` | | `note_write` | 落一个块(门禁三连校验) | `planId`、`title`、`path`、`source`、`content` | `sourceSection`、`order`、`domain`、`status`、`summary`、`tags`、`links`、`dryRun` | | `note_update` | 更新(append/replace/move/definition) | `ref`、`action` | `changes`、`section`、`newContent`、`summary`、`sourceSection`、`targetPath`、`dryRun` | | `note_toc` | 生成/刷新微目录 | `dir` | `title`、`dryRun` | | `note_link` | 建双向 wikilink 关联 | `from`、`to`、`kind` | — | | `note_unlink` | 移除关联 | `from`、`to` | — | | `note_rename` | 改标题 + 同步入链 | `ref`、`title` | `dryRun` | | `note_history` | 看历史存档 | `ref` | `action(list/read)`、`archiveId` | | `note_restore` | 恢复某份存档 | `ref` | `archiveId`、`dryRun` | | `note_lint` | 质量体检(4 条规则,无分数) | — | `ref`、`scope`、`limit`、`rule` | | `study_progress` | 读/写/清进度 | `action` | `material`、`section`、`pendingQuestions[]`、`touchedIds[]` | | `study_memory` | 读/写/清记忆 | `action` | `key`、`value` | ### 7.1 note_library — 库状态自检 返回:vault 路径与可写性、状态目录、块/存量卡/旧笔记计数、**期望文件状态**(不存在 / 未读 / 已读)、待消费规划。写入被拒时先用它定位原因。 ### 7.2 note_expect_get — 读期望(门禁开门) 返回《笔记期望.md》全文并**按文件签名标记已读**。文件不存在时报错并给出创建指引(复制 `presets/study/assets/笔记期望.md` 到 vault 根)。 ### 7.3 note_list — 逐层导航 ``` ## 计算机通识/计算方法/第2章 线性方程组数值解法 - 📁 直接法/(块 2) ⚠ 缺微目录 - 高斯消元法 · 块(《计算方法》第2章 线性方程组数值解法 / 2.1节) —— 初等行变换化上三角后回代 ``` - 目录计数与"缺微目录"**按子树累加**(父级目录通常只放章节标题,块在下几层)。 - vault 根的《笔记期望.md》不是笔记,不会列出来。 ### 7.4 note_get — 读全文 `ref` 支持 ID、标题、根限定路径(`vault/…`、`工作目录/…`)、相对路径、文件名。 ### 7.5 note_search — 关键词全库检索 命中行:`### 标题 [ID]` → `类型`(块/存量卡/旧笔记)→ `路径` → `领域/状态/来源/来源章节` → `简介` → `片段`。 `kind` 三态过滤;`path` 限定目录;`limit` 默认 5(上限 50)。无命中会**强制重扫一次**再给换词提示。 ### 7.6 note_overview — 主题总览与覆盖度 ``` 《计算方法》第2章 线性方程组数值解法——2 篇(节:2.1、2.2) - 高斯消元法(…/直接法/高斯消元法.md) - 列主元消元(…/直接法/列主元消元.md) - 《计算方法》:已记录第 2 章 ### 未归类 1 篇(缺 来源章节 或写法无法解析) ``` - 按 `来源章节` 聚合;节号按**数值**排序(`2.10` 在 `2.2` 之后)。 - **不虚构章节**:完整性只依据笔记里真实出现的章节号;缺口只给"未归类"与"节号跳号"提示。 ### 7.7 note_plan — 文件夹规划 - `items[]` 是待落块清单(`title` + `path`,同一规划内标题唯一)。 - `rootPath` 是规划根;之后 `note_write` 的 `path` 必须落在它之下。 - **提案只在对话里,不落盘**;凭据存 `.study/plans/.json`。 - 用户改结构 → 重新提案一次即可(拿到新的 planId,旧凭据作废)。 - 你拍板后必须**再调一次** `action=confirm`(此时 `rootPath` 传 **planId**)才能写入;未确认的规划会被 `note_write` 拒绝。确认后有效期**从确认时刻起算**(默认 24 小时),搁置太久(超过 24 小时)的提案要先重新提案。 - `action=abandon`(同样把 `rootPath` 传要放弃的 planId)放弃规划。 ### 7.8 note_write — 落块(门禁) 三连校验:期望已读且未变 → 规划已确认未过期 → 路径在规划根内、标题在清单内且未消费。 返回 `已写入:rel` + `ID:…` + 规划归属 + 缺微目录提醒 + 整篇内容。`dryRun` 只回显不落盘。 目标已存在时报错(避免覆盖);改写请用 `note_update`。 ### 7.9 note_toc — 生成微目录 - 只重写 `` 与 `` 之间的生成段;**你手写的导读段原样保留**(标题会按目录名归一)。 - 排序:`顺序` 键 → 标题字典序;条目带来源章节与一句话简介。 - 增删改名笔记后重跑一次即可保持一致;`dryRun` 先看将写入什么。 ### 7.10 note_link / note_unlink — 关联 `kind`:`prev`(前置)/ `next`(后续)/ `sibling`(同主题兄弟)。两侧都写(`prev`↔`next` 互为反向,`sibling` 同向)。 落盘为 `- 前置:[[目标]]`。重复关联不重复添加;旧笔记默认只写笔记侧;**先校验两侧再写,不留单向入链**。 ### 7.11 note_rename — 改名 同步 frontmatter 标题 → 文件名(仅当文件名 = 旧标题清洗结果)→ 全库 wikilink → 断链检测。 冲突时不做任何写入;只写 vault 内文件;旧笔记拒绝。 ### 7.12 note_history / note_restore — 存档与回退 - `note_history({ref})`:列出存档(时间/原因/原路径);`action=read` + `archiveId` 看全文。 - `note_restore({ref})`:恢复(缺省最新那份);恢复前当前版本也会先存档。 - 存档位置:`.study/archive//<时间戳>.md`(毫秒级时间戳,防撞名)。 ### 7.13 note_lint — 质量体检(4 条规则,无分数) | 规则 | 级别 | 判据 | | :-- | :-- | :-- | | `session-residue` 会话残留 | warn(可配 off/error) | 本机路径 / 源码行号 / 第二人称 / 会话时间词 / 阶段代号 / 会话口吻 | | `code-language` 代码块语言 | warn | 存在未标语言的代码块(报块序号) | | `external-resource` 外部资源 | info | `