dsh-memj
以项目为主线的 DSH 记忆插件。开放知识书写,以及插件提示词编辑,让用户不改一行代码就能重新设计记忆库结构与模型被驱动的方式。默认的记忆库核心设计在于,项目以一份你自己设计的项目文档(默认是一份交接文档)作为实体,插件自动识别会话所属项目、把沉淀的知识与项目绑定,并把可复用的部分升级进主题与全局层。用最自然的逻辑完成知识的初筛,上下文可控压缩和留档。
安装
dsh plugin --profile web add dsh-memj
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-memj —— 让记忆跟着项目走
[English](README.en.md) | 中文
一个 DeepSeek Harness 记忆插件。
最大的卖点:你可以用它,做一个你的记忆系统
它给你足够颗粒度的读写工具,用硬校验守住数据安全与系统稳定;
剩下的最大自由度留给你 —— 下面这些都能在界面上直接改,不改一行代码:
你能改的 · 改了就变
知识类型 · 知识分几类、叫什么、什么时候用
文档模板 · 记忆长什么样:有哪些节、每一节怎么写
全部提示词 · 模型被怎么指挥、协议怎么定
一个例子:我没有做"子代理异步沉淀"。
但你可以改工具协议 / 提示词,让模型在收尾前 fork 一个子代理去沉淀
—— 这是系统性的功能变化,一样不改代码。
(再往前一步,就是给钩子写接口工具。)
一句话:你可以用这个记忆系统,做一个你的记忆系统。
核心设计思路
- 项目 = 记忆的实体 —— 一份规范由你自由设计的项目文档(默认就是一个 handoff),
它就是这个项目的总入口,跨会话、跨实例都用它;
- 交接是主路径 —— 把一轮工作压成下一轮的起点,压缩可控、可编辑、可留档;
- 插件自动识别会话属于哪个项目,沉淀的知识与项目绑定;
- 按你实际的多项目开发情况去找共性,把通用知识升级为主题 / 全局;
- 传统的 tag / kind / 搜索照常可用,可以嵌套叠加。
⇒ ⭐ 用最自然的项目逻辑、开发逻辑,完成知识的初筛与关联。
库就是一个目录(~/.dsh-memj/),拷走即迁移;
项目文档与知识全部是 Markdown,可读、可 diff、可随时用编辑器打开。
快速开始
⭐ 推荐:直接在 DSH 界面里装 —— 左侧「插件」页 → 右上角 「添加插件」 →
输入框填 dsh-memj → 「安装」。
不用敲命令、不用重启,装完侧边栏就有入口。(安装源按你的网络情况选即可。)
也可以走命令行(等价):
dsh plugin --profile web add dsh-memj
- 📦 npm:<https://www.npmjs.com/package/dsh-memj>(
pnpm add dsh-memj也可) - 🐙 GitHub:<https://github.com/jojoman2024/dsh-memj>
- ⚠️ 需 DSH
0.2.0-rc.2(该版本在 npm 上是@next标签;latest是更老的0.1.0-rc.6)
—— 详见 [安装](#安装) 一节
目录
卖点与设计核心:
- [最大的卖点:你可以用它,做一个你的记忆系统](#最大的卖点你可以用它做一个你的记忆系统)
- [核心设计思路](#核心设计思路)
- 知识跟着项目走 —— 项目是记忆的主线:每条知识都归属一个项目,其下再按主题 / 全局 / 类型 / 标签多维度复用
- 交接是主路径 —— 项目文档本身也是交接文档,把一轮工作压成下一轮的起点,压缩可控、可编辑、可留档
- 一切都开放 —— 文档模板、知识类型、全部提示词都可在前端进行编辑。
其余部分:
- [归属三层与升级机制](#归属三层与升级机制)
- [项目文档长什么样](#项目文档长什么样)
- [知识怎么存怎么找](#知识怎么存怎么找)
- [四种使用方式](#四种使用方式)
- [三种召回机制](#三种召回机制)
- [人侧面板](#人侧面板)
- [快速开始](#快速开始)
- [安装](#安装)
- [库长什么样](#库长什么样)
- [配置](#配置)
- [边界与已知限制](#边界与已知限制)
- [开发](#开发)
① 知识跟着项目走
这是整个插件的设计核心。
memj记忆插件,基于项目的根本逻辑,沉淀的知识跟着项目走,在根据项目共性升级成为主题知识、全局知识。
按照最自然的行为逻辑,天然聚合知识,贴近用户本身的需求
项目是主线:每条知识都归属一个项目,项目文档就是它的总入口:
┌──────────────────────────────────────────────┐
│ 项目 = 记忆的主线 │
│ │
│ HANDOFF-<项目>.md │
│ ├─ 叙事:这个项目一路怎么走过来的 │
│ └─ 知识索引:它旗下每条知识的一行说明 │
└──────────────────────────────────────────────┘
│ │ │
聚合出共性 │ 再提炼 │ 同时打上 │
▼ ▼ ▼
主题(跨项目通用) → 全局(无条件注入) 类型 · 标签
⭐ 但主线不等于唯一的检索维度 —— 一条知识同时带着:
维度 · 作用
项目 · 主线。它在哪个项目里被做出来的
主题 · 跨项目复用:这条知识别的项目也用得上
全局 · 跨主题通用,无条件注入
类型 · 它是事实 / 陷阱 / 流程 / 决策 / 留档
标签 · 自由词,和标题、描述同级参与检索打分
⇒ 所以模型既能"顺着项目"检索(我先看看这个项目里有什么),
也能"按话题"横着捞(凡跟"pnpm/发布"有关的知识,不管在哪个项目)。
两条路都通,而且可以叠加(例如"在主题 X 下,找带标签 Y 的")。
三个视图,对应三种问法
① 知识 —— 一条知识长什么样
知识的封面归属可由用户进行二次编辑。
② 项目 —— 记忆的主线
项目的归属同样可以进行编辑,项目文档的章节书写规范可在项目文档单独编辑,包括压缩和归档规则。
③ 主题 —— 跨项目的那条线
用户在新会话交接时,可以直接交接与项目相关的主题,获取相关主题的通用知识和关键上下文。
每个项目一份项目文档,它是这个项目的记忆总入口:
- 新会话接续这个项目时,读这一份就够——不用先猜"该搜什么关键词";
- 每条知识都挂在某个项目下,索引就写在那个项目的文档里
⇒ 顺着项目走下去,知识自然被带出来。
它和"一个扁平的大知识库"有什么不同:
· 扁平知识库 · memj
主线 · 没有,全靠关键词 · 项目——有确定归属,不会散落
找东西的入口 · 你得先想出关键词 · 以项目自然聚类知识,缩小召回范围更贴实际需求
换个角度找 · —— · 主题 / 标签横着捞,两条路都通
换了会话 / 换了机器 · 上下文要重建 · 沿着项目捡回来
⭐ 判据一句话:换一台机器、换一个会话,沿着"项目"能不能把上下文捡回来?
能 —— 这就是它要达到的效果。
⚠️ 为什么把项目当主线,而不是只按话题组织:话题会重叠、会变名、颗粒度难以控制,
光靠话题收不住——一件事做完了,相关的话题还在长。
而项目是有边界的:一件事做完了就是做完了,边界清楚。
⇒ 主线负责"收得住",主题、标签、关键字负责"捞得着"。
② 交接:把一轮工作压成下一轮的起点
交接(handoff)是本插件的主路径。
它解决的问题是:怎么让老窗口的上下文压缩可控,可留档。怎么让新窗口不用从头交代背景。
说一句「做一次交接」或输入 /memj-handoff,它会引导模型把这一轮的成果落成两样东西:
落到哪 · 是什么 · 给谁看
项目文档 · 这一轮的进展、踩的坑、定下的方案 · 下一个接手的人(或模型)
知识条目 · 可复用的结论:下次遇到同类问题该怎么办 · 将来任何一次检索或注入
⭐ 为什么必须是它,而不是"让模型写个总结":
· 随手写的总结 · memj 的交接
写到哪 · 聊天记录里,翻不回去 · 项目文档,有确定位置
写什么 · 模型自由发挥 · 由你写的规范决定(每节该写什么)
下次怎么用 · 你得记得有这回事 · 新会话读项目文档即可接续
会不会丢 · 压缩后可能被丢掉 · 落盘成文件,永不被压缩
能不能改 · 改不了 · 普通 Markdown,直接改
会不会越写越长 · —— · 有留档机制(原文照收,不是有损摘要)
⭐ 本质是一次主动压缩——把一轮百万 token 的过程,压成几 KB
"下一轮真正需要知道的"。但这次压缩是可控、可编辑、可留档的。
- 可控:压缩成什么样,由你写在项目文档的规范里(哪一节留什么、多少字该整理)。
- 可编辑:压完就是普通 Markdown,你可以直接改;改完下次交接照样沿用。
- 可留档:项目文档越写越长时,交接把最早写下的那些小节整段原文收进一条
history 留档知识,原处只留一行指针(完整 id + 一句话主题)——
⭐ 所以压缩可以一直做下去,而原文一个字都没丢、随时能按 id 读回来。
⚠️ history 留档照常存在库里、在知识库页看得见、按 id 读得回,
但不参与检索(搜索与热知识注入都会跳过它)——它不回答"下次该怎么做",
只负责"当初到底写了什么"。
⭐ 若把一段被取代的原文写成别的类型,它就会正常参与检索(通常不是你想要的)。
💡 这就是它和"让模型摘要一下"最关键的区别:
摘要是有损的、而且你事后无从核对;留档是无损的、指针一直指得到原文。
它同时是"人"和"模型"之间的交接:你随时可以打开项目文档看它记了什么、
写得不对就直接改——记忆不是你无法插手的东西。
不做全量交接也行:只想沉淀知识、不想动项目文档,或者反过来只更新文档不落知识,
都可以分开做(见 [四种使用方式](#四种使用方式))。
③ 一切都开放:模板、类型、提示词都由你定
memj 把三处本来该你说了算的东西全部开放出来。这三处正好对应
"记忆长什么样"、"知识分几类"、"模型被怎么指挥"。
a) 文档模板与书写规范 —— 决定记忆长什么样
节名、节数、每节要干什么,都由你定:
- 模板只在【新建项目】那一刻生效;已有项目记着自己的结构,改模板不影响它们。
- ⚠️ 节名不是文案,是程序协议 —— 读文档、重建骨架、统计信息都按节名来。
- ⭐ 每节标题下面那段规范,就是"这一节该写什么"(建模版时从模板复制过来),
模型读文档时会拿到它、按它写;
- ⭐ 规范可以就地编辑:项目详情页每一节的规范块上都有「编辑」入口。
⇒ 你可以把项目文档改成你自己的工作方式:做研究的用"公司画像/竞争格局",
做工程的用"接口契约/踩坑记录"。留档规则也写在这里
(例如"这一节超过 20000 字符就把最早的小节收进 history 留档")。
b) 知识类型 —— 决定知识分几类
一条知识属于哪一类形态,由你的词表决定。内置五种:
fact 事实 / trap 陷阱 / howto 流程 / decision 决策 / history 留档。
改它同时影响三处:模型能填哪些值(工具参数)、写库时的下拉、以及
"这类知识该怎么写"的指导语。
- 内置类型的 id 与显示名锁死(库里已有几百条知识在用它们);
- 「什么时候用 / 怎么写」可改,改错了随时改回;
c) 提示词 —— 决定模型被怎么指挥
写给模型的每一段文本——协议、使用指导、11 个工具的说明、命令文案、
各类内部提示词(评分、标签规范化、翻译、模板写作指导)——都能改:
特性 · 说明
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:7,最后更新 2026-10-20