mcpField
R
remind

remind

github.com/radimsemAgent 工作流12968 次安装21 周前更新
代码仓库

关于 remind

remind 是面向 Agent 的工作区长期记忆读取技能,通过 remindb 查询 MCP 编译的 SQLite 视图。它提供树状导航、预算控制的搜索与读取,以及快照、关系和状态检查;写入操作交由 memorize。

主要功能

  1. 01浏览记忆树并定位内容
  2. 02按预算搜索和批量读取
  3. 03查看快照差异与节点历史
  4. 04跟踪节点关系和温度
  5. 05读取数据库统计与资源

适用场景

  1. 01开始新会话时了解工作区
  2. 02查询记忆中的事实或主题
  3. 03恢复离开期间的记忆变化
  4. 04检查数据库状态或呈现资源

MCP 相关

技能从 remindb 提供的 MCP 工具和 remindb:// 资源读取记忆;写入和修改则交由 memorize。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/radimsem/remindb --skill remind

安装后在 Claude Code 中输入/remind确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
fts5-syntax.md
relations.md
resources.md
snapshots-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。

评论

支持 Markdown