DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-memory-atlas

t

dsh-memory-atlas

Discovered

把一本 Markdown 记忆档案连成一张会生长的星图:命令行版 + DeepSeek Harness 插件

yan-memory · 砚的记忆

给长期运行的 AI 助手一条用得上的记忆。

不是存更多,是在它最容易忘事的地方停一下。


问题

上下文一断,助手就失忆。下一次开新会话,它不记得上周答应过什么、踩过哪些坑、你为什么改变过主意。

主流的解法是"存更多、检索更准":向量库、记忆插件、自动摘要。这些都有用,但解决的是存的问题。

真正的痛点在用:记忆存得很好,需要它的那一刻却想不起来调用。


我们的答案:三层

  1. 档案(存)——用 Markdown 写,按天追加,不自动改写。记忆的所有权留在人这边。
  2. 线头(什么时候想起)——把教训压成一句句触发词,塞进每个会话都会加载的 AGENTS.md。不靠模型自觉,靠上下文必须经过它。
  3. 星图(线在哪)——把档案变成一个能点、能搜、能顺着关联线走的网络。相似、显式引用、同日,三种边。

缺一层都不成立:

  • 只有档案:查得到,但不会在当下被想起;
  • 只有线头:会停一下,但停完不知道去哪找;
  • 只有星图:看得见,但看完就丢。

十分钟起步

  1. 建一个 Markdown 文件夹,比如 memory/,每天一个文件。
  2. 把 templates/lineheads.md 里的内容粘进你项目根目录的 AGENTS.md(或等价的常驻指令文件),按你踩过的坑改触发句。别把模板文件就叫 AGENTS.md——很多工具会把子目录里的 AGENTS.md 当成目录指令自动加载,模板正好会被误当成真指令。
  3. 每周一次:把你反复踩的坑,加一条线头。从没让你停过的,删掉。

三条迭代规则,比内容重要:

  • 只在真踩过坑的时候加一条;
  • 一条线头从没让你停过,就删(不留装饰);
  • 验收只有一条:同一个坑第二次踩时,当场停住。

星图:把档案连成网

tools/ 里两个脚本,只用标准库,Python 3.8+ 就够:

python tools/build.py --src <你的记忆目录>   # 拆节点、造边 → nodes.json / edges.json
python tools/gen.py   --src <你的记忆目录>   # 渲染 → index.html,浏览器直接打开

--src 指向任意一个装着 Markdown 的文件夹;不传就是当前目录。脚本自己找档案 (我的记忆档案.md / 记忆档案.md / memory.md / archive.md)和收件箱 (记忆收件箱 / 收件箱 / inbox),找不到就明说,不瞎猜。 想先看效果,拿 examples/demo 跑一遍,别拿自己的数据试。

三种边是它唯一的设计:

  • 相似(sim)——两段话用词接近。每个节点只连最像的 8 个,不然几千条边什么都看不见。
  • 点名(ref)——正文里写了「3月6日」这种日期,就连到那天。
  • 同日(day)——同一天发生的事彼此相邻。

看懂的是网,不是清单:一个坑和三个月后同一个坑之间有线,顺着走,才看出自己一直在原地。

主题色来自一张可以换的表:<src>/themes.json 优先,没有就用 tools/themes.json。 默认那份是按我们自己的事配的,你多半得换掉。


装进 DeepSeek Harness(可选)

plugin/ 是同一张星图的插件版:不生成 HTML 文件,直接在侧栏里开一页。 解析规则和 tools/build.py 一模一样,只是换成了 JavaScript —— 不用装 Python。

它是一个空壳。 插件里不带任何记忆、不带任何人的数据,装上去是空的, 你得把自己的记忆文件夹指给它,它才有东西可画。

dsh plugin add link:<这个仓库的绝对路径>/plugin

装完重开,侧栏多一个星图图标。点开选目录:

  • 拖拽旋转、滚轮缩放,点一颗星看它背后那段原话;
  • 「换个目录」可以随时指向别的文件夹,会记住上次的选择;
  • 中心那颗星默认叫「我」。想换成别的名字,在记忆目录里放一个 atlas.json:
{ "center": "你的名字", "title": "×× · 记忆星图" }

你的文件要长什么样

它能画出来的东西,全来自你自己的 Markdown。三种来源,认得哪一种就画哪一种:

  1. 档案——我的记忆档案.md / 记忆档案.md / memory.md / archive.md, 都没有就取目录下最大的那个 .md。正文按 ## 分节、段落之间空一行,每段算一个节点。
  2. 收件箱——目录里叫 记忆收件箱 / 收件箱 / inbox 的文件夹, 里面每篇按 ## [2026-03-05 21:14] [dsh] §3 / 一句话标题 开头,一条算一个节点。
  3. 更新日志——档案里 ## 14. 那一节如果是 | 日期 | 事件 | 的表格,每行算一个节点。 没有这一节就跳过,不报错。

themes.json 决定颜色怎么分。查找顺序:<目录>/themes.json 优先,否则用插件自带的那份 (工作 / 技术 / 学习 / 生活 / 关系 / 健康 / 想法 / 其他)。自带那份是按通用场景配的, 你有自己的分类就在目录里放一个:

{ "default": "其他", "themes": [{ "name": "工作", "keywords": ["项目", "会议"] }] }

写错了也不要紧——keywords 匹配不到任何东西,全部落到 其他 里,图还是画得出来。


我们只验证过一个人

这套东西是一个人和一个助手,用十几天、上百次真实踩坑长出来的。

它可能不适合你。写在这里的是我们怎么做的,不是最佳实践。

如果你拿它当模板改,请保留这条局限——别把一个个人方案包装成通用解。


目录

docs/        为什么这样做(含失败部分)
templates/   可直接抄的片段:线头、状态文件、收件箱
tools/       星图命令行版:build.py 拆节点造边,gen.py 渲染成 HTML
plugin/      同一张星图的 DSH 插件版(侧栏一页,不用生成文件)
examples/    假数据 demo,跑一遍就知道长什么样

醒来检查(每次会话开头确认档案还读得到)还没通用化,暂时只有星图这一半。

致谢

我们一直在用别人的开源。这个仓库是按自己的能力,还回去的一点东西。


MIT License

Comments

Loading…