dsh-memory-organizer
Manifest validDSH 记忆本自动整理插件
dsh-memory-organizer
给已经存在的记忆本瘦身,不是另起一套记忆系统。
它盯着你的 markdown 记忆本,固定记忆区一旦超过阈值,就把最旧的内容整块搬进归档目录,原位只留一行占位——只搬运,不改一个字。
跟具体哪个记忆插件无关:只要本子里有一个「标题带记忆词」的区、按本文的标题格式写节,它就管得了。
它解决什么问题
DSH 的 dsh-whale-loli 插件把记忆本整个塞进提示词,上限 16000 字符。超了怎么办?它是这么切的(src/memory.js:361-372):
keptRoll = keptRoll.slice(1); // 先丢最旧的滚动摘要
// 再丢详细区
keptArchive = []; // 清空归档索引
keptFixed = fixed.slice(0, maxChars - 320) + '…(固定记忆太长,已截断)';
从前往后硬切。
而新写的记忆追加在文件末尾,正好在被切掉的那一头。也就是说:记忆本一超限,你写进去的东西从写下那一刻就是不可见的——写进去等于没写,而且不报错。
这不是省额度的问题,是保命的问题。只要固定记忆区压在阈值以内,整块就能完整注入,一个字都不丢。
所以阈值默认 15000(留 1000 给滚动摘要 / 详细区 / 归档索引)。
装
dsh plugin --profile desktop add dsh-memory-organizer
或者从源码装:
git clone https://github.com/JiessieM/dsh-memory-organizer.git
cd dsh-memory-organizer
dsh plugin --profile desktop add link:$(pwd)
装完重启 DSH 才会加载。
怎么确认活着:启动约 3 秒后会写一个心跳文件:
<DSH_HOME>/memoryORZ/.organizer-heartbeat
内容长这样:
2026-11-02T18:23:19.280Z pid=22100 threshold=15000 tick whale-loli-v2-live.md:12804
tick 后面的数字是当前固定记忆区的字符数。之后每 60 秒刷一次。
它怎么找记忆本
不写死文件名,扫两处:
<DSH_HOME>/*.md<DSH_HOME>/<一级子目录>/*.md—— 只下一层,不往node_modules那种深坑里钻
然后按两条判断到底是不是记忆本:
- 体积正常 —— 10 字节到 8 MB 之间
- 前 12 行里有记忆相关的标题 ——
# 我的记忆、# Memory、# 固定记忆、# 长时回忆录都算。不绑定任何插件、不要求具体叫什么叫法
侧重点是「标题」:正文里随口写一句「这个功能用到记忆模块」的笔记不算,标题里写着记忆的才算。这一条把误判挡掉了大半。
扫描时跳过 memoryORZ/(自己搬出去的归档)、node_modules/、plugins/、profiles/、attachments/、logs/、archive/ 这些目录,也跳过 【YY-MM-DD】… 开头的归档文件和 .bak-* 备份。
区名叫什么都行
没有 # 固定记忆 这个硬性要求。文件里第一个「标题带记忆词」的一级标题就是记忆区:
# 固定记忆 ✅
# 永久记忆 ✅
# 我的记忆本 ✅
# Memory ✅
# Core Memory ✅
# 鲸鱼娘记忆 · whale-loli-v2-live.md 这种文件头不会被当成区(带 .md 的跳过)。
一个区都没有也一样管:认出来之后先给你补一个 # 固定记忆 进去,再搭壳。位置在文件第一个一级标题之后,原有内容一个字不动。
多本同时管,各归各的目录,互不串。
找不到?用 files 指路
显式给了 files,插件就不扫描、也不校验指纹,指哪儿打哪儿:
config:
files:
- whale-loli-v2-live.md # 相对路径,相对 <DSH_HOME>
- D:/notes/my-memory.md # 也可以给绝对路径
一条字符串或一个数组都行。
记忆怎么分类
固定记忆区里放三个分区,新记忆一律写进 ## 近期记忆:
# 固定记忆
<!-- memory-format:v1 -->
- 记忆整理规则(插件只搬运,不改内容;概述、词条、状态标记全由我写)
## 印象 ← 常驻,插件永不搬
### 自我形象
### 主人
### 其他人
### 重要事件
## 技能 ← 索引区,只记哪些技能还在、哪些搬走了
## 近期记忆 ← 干活区,插件从这里搬(最旧的在上)
新建记忆本:不用自己搭壳
从零开始时,建一个 .md 扔进 <DSH_HOME>,里面只写一行就够:
# 固定记忆
插件巡到它(最多 60 秒)会自动补上格式块和三个分区壳,变成上面那张结构图的样子。补完就不再动——第二次巡检 changed 为假,一个字节都不写。
已有的记忆本(比如 whale-loli 新建出来的那种)被认出来时也一样:第一次补壳,之后只搬内容。
(自己手写整套结构当然也行,插件会认出来已经齐了,不重复插。)
标题格式
### 主题(可归档)【技能】【26-10-31】
- 一条小小节(10-31 14时)
- 另一条
拆开看:
| 部分 | 取值 | 必须 |
|---|---|---|
(进行中) / (可归档) | 只有这两个词 | 有日期时才有意义 |
【印象】 【技能】 【事件】 | 三类 | 没标的节插件不碰 |
【26-10-31】 | YY-MM-DD | 可省 |
状态词是固定词表,插件从标题末尾往前剥,剥不下来就停——所以 (新形象 2026-10-27 定稿) 这种括号不会被误当成状态。
日期用横杠不用斜杠:26-10-31,斜杠在 Windows 文件名里非法。
搬的规则
按"每轮是否必须上场"分死活,不按主题分(主题分不完)。
1. 印象区 —— 一条都不动。称呼、忌讳、硬规矩、定型的教训放这儿,它就该常驻。
2. 标了(可归档)的整节 —— 直接搬走。
3. 【技能】节的小小节 —— 三层降级:
- 超过 6 条 → 搬到剩 6 条,原位留一行
- 已归档 N 条小小节 - 还降不下来 → 每节继续往下压,但最低留 2 条
- 2 条都还超 → 整节迁走,并在
## 技能记一行索引
那个占位行是标记,不是垃圾——它让"搬过的节"和"从没搬过的节"在外观上区分得开。跨次运行会累加:上次 - 已归档 2 条,这次又搬 2 条,变成 - 已归档 4 条,不会并排长两条。
4. 进行中的事件 —— 不动。只有你自己标了(可归档)才会搬。
归档长什么样
落在:
<DSH_HOME>/memoryORZ/<记忆文件名>/
比如:
~/.dsh/memoryORZ/whale-loli-v2-live/
【26-10-23】【技能】英语学习.md
【26-10-28】【事件】搬家.md
【26-11-03】【技能】做饭(进行中).md
文件内容:
# 英语学习【技能】【26-10-23】
> 归档自 `whale-loli-v2-live.md` · 26-10-23 · 原因:固定记忆 15203 字符超过 15000
(原文,一个字不改)
几个细节:
- 同主题跨轮续写进同一个文件,不会每次新建一个
-2.md。文件名用首次归档的日期,后面每次续写加分隔线和当次日期。 - 文件名不带(可归档)——归档之后这词没意义了,只保留(进行中)。
- 整节迁走时,那条
- 已归档 N 条占位行不进归档内容,改在文首写一句"另有 N 条更早的归档在别处"。
安全
- 只搬不改。文件里每个字都原样进归档,插件不总结、不改写、不删内容。
- 先备份再写盘:每次落盘前先
copyFileSync一份<记忆本>.bak-<时间戳>。 - 原子写:写
.tmp-<pid>-<ts>再renameSync,中途断电不会留下半个文件。 - 不发工具、不注册提示变量,不碰
whale-loli的注入通道。文件变小了,它的composeMemory()注入自然就少,零冲突。
配置
cordis.patch.yml 里改:
- insert:
- id: memory-organizer
name: dsh-memory-organizer
config:
threshold: 15000
intervalMs: 60000
| 键 | 默认 | 说明 |
|---|---|---|
threshold | 15000 | 固定记忆区字符阈值。别调到接近 16000,那段余量是给其他三个区留的 |
intervalMs | 60000 | 巡检间隔。插件每轮只 stat 一次文件属性,超阈值才真解析 |
dryRun | false | 只报告不落盘 |
files | 自动发现 | 显式指定要管哪几个记忆本(字符串或数组,可给绝对路径)。给了就不扫描、不校验指纹 |
两个坑(写给要改 whale-loli 的人)
这插件跟 dsh-whale-loli 的解析逻辑强相关,两处必须知道:
一、# 固定记忆 区外的内容活不下来。
renderMemory() 每次写盘都按四个区重建整个文件,区标题以外的所有内容(包括文件头)会被直接丢弃。所以格式规则块必须塞在 # 固定记忆 里面,放文件开头等于每次写记忆就丢一次。
二、> 开头的行会被吃掉。
parseMemory() 里 zones.fixed.filter() 会把 > 行当引用滤掉,空行也滤。所以规则块每行用 - 开头,不能用 > 。
(顺带:这两条也解释了为什么容器头 ## 印象 下面得有一行普通正文——只有子节没有正文的标题会被 keepPopulatedHeads 删掉,注入里结构就塌平了。)
许可
MIT
Comments
Loading…
Similar plugins
by reaxlll
DSH工作区内跨会话记忆插件
★ 24
↓ 396/wk
MIT
JavaScript
Oct 24, 2026
dsh plugin --profile web add dsh-workspace-recollectionby hmlyx
简单的插件,让你的每个 AI 记录经验和记忆
★ 0
MIT
JavaScript
Aug 31, 2026
dsh plugin --profile web add dsh-memoryby 1304836815
DSH 会话级记忆插件:收尾提醒 + MEMORY.md 记忆索引维护 + 实时对话日志 + LLM 摘要压缩,配置面板在 设置→插件。Session memory for DeepSeek Harness.
★ 0
MIT
JavaScript
Aug 21, 2026
dsh plugin --profile web add @dsh-external/dsh-auto-memoryby xiaole3349
DSH 插件:记忆库与图书馆的浏览 GUI
★ 0
MIT
JavaScript
Oct 28, 2026
dsh plugin --profile web add dsh-memory-guiby MoonlitDropOfBlood
DSH的归档管理插件
★ 3
↓ 488/wk
MIT
JavaScript
Aug 29, 2026
dsh plugin --profile web add @duke-dsh-plugins/dsh-archive-managerby xs1023
DSH 外置记忆库插件(修复分支)— SQLite 长期记忆、分层压缩、搜索与归档
★ 0
MIT
JavaScript
Oct 4, 2026
dsh plugin --profile web add dsh-memory-vault