warmwine/dsh-memoryleak
基于dsh的知识库和待办管理工具
Listed
0
Tools
Bundle verified
Preview
What it does
Notes and todos as plain Markdown files in your workspace: type /ml plus a sentence to jot into today's journal; todos come in three flavors — deadline, sleep-until-a-date (auto-wakes when due), and anytime; /ml view fuzzy-opens any file with a few keystrokes. Zero tokens throughout — nothing goes through the model, and your notes stay ordinary local files that git and any editor can read.
Best for
- Developers who want quick journal entries and structured todos stored as ordinary workspace Markdown.
- Users who need deadline, sleep-until-date, and anytime todo workflows.
- People who prefer notes that remain readable by Git and any text editor.
- Users who want fuzzy keyboard access to local note files through `/ml view`.
Not ideal for
- Users who need notes isolated per project; configured workspaces can write into the same Vault.
- Sensitive-note workflows where other DSH work directories or organizational processes may inspect the shared Vault.
- Users unwilling to configure and maintain a local Vault directory.
- Workflows requiring a hosted collaborative notes service rather than local Markdown files.
README
dsh-memoryleak
好记性不如烂笔头,有了 memoryleak 你就不会 memoryleak。 一个把记事本带进 DSH 的插件:记的东西全是本地 Markdown 文件,git 和任何编辑器都能直接用,换个工具也带得走。
[!WARNING] ⚠️ 隐私警示:谨慎使用本插件 ⚠️
任何 dsh 工作目录都可以把笔记写进同一个 Vault——这同样意味着你的领导很容易通过蒸馏(distill)你的 Vault 摸清你的动态。
- 当前请谨慎使用本插件,想清楚什么能记、什么不能记。
- 后续会推出「失联即焚」功能。在此之前,务必做好云备份,甚至不要把 Vault 放在公司电脑上。
- 在此之后,更要做好备份,防止系统自燃。
你能用它干什么
你在写代码的时候,总有各种事想顺手记下来:这个 bug 怎么修的、明天要跟进什么、哪天要交什么材料。这些事放进专门的笔记软件就散落各处,放在脑子里又会漏。这个插件把它们集中存在你自己指定的一个目录(Vault)里:
-
先选一个 Vault,只用选一次。刚装好时设置是空的,执行任意
/ml命令会引导你选一个本地文件夹:输入路径时Tab 自动补全(↑↓ 选候选,输e补盘符、~开头是用户目录),或直接用当前工作区;目录不存在会自动创建。之后所有日志、待办都固定写进这个目录,不再跟着会话的工作区跑。换项目、换会话,记的事都在同一个地方。 -
想到什么,一句话记下来。输入
/ml 明天找财务对一下发票回车,这句话就写进了今天的日志文件(2026-08-16.md)。文件就在 Vault 根目录,打开就能看,提交 git 就能留痕。 -
待办带结构和优先级。输入
/ml todo add 交季度报告,会弹一个固定表单问你类型和重要程度,各选一项、选完自动提交;选到 deadline / sleep 时输入区变成日期选择器(日历 + 今天/明天/本周/本月快捷键),点一下就定好日期。有截止日的到期自然浮出来;不急的可以设成”睡到”某天再提醒你。 -
找文件像 VSCode 一样快。输入
/ml view加几个字母,输入框上方弹出候选列表,↑↓ 选、Tab 补全、回车打开。 -
收尾时把对话沉淀成笔记。干完一段活,输入
/ml note:用当前模型把这一段对话压缩成工作记录、知识文件和结构化登记(详见下文「/ml note」专章)。整理过程在会话里实时流式可见。这是唯一花 token 的命令,其余命令全部本地完成。
安装
dsh plugin --profile web add github:warmwine/dsh-memoryleak
# 重启 dsh web 生效
# 卸载:dsh plugin --profile web remove dsh-memoryleak
装好之后在输入框敲 /ml help 看全部命令。
记的东西长什么样
全部是普通 Markdown 文件,放在 Vault 根目录。每天的日志叫 2026-08-16.md,每周的叫 2026W33.md(用哪种在设置里选):
start: 2026-08-10 ← 周志模板自带的起止日期
end: 2026-08-16
## MemoryLeak ← /ml 记的流水账都在这里
- 上午重构了扫描器
- 下午修了候选卡错位
## Todo ← /ml todo add 存的待办在这里
- [ ] (ml:deadline 2026-09-01 urgent) 完成设计稿
- [ ] (ml:sleep 2026-12-01 low) 学一遍内部源码
- [ ] (ml:anytime medium) 整理收藏夹
- [x] (ml:active low done:2026-08-16) 复盘一次上线
待办有四种类型:
| 类型 | 日期 | 是什么 |
|---|---|---|
deadline |
必填 | 有截止日的事,到点就出现在列表里,可用 /ml todo p 延期 |
sleep |
必填 | 暂时不想看见的事,到唤醒日才自动出现(出现时会自动改写成 active) |
anytime |
不填 | 随便什么时候搞一下的事 |
active |
不填 | sleep 睡醒之后的样子,系统自动转换,不用手动写 |
优先级三档:urgent(紧急)、medium(中等)、low(低)。完成一件事时(/ml todo d)会自动在后面记上完成日期(done:2026-08-16),取消完成或撤销时自动去掉;放弃一件事时(/ml todo c)复选框变 [-] 并记上取消日期(cancelled:2026-08-18),再执行一次恢复原样。就算你手动把文件的格式改坏了,那一条也只是变回普通待办,不会丢。
/ml note:把对话沉淀成笔记
干完一段活,输入 /ml note 回车(不带任何参数),插件用当前会话的模型把对话压缩整理进知识库。它是唯一花 token 的命令,其余命令全部本地完成。
整理范围:只处理「上一个 /ml note 之后 → 现在」的对话;本会话第一次执行则整理全部上下文。所以一支会话可以多次执行,每次只消化新的一段——不重复、不越压越胖。
过程可见:敲下回车立即出现开始信号(整理范围 + 模型 + 版本号),模型的压缩输出像普通回复一样逐字流式显示,完成后气泡定格为一条「📌 已整理」结果摘要,最后命令卡片给出完整回执(写入文件清单、token 用量)。失败时气泡定格为中断样式并给出错误。
产出四样东西(模型只负责压缩抽取,落盘格式全部由代码决定):
① 工作记录(当天/本周日志的 ## NOTE 段,每次整理一个 ### 小节,纯追加)
## NOTE
### 14:30 · 把 /ml note 命令从零做到能跑
- core 纯逻辑:转写裁剪、协议解析、渲染
- 宿主胶水:区间定位、llm 调用、落盘
② 知识文件(MOMENTO/ 目录)
MOMENTO/
├── index.md ← 知识索引(按文件名去重更新)
├── dsh-llm-stream-用法.md ← 一条长期知识一个文件;同名再写追加「## 更新 <日期>」
├── databases.md ← ③ 结构化登记:表格由代码渲染,按「名称」主键合并
├── servers.md ← 服务器:名称 / 主机 / IP / 登录用户 / 系统 / 备注
├── credentials.md ← 凭证:只登记「在哪、什么账号」,永不保存明文密码
└── glossary.md ← 术语表:术语 / 含义 / 备注
④ 汇总回执:整理范围(含消息数与是否裁剪)、写入文件清单、模型与 token 用量;条目不合规逐条告警而非整体失败。
零丢失写入:
- 压缩前先把 Vault 里的已有登记(databases/servers 等表格行、知识条目标题)喂给模型,要求增量增补——只输出新条目或有变化的字段(留空 = 保留原值),不会把本段对话当成全部上下文重建文件;
- 合并只认声明的格式;你手写的文件、格式对不上的内容永远不会被重写——内容对不上时只会在文件末尾追加一个带日期的小节;
- 每次写入前有防丢失守卫(合并后条目必须包含合并前的全部主键,否则拒绝写入);备份默认关闭(git 兜底),可在 vault 配置
noteBackup: true开启(见下); - 字段白名单、条数与长度上限、
|与换行清洗——模型输出无法破坏文件结构。
两个使用注意:
-
/ml note后面不要跟文字——跟在后面的内容不会发给助手也不会被记录,命令会直接报错并提示正确用法; - 模型用的是当前会话正在用的那个(新会话还没路由过模型时执行会提示先发一条消息)。
适配你自己的老库格式(vault 限定配置)
不想用内置的 MOMENTO/databases.md 标准表格?你的老库是自定义表头、YAML 列表、甚至「markdown 小节 + 内嵌 YAML 块」?在 Vault 根的 .memoryleak.yaml 里加一段 noteStructured,声明每类知识写到哪个文件、什么格式——这几个 note 配置键只住在这个文件里(GUI 保存不会冲掉,手改即生效),不配的类别继续用内置默认。三种格式:
noteStructured:
# ① markdown 小节 + 内嵌 yaml 块(复杂手工库):### 标题按模板定位,
# 块按复合主键匹配,命中块内合并 / 节内追加块 / 末尾未分类章追加
databases:
file: momento/databases.md
format: sections
heading: "{host}:{port}" # ### 标题模板(存储字段占位符)
key: [host, database] # 复合主键(同机多库各一条)
fields: [host, port, database, user, notes]
aliases:
notes: note # 模型字段 → 老库字段名(改名映射)
extraFields: # 老库自有字段白名单(模型可填)
- key: environment
desc: production 或 test
- key: purposes
desc: 这台库上跑的功能(列表)
# 未声明的字段(如 password)模型永不填写、合并时原样保留
# ② 纯 YAML 对象列表
servers:
file: infra/servers.yaml
format: yaml
fields: [name, host, ip] # 内置字段的子集(省略 = 全集)
key: name # 单字段或数组主键
# ③ 自定义表头的 markdown 表格
glossary:
file: infra/terms.md
format: table
header: [术语, 含义, 备注] # 你的表头(与 fields 一一对应)
规则与安全线(三种格式通用):按主键合并(新值非空才覆盖,列表字段追加去重);未声明的字段原样保留(老库的 password/rack/owner 等自有键模型不碰);格式对不上(表头不匹配 / YAML 不是列表 / 块解析不了)时只追加、绝不重写;防丢失守卫(条目只增不减,违反拒绝写入)始终生效。aliases 让模型说内置字段名(name/user/notes),落盘自动映射到你库里的字段名(hostname/admin/note);extraFields 里声明的自有字段(environment/purposes…)会连同说明一起告诉模型,转写中出现才填。
备份:默认不备份——vault 用 git 管理时版本历史就是兜底,不再产生裸露的 .bak 文件。需要时在 vault 配置里加 noteBackup: true 开启:修改已有文件前自动备份进 .backup/ 隐藏目录(保留原相对路径 + 时间戳,多次备份不互相覆盖;该目录已在默认扫描排除列表里)。
还可以放一个 note skill(记录约定):noteSkill: MOMENTO/.note-skill.md 指向一个 markdown 文件,内容会注入给模型当本 vault 的约定(命名习惯、必须标注的字段……),格式仍由代码强制:
# 本 Vault 的记录约定
- 服务器一律用「机房-编号」命名(如 bj-01),主机只写内网 IP
- databases.notes 必须标注环境(prod/staging/dev)
- credentials 只写 1Password 条目名,不写路径
命令一览
完整说明输入 /ml help 随时看,这里列个速查:
| 命令 | 干什么 |
|---|---|
/ml init |
指定/更换 Vault 目录(唯一的设置入口) |
/ml <文本> |
记一笔到今天(或本周)的日志 |
/ml todo add <内容>(简写 n) |
加待办,弹表单选类型和优先级 |
/ml todo list(简写 l) |
列出待办,默认只看没完成的 |
/ml todo list all / open / done |
按状态过滤 |
/ml todo list <关键词> |
按关键词过滤 |
/ml todo d <序号>(简写 done) |
把列表里第几条标成完成(或取消完成) |
/ml todo c <序号>(简写 cancel) |
取消该待办:变 [-] 并记 cancelled:日期;再执行恢复,从默认列表隐藏 |
/ml todo p <序号> [天数](简写 postpone) |
deadline 型延期:不填天数延 1 天;非 deadline 报错 |
/ml todo u(简写 undo) |
反悔最近一次 d / c / p,连按可以一路撤回去 |
/ml note |
用当前模型压缩区间对话进 MOMENTO/ 与日志 ## NOTE(唯一花 token 的命令) |
/ml view(简写 v) |
看今天(或本周)的日志 |
/ml view <文件名几个字母> |
模糊找文件直接打开 |
/ml help(简写 h) |
看这份说明 |
Vault 未设置时,除 help / init 外的所有命令都会直接报错并提示先执行 /ml init——init 是唯一严格的目录设置入口,不会自动弹引导。
输入 /ml view 后继续打字,输入框上方会弹实时候选:当前日志排第一个,下面是匹配的文件。↑↓ 换选中的,Tab 把文件名补全到命令里,回车直接打开,Esc 关掉。
设置分两层,都是手改友好的 YAML:
-
全局层存在
~/.dsh/settings.yaml的memoryleak:段(DSH 官方统一位置,和其他插件同款)。GUI 设置面板 → MemoryLeak 分区改的就是它:Vault 目录(「浏览…」弹系统目录选择对话框,「清除」一键置空)、扫描哪些扩展名、排除哪些目录、数量上限、默认过滤、用日志还是周志、两个模板的内容。 -
Vault 层是 Vault 根目录下的
.memoryleak.yaml。GUI 保存与/ml init都会双写——全局与这个文件同步为同一份,换台机器把整个 Vault 拷走、设置跟着走。读取时此文件里的键优先级更高(vault 路径除外——它只认全局层,文件里写了也无效);缺键回退全局层,全局层也没有就用默认值;文件写坏了也不崩,按缺失处理。手改这个文件仍可读,但下次 GUI 保存会被覆盖——例外是noteStructured/noteSkill/noteBackup这几个 vault 限定键:它们只住这一层、GUI 不展示,双写同步时原样保留(见上文「适配老库格式」)。
两件可能让你困惑的事
新建会话里命令没反应? DSH 的设计是:一个会话在发出第一条消息之前不挂聊天记录区,所以这时跑任何斜杠命令(包括官方的 /plan)结果都看不见,但命令其实执行了,文件也写了。随便发一条消息,之前的命令卡片就会补出来。
改了代码没生效? 浏览器部分(设置窗口、候选卡、命令卡片)刷新页面就行;核心逻辑(命令处理、扫描、文件读写)在服务端,要重启 dsh web。
开发
pnpm install
pnpm test # 364 个测试
代码分四层:src/core/ 是纯逻辑(含 core/note.js:转写裁剪 / 协议解析 / 落盘渲染),不碰文件系统,测试直接跑;src/adapters/ 负责真实的文件读写(测试用内存版替换);src/journal.js 与 src/note.js 是宿主胶水(日志写入、区间定位、ctx.llm.stream 压缩调用、MOMENTO 落盘);src/index.js 和 src/client.js 分别是服务端和浏览器两端。
给 AI 留了接口但还没启用:新的待办格式只需要注册一个新的解析策略;renderTodoJson 输出稳定的 JSON,将来 AI 可以直接按这个格式读和筛待办。
License
MIT
Frequently Asked QuestionsFAQ
Use the verified command dsh plugin --profile default add github:warmwine/dsh-memoryleak in a DSH-enabled shell. The command resolves the public package metadata and keeps the plugin attached to the catalog identity shown on this page.
Compatibility follows the bundle and profile status shown above. If a profile is not detected, keep the plugin disabled there and check the repository documentation before enabling it in production.
The GitHub link and activity metadata are the source of truth for releases and maintenance. Revisit this page after a new release to confirm the catalog has observed the latest version.