dsh-obsidian:把 Agent 记忆落到本机 Obsidian vault

前言

用 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

配套行为

  1. 自动目录结构:首次加载时创建 00-Inbox、10-Memory/{Global,Projects,LongTerm}、20-Knowledge、30-Workflows、40-Daily、90-Meta/templates,并补齐各分区 _index.md。
  2. 索引维护:每次 save / forget 后重写该分区 _index.md 的表格(标题、更新时间、状态、标签),在 Obsidian 里可直接点击浏览。
  3. 系统提示注入(promptSection: true 时):说明 vault 路径、分区职责、写入前先查重等规则,并附带各分区当前条目摘要(按 digestRefreshMs 低频刷新,不阻塞提示词组装)。
  4. 安全边界:所有相对路径必须落在 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「已知边界」):

  1. 系统提示里的条目摘要按 digestRefreshMs 刷新,刚写入的条目最多延迟一个周期出现在摘要里;obsidian_memory recall 读的是实时文件,不受影响。
  2. forget 不删除物理文件;需要清理时请自行判断后手动处理。
  3. 纯文件系统读写:Obsidian 开着一般无冲突,但同一文件不要同时手改与 Agent 写入。

经过上面的步骤,Agent 侧记忆与项目知识有了本地落盘与分区语义;细节以 vault 内 90-Meta/MEMORY-PROTOCOL.md 与仓库文档为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye