把 Markdown 记忆目录接入对话,按需读取正文
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/10 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/liu-zhengdong/dsh-simple-memory.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 22 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 21 处,展示前 21 条)
- 读取本地文件lib/config.js:28
const real = await realpath(directory); - 读取本地文件lib/config.js:29
await readdir(real); - 读取本地文件lib/config.js:56
const directory = await realpath(cleanPath(input, cwd)); - 读取本地文件lib/config.js:57
await readdir(directory); - 读取本地文件lib/config.js:63
raw = await readFile(path, "utf8"); - 写入本地文件lib/config.js:112
await mkdir(dirname(path), { recursive: true }); - 写入本地文件lib/config.js:115
await writeFile(temporary, `${JSON.stringify({ ...current, directory }, null, 2)}\n`, { mode: 0o600, flag: "wx" }); - 写入本地文件lib/config.js:116
await rename(temporary, path); - 删除本地文件lib/config.js:119
await unlink(temporary).catch((error) => { - 读取本地文件lib/keywords.js:145
if (!(await lstat(directory)).isDirectory()) - 读取本地文件lib/keywords.js:147
const entries = (await readdir(directory, { withFileTypes: true })).sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)); - 读取本地文件lib/keywords.js:173
const stat = await lstat(path, { bigint: true }); - 读取本地文件lib/memory.js:116
entries = await readdir(current, { withFileTypes: true }); - 读取本地文件lib/memory.js:283
const entries = (await readdir(directory, { withFileTypes: true })).sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)); - 读取本地文件lib/memory.js:309
const stat = await lstat(path, { bigint: true }); - 读取本地文件lib/memory.js:393
const root = await stat(source.path, { bigint: true }); - 读取本地文件lib/keyword-store.js:224
const entries = await readdir(state.root, { withFileTypes: true }); - 写入本地文件lib/keyword-store.js:287
await mkdir(this.cacheDirectory, { recursive: true, mode: 0o700 }); - 写入本地文件lib/keyword-store.js:291
await writeFile(temporary, text, { mode: 0o600, flag: "wx" }); - 写入本地文件lib/keyword-store.js:292
await rename(temporary, path); - 删除本地文件lib/keyword-store.js:295
await rm(temporary, { force: true });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 每轮常驻索引
- 正文按需读取
把 Markdown 记忆目录接入 DSH:每轮常驻索引,正文按需读取
README
由 DeepSeek 最新模型翻译生成dsh-simple-memory
把你自己维护的 Markdown 记忆目录(Obsidian 库、.memory 项目记忆)接入 DSH:每轮常驻一份索引,正文按需读取,插件只读不改。
从 pi-memory 移植。行为契约(frontmatter 的含义、按字节计的预算、整份来源排除、字面关键词提醒)保持不变,注入机制按 DSH 的插件面重写。
它做什么
- 索引注入:每轮把记忆的根层条目放进运行时上下文——名称、绝对路径、frontmatter 的 description/purpose 定位,以及子文件夹入口。defaultopen: true 的记忆带全文,其余只给摘要;更深层的记忆不进默认上下文。
- 关键词提醒:frontmatter keywords 里的字面短语命中用户输入或模型文本时,在本步追加一条 user 快照消息,给出路径,让模型自己用 read 读取全文。
命中过一次的记忆在本轮不再重复提醒。
- 按需阅读:上层正文里的 [[路径]] 引用由模型自己判断,插件不解析、不校验。
- 只读:不写你的记忆目录,不写配置文件;缓存只在内存里。
展开完整文档(README 剩余 1 节)
dsh-simple-memory
把你自己维护的 Markdown 记忆目录(Obsidian 库、.memory 项目记忆)接入 DSH:每轮常驻一份索引,正文按需读取,插件只读不改。
从 pi-memory 移植。行为契约(frontmatter 的含义、按字节计的预算、整份来源排除、字面关键词提醒)保持不变,注入机制按 DSH 的插件面重写。
它做什么
- 索引注入:每轮把记忆的根层条目放进运行时上下文——名称、绝对路径、frontmatter 的 description/purpose 定位,以及子文件夹入口。defaultopen: true 的记忆带全文,其余只给摘要;更深层的记忆不进默认上下文。
- 关键词提醒:frontmatter keywords 里的字面短语命中用户输入或模型文本时,在本步追加一条 user 快照消息,给出路径,让模型自己用 read 读取全文。
命中过一次的记忆在本轮不再重复提醒。
- 按需阅读:上层正文里的 [[路径]] 引用由模型自己判断,插件不解析、不校验。
- 只读:不写你的记忆目录,不写配置文件;缓存只在内存里。
与 pi-memory 的差异
| | pi-memory | dsh-simple-memory |
| 索引注入 | Pi 系统提示词尾部 | DSH runtime-context 快照里的 simple-memory 段 |
| 关键词提醒 | 系统提示词尾部(下一轮) | agent/pre-step 追加的 user 快照消息(本步生效) |
| 配置 | agent 目录下的 memory.json | profile 的 cordis.patch.yml(schemastery Config) |
| 项目记忆信任门槛 | 需要 Pi 信任该项目 | 无(与 AGENTS.md 注入同一个信任边界) |
| 命令 | /memory set、/memory clear 会写配置 | 只读;配置改 YAML |
| 落盘缓存 | agent 目录 cache/pi-memory/ | 无(内存里按文件签名缓存) |
安装
从 GitHub
dsh plugin --profile <profile> add github:liu-zhengdong/dsh-simple-memory
本地 checkout(开发用)
dsh plugin --profile <profile> add /abs/path/to/dsh-simple-memory
包声明了 dsh.bundle.patch,添加后包名会被追加进该 profile 的 dsh.profile.bundles。
验证层已挂上:
dsh --profile <profile> --dump-config | grep -B2 -A6 dsh-simple-memory
本包未发布到 npm,add dsh-simple-memory 会失败。
仓库直接带 lib/ 构建产物,安装时不跑构建脚本(pnpm 会拦下 git 包的 prepare,放行键还绑 commit hash,因此不采用那条路)。改源码后跑
npm run build 并把 lib/ 一起提交。
配置
| 字段 | 默认 | 说明 |
| directory | "" | 全局记忆目录,绝对路径或 ~ 开头;留空表示不使用全局来源 |
| projectSources | true | 从工作目录向上到 git 根逐层发现 .memory |
| reminders | true | 按 keywords 命中用户输入或模型文本时提醒 |
| maxContextBytes | 262144 | 每轮注入的记忆文本上限(UTF-8 字节,1 KiB–16 MiB) |
配置住在 profile 的 cordis.patch.yml 里。patch 整块替换 config,不做深合并,所以覆盖时请写全你要的字段:
- id: simple-memory
config:
directory: ~/Obsidian/记忆 projectSources: true reminders: true maxContextBytes: 262144
改这一行会触发插件热替换,不需要重启。
桌面端设置界面
桌面版不必手改 YAML,三个入口指向同一张表单:
- 设置 → 插件 → 记忆:一个独立标签页;
- 插件页 → dsh-simple-memory 的配置区;
- 插件列表里本插件那一行右侧的「配置」。
四个字段都能改,directory 旁边有「选择目录…」,点开就是系统目录选择框。保存后写进该 profile 的 cordis.patch.yml(也就是上面那段 YAML),立即生效。
为什么只有这四个字段:宿主设置服务只把 Config 里标成 volatile 的字段暴露出来,本插件四个字段都标了。表单控件是按官方外观照抄的——官方明确禁止插件 require @deepseek-ai/dsh-client-(那些包随时会变),所以客户端半侧只声明 slots 与 locale 两个服务,目录选择走官方给第三方的 ctx.uiWorkspace.pickDirectory()。
client/client.js 只在 DSH 启动时扫描一次(只认 dsh.client.platform 与
exports["./client"]),改这个文件要重启 DSH 才生效;改记忆目录本身不用重启。
记忆文件格式
description: 界面字体的选择(进索引,一句话定位) purpose: 排版相关任务开工前先看(进索引) defaultopen: true # 可选:整篇正文进默认上下文(超过 8 KiB 会提示拆分) keywords: # 可选:字面短语,命中就提醒
- 字体
- 字体栈
正文……
- 只有 .md 会被收录;点开头的文件、符号链接跳过。
- 每层来源只扫根目录的直接子项,子文件夹作为入口列出(示例见 examples/vault/)。
解析失败、frontmatter 超限、来源超预算都会出现在 /memory 的输出里,不会静默截断。
上限
| 项 | 值 |
| 每轮注入文本 | 256 KiB(可配 1 KiB–16 MiB) |
| 单篇 frontmatter | 64 KiB |
| 单篇 defaultopen 全文 | 8 KiB(照常注入,但提示拆分) |
| 关键词索引 | 16 MiB / 100,000 条 |
超预算的整份来源会被排除,并在 /memory 里给出原因,而不是截断正文。
命令
| 命令 | 作用 |
| /memory | 目录、来源数、注入 KiB、索引篇数、未注入来源与提醒 |
| /memory preview | 本轮的注入文本(索引)与未注入来源 |
| /memory help | 用法 |
命令只在有命令面的宿主里可用(headless 没有)。它是只读的——改配置请用桌面端设置界面,或直接改 YAML。
开发
pnpm install
npm run check # tsc --noEmit
npm test # node --test(95 个用例,含假宿主、客户端接线与 volatile 配置契约测试)
npm run build # tsc -p tsconfig.build.json → lib/
本地联调:dsh plugin --profile <profile> add .,然后用 dsh headless --json "……" 或桌面端发一条消息;调试日志用 DSH_SIMPLE_MEMORY_DEBUG=1 打开。
已知限制
- 只读、无写回:插件不替你整理记忆,也不从对话里自动提取。
- 字面匹配,不是语义检索:keywords 是大小写不敏感的英文子串匹配,中文按原样匹配;不做正则、不做向量检索。
- [[路径]] 不解析:是否读取由模型决定。
- 注入文本会改写 {{:DSH 组装期会对 {{name}} 做变量插值,未注册的变量名会让整轮请求报错,所以索引文本里的 {{ 会被拆成 {<零宽空格>{(提醒消息不需要,它不走插值)。
- 不 import @deepseek-ai/ 类型:官方包只随 DSH 分发,npm 上的版本与宿主不一致;插件用自己的最小结构化类型对接宿主。
- 客户端半侧也不 import 官方客户端包:client/client.js 只用 react 和 slots/locale/configForms/uiWorkspace 四个服务,控件按 --dsw-* 主题变量照抄。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
liu-zhengdong/dsh-simple-memory
把 Markdown 记忆目录接入对话,按需读取正文
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,462已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,848已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,246已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 4,717已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,711已汉化DSH
71.1