前言¶
用 DeepSeek Harness(DSH)跑 Agent 时,「长期记忆、项目上下文、整理过的知识」往往只留在单次会话或进程内存里。会话结束或换任务后,模型侧难以稳定复用,你也缺少一份可检索、可 diff、可用 Obsidian 打开的本地归档。
常见做法是手写 Markdown、或让模型把内容吐进聊天窗口再复制粘贴——步骤碎、查重靠人、索引要自己维护。dsh-obsidian 是 DSH 社区插件(维护者 Auiowu,SkillHub 分类:记忆),在 Agent 侧提供结构化记忆与原始笔记两套工具,把内容写到本机 Obsidian vault,并在系统提示里注入使用规则,让写入与检索有固定语义。
下面按「是什么 → 能做什么 → 怎么装 → vault 与记忆规则 → 注意点」说明。
这是什么¶
dsh-obsidian(npm 包名 dsh-obsidian,当前资料中版本 0.1.0,MIT 许可证)把 DSH Agent 的长期记忆接到本机 Obsidian vault。插件向模型提供两个工具,并可选地在系统提示里说明 vault 路径、分区职责、何时该写、写之前如何查重。
生态上 DSH 是「一切皆插件」的运行方式;社区目录在 SkillHub,与 DeepSeek / 幻方无官方从属关系,本文仅依据仓库 README 与 package.json 说明事实。
核心功能¶
两个 Agent 工具¶
| 工具 | 用途 |
|---|---|
obsidian_memory |
结构化记忆:save / recall / search / list / forget / reindex,按 scope 分到 global、project、longterm、knowledge、workflow、daily 六个分区 |
obsidian_note |
原始笔记文件:read / write / append / search / list / recent / info / tree |
配套行为¶
- 自动目录结构:首次加载时创建
00-Inbox、10-Memory/{Global,Projects,LongTerm}、20-Knowledge、30-Workflows、40-Daily、90-Meta/templates,并补齐各分区_index.md。 - 索引维护:每次
save/forget后重写该分区_index.md的表格(标题、更新时间、状态、标签),在 Obsidian 里可直接点击浏览。 - 系统提示注入(
promptSection: true时):说明 vault 路径、分区职责、写入前先查重等规则,并附带各分区当前条目摘要(按digestRefreshMs低频刷新,不阻塞提示词组装)。 - 安全边界:所有相对路径必须落在 vault 内;写入永远拒绝
.obsidian/与.trash/。
安装与启用¶
插件以当前 DSH 进程权限访问本机文件系统;安装前建议阅读 GitHub 源码 与许可证。README 要求 danger-full-access 权限。
在 DSH 中安装 bundle(将 target 换成本机克隆或解压后的插件目录绝对路径;资料给出的是 bundle 安装方式,而非 dsh plugin add github:... 拼接命令):
# 在 DSH 里(需要 danger-full-access 权限)
plugin_manager install_bundle target="<插件目录的绝对路径>"
install_bundle 会处理 profile 的依赖与 bundle 选择,无需手工改 package.json / cordis.patch.yml。
配置¶
在 profile 的 cordis.patch.yml 里覆盖插件配置即可(install_bundle 首次写入的默认值已指向本机 vault,可按需修改):
- id: obsidian-memory
name: dsh-obsidian
config:
vaultPath: 'D:\Notes\MyVault'
promptSection: true
maxSearchResults: 40
maxReadChars: 40000
digestRefreshMs: 120000
| 字段 | 默认 | 说明 |
|---|---|---|
vaultPath |
空 | vault 绝对路径;留空时从 %APPDATA%\obsidian\obsidian.json 里取最近打开的 vault |
promptSection |
true |
是否注入系统提示段 |
maxSearchResults |
40 |
单次检索返回的匹配行上限 |
maxReadChars |
40000 |
单次读取/回显的字符上限 |
digestRefreshMs |
120000 |
系统提示里条目摘要的刷新间隔(毫秒) |
运行环境要求 Node.js >= 20(见 package.json engines)。
vault 结构与记忆语义¶
默认目录¶
首次加载会在 vault 下建立如下结构(README 中根目录名为 DeepSeek/,实际落点以 vaultPath 与插件逻辑为准):
DeepSeek/
├─ 00-Inbox/ 随手收集,定期整理
├─ 10-Memory/
│ ├─ Global/ 身份、用户偏好、环境事实
│ ├─ Projects/ 一个项目一篇
│ └─ LongTerm/ 跨项目可复用的经验
├─ 20-Knowledge/ 从网络与文档整理的知识
├─ 30-Workflows/ 可复用流程、脚本、提示词
├─ 40-Daily/ 每日日志 YYYY-MM-DD.md
└─ 90-Meta/
├─ README.md
├─ MEMORY-PROTOCOL.md 记忆协议(写入与归类规则)
├─ INDEX.md
└─ templates/ 五个模板
笔记 frontmatter 固定字段顺序:type / scope / project / title / created / updated / tags / source / status,插件按此顺序序列化,便于稳定 diff。
obsidian_memory 写入与归档¶
save时先按 文件名 → frontmatter title → 项目名 查重;命中则追加一节(### YYYY-MM-DD HH:mm),不命中才新建文件。- 仅当
mode: replace时整篇替换正文。 forget只把status改为superseded并追加归档备注,不删文件,历史可追溯。daily分区固定写40-Daily/<今天>.md,同一天多次保存会追加。
典型工作流可以是:Agent 在任务中用 search / recall 查是否已有同类记忆 → save 写入对应 scope → 你在 Obsidian 中打开 _index.md 或具体笔记核对;需要读任意 Markdown 时用 obsidian_note 的 read / tree 等操作。
适用场景与已知边界¶
适合谁:本机已用 Obsidian 管理笔记、希望 DSH Agent 把全局偏好、项目状态、长期经验、知识摘录落到同一 vault,并能在对话里检索与增量更新的开发者。
边界与注意(来自 README「已知边界」):
- 系统提示里的条目摘要按
digestRefreshMs刷新,刚写入的条目最多延迟一个周期出现在摘要里;obsidian_memory recall读的是实时文件,不受影响。 forget不删除物理文件;需要清理时请自行判断后手动处理。- 纯文件系统读写:Obsidian 开着一般无冲突,但同一文件不要同时手改与 Agent 写入。
经过上面的步骤,Agent 侧记忆与项目知识有了本地落盘与分区语义;细节以 vault 内 90-Meta/MEMORY-PROTOCOL.md 与仓库文档为准。