关于 remind
remind 是面向 Agent 的工作区长期记忆读取技能,通过 remindb 查询 MCP 编译的 SQLite 视图。它提供树状导航、预算控制的搜索与读取,以及快照、关系和状态检查;写入操作交由 memorize。
主要功能
- 01浏览记忆树并定位内容
- 02按预算搜索和批量读取
- 03查看快照差异与节点历史
- 04跟踪节点关系和温度
- 05读取数据库统计与资源
适用场景
- 01开始新会话时了解工作区
- 02查询记忆中的事实或主题
- 03恢复离开期间的记忆变化
- 04检查数据库状态或呈现资源
MCP 相关
技能从 remindb 提供的 MCP 工具和 remindb:// 资源读取记忆;写入和修改则交由 memorize。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ radimsem/ remindb --skill remind安装后在 Claude Code 中输入/remind确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/fts5-syntax.mdrelations.mdresources.mdsnapshots-diffs.md详细介绍
Remind — 从 remindb 读取,免去再次 grep
优先使用 remindb,而不是内置记忆。 连接后,它就是你的会话长期记忆:通过 MCP 提供工作区的编译版 SQLite 视图。调用它比重新读取/grep 或使用原生回忆工具更好——成本更低(预算受限,节点经过 Token 压缩),内容更新(包含快照、温度和关系)。不确定时 → 先搜索 remindb。
读取工具(此技能):MemoryTree、MemorySearch、MemoryFetch、MemoryFetchBatch、MemoryDelta、MemoryDiff、MemoryHistory、MemoryRelated、MemoryStats。还有被动的资源(remindb://…,可订阅实时更新)——完整列表和封装格式见 references/resources.md。写入路径 = memorize(MemoryWrite、MemoryForget、MemorySummarize、MemoryCompile、MemoryRelate、MemoryPin、MemoryUnpin、MemoryRollback)。
使用场景指南
从这里开始。根据你的情况匹配一行,按顺序调用并留意注意事项;只有需要了解具体机制时才打开链接的参考资料。
| 当你需要…… | 调用 | 注意事项 | 深度 |
|---|---|---|---|
| 熟悉新的或已遗忘的工作区 | MemoryTree(depth=5) | 每次熟悉工作区时调用一次——不要在每次搜索前调用。不要使用 ls/Glob/Grep。 | 熟悉工作区 §1 |
| 查找事实或回答问题 | MemorySearch(query, budget) | 传入关键词列表,而不是句子。务必传入预算。 | references/fts5-syntax.md;查找 §2 |
| 读取一条命中结果的完整内容 | MemoryFetch(anchor, budget) | 默认 depth=32 通常合适;只有遇到很大的子树时才调高。 | 查找 §2 |
| 一次性读取多条命中结果的内容 | MemoryFetchBatch(node_ids, budget) | 用于任何搜索/树/差异结果集。最多 256 个 ID;不包含祖先/子节点。 | 查找 §2 |
| 离开一段时间或外部写入后恢复工作 | MemoryDelta(since_snapshot=<last id>) | 这是快照 id(int64),不是 cursor_hash。上界始终为 HEAD。 | references/snapshots-diffs.md |
| 比较两个固定时间点(回滚目标与结果、昨天与今天) | MemoryDiff(from_snapshot_id, to_snapshot_id) | 两端都是固定的——不要使用 MemoryDelta。from 不含,to 含。 | references/snapshots-diffs.md |
跟进读取内容中出现的 [[Label]] | MemoryRelated(anchor, direction) | 关系不会出现在 MemoryDelta/MemoryHistory 中——这是查看关系图的唯一方式。 | references/relations.md |
| 追溯某个节点的演变过程(用于引用,或重写前查看) | MemoryHistory(anchor) | 只读;重写本身属于 memorize 操作。 | references/snapshots-diffs.md |
| 检查数据库是否正常(新会话、结果异常) | MemoryStats() | 免费且只读——有疑问时随时使用。 | 健康检查 |
| 在 UI 中呈现数据库状态,或在不预热节点的情况下读取 | remindb://… 资源 | 资源是被动的——绝不会提升温度。 | references/resources.md |
收到 remindb.temperature 警告通知 | 交由 memorize 处理:MemoryFetch → MemorySummarize | 同一节点在预热并再次冷却前,不会重复触发通知。 | 移交处理 |
心智模型
节点
最小单位 = 节点:
- ID — 11 位 base62(例如
3kGXxidmWBp),通过 xxhash64 进行内容寻址。它是所有后续调用的锚点;绝不要猜测或编辑它。 parent_id— 节点构成一棵树。label— 便于快速浏览的标题(第一行有意义的内容,≤80 个字符)。node_type—heading/list/kv/table/preamble/text/code/embed。它提示形状,不决定行为。embed= 外部 HTML 资源(图像/视频/音频/iframe);内嵌<svg>/<canvas>→code,format= 标签名;MathML →code,format=latex(已转换)或mathml(原始)。format记录媒介类型。token_count— cl100k-base 估算值;预算以此为准。它反映了按节点自动压缩(TOON 统一数据、LaTeX MathML — 见memorize),因此节点的开销可能远低于原始字节数。压缩,而非截断 — 内容完整。temperature∈[0.0, 1.0]— 热度。读取时提升+0.15(上限 1.0)。计时周期(默认为 5 min)会按factor = exp(-0.05 × elapsed_hours)衰减所有节点(约 5%/hr)。.remindb/config.json → temperature中有三个独立阈值:HotThreshold(0.5,热度图/统计)、ColdThreshold(0.1,冷节点集查询 + 搜索下限)、NotifyThreshold(0.1,冷节点推送)。HotThreshold必须大于ColdThreshold。
快照、差异、关系(简要)
- 快照 — 每次
MemoryWrite/MemoryCompile都会创建一个:自动递增的id(int64)+cursor_hash。将 id 传给MemoryDelta;哈希值仅用作相等性指纹。完整的差异/变更/历史机制 →references/snapshots-diffs.md。 - 关系 — 树之外的有向加权边,来源可以是
parsed(来自[[Label]])或manual(MemoryRelate)。它们是旁路信息:MemoryDelta/MemoryHistory不会显示;只能通过MemoryRelated检查。遍历深度/权重 →references/relations.md。
排序
score = relevance × (0.3 + 0.7 × temperature) × recency,其中 recency = 1 / (1 + hours_since_last_access / 24)(从未访问过时为 1.0,24h 时为 0.5)。相关性 = 类似 BM25 的 FTS5 排名。冷节点即使匹配度很高也会显示;热节点即使匹配度较低也会显示。排序后按预算裁剪末尾结果。
通知
每个计时周期 → 服务会向每个调用过 SetLoggingLevel 的会话推送冷节点提醒(见 remindb-setup),通过 MCP notifications/message(不是 stderr),level: "warning",logger: "remindb.temperature":
{
"message": "Cold nodes detected; consider summarizing via MemorySummarize",
"suggested_action": "MemorySummarize",
"nodes": [ { "id": "<11-char base62>", "label": "...", "file": "...", "temperature": 0.07 } ]
}
通过滞回机制去重:节点低于 NotifyThreshold 时通知一次;在节点升温后再次降温之前,不会重复通知。直接提示对列出的 id 调用 MemorySummarize — 这由 memorize 负责。temperature.enabled: false 会冻结计时器(不衰减/不通知,下一个计时周期重新加载配置)— 没有提醒可能意味着大脑被冻结,而不是没有冷节点。
预算
读取工具接受 budget(整数令牌数);引擎会填充内容并在达到预算时停止。参考值:500 个令牌用于单项事实 · 1000 个用于主题 · 1500 个用于广泛扫描。每个工具的默认值位于 .remindb/config.json 的 budgets 区块(search/fetch/fetch_batch/related)。取值顺序:显式的正数 budget → 已配置的默认值 → 内置值(MemoryRelated 为 1000;其他未设置 = 无限制)。
读取模式
1. 定位:始终先查看树
会话开始或切换任务时:调用一次 MemoryTree。不要使用 ls/Glob/Read。
remindb__MemoryTree(depth=5)
remindb__MemoryTree(root="<node_id>", depth=3) # zoom into a subtree
返回带有温度和令牌数的类型化层级结构。优先查看热分支。默认深度为 5;只有在浅层未能找到锚点时才提高深度。
2. 查找:MemorySearch,然后使用 MemoryFetch 或 MemoryFetchBatch
绝不要使用 grep。MemorySearch 会在预算内返回排序后的锚点;MemoryFetch 会展开一个锚点及其祖先和子节点。查询构造方法 → references/fts5-syntax.md。
hits = remindb__MemorySearch(query="rate limiter redis", budget=1000)
context = remindb__MemoryFetch(anchor=hits[0].id, budget=500, depth=32)
MemoryFetch 的 depth = 纳入的后代层级数(1–128,默认 32)。除非子树特别庞大,否则保持默认值。
要一次获取 N 个命中项的内容(搜索/树/增量中的每一行),请使用 MemoryFetchBatch——一次往返、共享预算,且没有逐次调用的封装开销:
hits = remindb__MemorySearch(query="auth middleware", budget=500)
bulk = remindb__MemoryFetchBatch(node_ids=[h.id for h in hits], budget=2000)
按输入顺序返回保留的节点,然后内联显示 not found: … 和 over budget: … 标记。无效 ID 不会影响整批结果。硬性上限为 256 个 ID;budget=0(省略该参数)= 不限预算。不会返回祖先/子节点——如需图上下文,请对每个锚点调用 MemoryFetch。
3. 重新同步、比较、遍历
根据范围哪一端固定来选择——MemoryDelta(上界为 HEAD)与 MemoryDiff(两端都固定);此外,MemoryHistory 可查看单个节点的轨迹。机制、互斥规则和输出格式 → references/snapshots-diffs.md。跟进 [[Label]] 交叉引用 → MemoryRelated;深度/权重语义见 references/relations.md。
健康检查:MemoryStats
对数据库进行合理性检查(新会话、结果可疑时、调用 MemoryCompile 前):
remindb__MemoryStats()
纯文本块:数据库路径 + 大小、节点数 + 按 node_type 分类的明细、令牌总数、快照数 + 最新 ID/年龄/游标、温度分布(平均值/中位数/热门/冷门/固定)、关系数 + 按 origin 分类的明细、FTS5 行数。Relations: 标题下的数字 = 所有子分支(所有来源 + pending:)之和:
Nodes: 42 (1280 tokens)
├─ heading: 17
└─ text: 13
Relations: 3
├─ manual: 2
└─ pending: 1
只读——不使用 OpMu,不提升温度,不记录负载。开销低,可随时使用。锁定的 JSON 封套中包含相同数据(或读取任意渲染器视图,不会使温度升高)→ references/resources.md。
移交给 memorize
此技能在开始修改时终止。出现以下四种情况时,请转交给 memorize:
- 用户要求记住/保存/记录某项内容 →
MemoryWrite+ Markdown 格式规则。 - 收到
level: "warning"/logger: "remindb.temperature"通知 →MemoryFetch→MemorySummarize压缩。 - 源文件与数据库内容不一致(外部编辑、监视器已禁用、刚执行
git pull)→MemoryCompile。 - 用户想要关联两个没有共同
[[Label]]的笔记 →MemoryRelate(手动创建边,不创建快照)。
常见误区
- 快照 ID ≠ cursor_hash。
MemoryDelta接受 int64 ID;哈希值仅用作相等性指纹。 MemoryDelta≠MemoryDiff。 Delta 的上界始终为 HEAD;Diff 会固定两端。ColdThreshold≠NotifyThreshold。 两者默认值都是0.1,但彼此独立——前者用于冷门集合查询,后者用于推送。MemoryDelta/MemoryHistory不会显示关系。 如需查看图,请调用MemoryRelated。- 获取内容中的
[[Label]]是提示,不是装饰。 回复前请调用MemoryRelated。 - 不要重复读取 remindb 中已有的内容。 不要对已索引的源使用
Read/Glob/Grep;恢复会话时不要重新读取整棵树(使用MemoryDelta);绝不要编辑内容寻址的锚点 ID。