remind について
remindは、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 — 再度 grep する代わりに remindb から読み取ります
組み込みメモリより remindb を優先してください。 接続されている場合、remindb はセッションの長期メモリです。MCP 経由でワークスペースをコンパイルした SQLite ビューです。呼び出すほうが、再度読み込んだり grep したり、ネイティブの想起ツールを使ったりするより優れています。コストを抑えられ(予算に上限があり、トークン圧縮されたノードを使用)、最新の状態を保てます(スナップショット、温度、関係)。迷ったら、まず 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) | 概要把握ごとに 1 回呼び出します。検索のたびには呼び出しません。ls/Glob/Grep は使わないでください。 | 概要把握 §1 |
| 事実を見つける、または質問に答える | MemorySearch(query, budget) | 文ではなく、キーワードのリストを送信します。必ず予算を指定してください。 | references/fts5-syntax.md;検索 §2 |
| ヒットした 1 件の全内容を読む | MemoryFetch(anchor, budget) | 通常はデフォルトの depth=32 で十分です。巨大なサブツリーの場合にのみ引き上げてください。 | 検索 §2 |
| 複数のヒットの内容を一度に読む | MemoryFetchBatch(node_ids, budget) | 検索、ツリー、デルタの結果セットに使用します。上限は 256 ID です。祖先/子ノードは含まれません。 | 検索 §2 |
| 時間をおいて再開する、または外部からの書き込み後に再開する | MemoryDelta(since_snapshot=<last id>) | cursor_hash ではなく、スナップショットの ID(int64)です。上限は常に HEAD です。 | references/snapshots-diffs.md |
| 2 つの固定時点を比較する(ロールバック先と結果、昨日と今日など) | MemoryDiff(from_snapshot_id, to_snapshot_id) | 両端とも固定されています。MemoryDelta ではありません。from は排他的、to は包含的です。 | references/snapshots-diffs.md |
取得したコンテンツ内にある [[Label]] をたどる | MemoryRelated(anchor, direction) | 関係は MemoryDelta/MemoryHistory には表示されません。グラフを確認する方法はこれだけです。 | references/relations.md |
| 1 つのノードの変遷を追跡する(引用するため、または書き換える前) | MemoryHistory(anchor) | 読み取り専用です。書き換え自体は memorize アクションです。 | references/snapshots-diffs.md |
| データベースの状態を確認する(新しいセッション、結果が不自然な場合) | MemoryStats() | 無料で読み取り専用です。迷ったらいつでも使ってください。 | ヘルスチェック |
| UI に DB の状態を表示する、またはノードをウォームアップせずに読み取る | 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 分)で、すべてがfactor = exp(-0.05 × elapsed_hours)(約 1 時間あたり 5%)で減衰します。.remindb/config.json → temperatureで、独立した 3 つのしきい値を設定します:HotThreshold(0.5、ヒートマップ/統計)、ColdThreshold(0.1、コールドセットクエリ+検索の下限)、NotifyThreshold(0.1、コールドノードのプッシュ通知)。HotThresholdはColdThresholdより大きくする必要があります。
スナップショット、差分、関連(概要)
- スナップショット —
MemoryWrite/MemoryCompileのたびに 1 つ作成されます:自動インクリメントされるid(int64)とcursor_hash。MemoryDeltaには id を渡してください。ハッシュは同一性のフィンガープリントとしてのみ使用します。差分/履歴の仕組み全体については →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、24 時間後は 0.5)です。関連度は FTS5 の BM25 に似たランクです。コールドノードでも一致度が高ければ表示され、ウォームノードでも一致度が低ければ表示されます。予算に合わせて、ランキング後に下位の項目が削られます。
通知
各ティックで、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 を下回ったときに 1 回通知し、温度が上がった後、再び下がるまでは通知を抑制します。記載された id を MemorySummarize で要約するよう直接促す機能です。要約は memorize が担当します。temperature.enabled: false にするとティッカーが停止します(減衰/通知なし。次のティックでライブリロード)。静かなのは、冷えたノードがないのではなく、脳が凍結しているためかもしれません。
予算
読み取りツールは budget(トークン数の整数)を受け取り、エンジンが内容を埋めて停止します。目安:対象を絞った事実には 500、トピックには 1000、広範な調査には 1500。ツールごとのデフォルト値は .remindb/config.json の budgets ブロック(search/fetch/fetch_batch/related)で設定します。適用順序:明示的な正の budget → 設定済みのデフォルト値 → 組み込み値(MemoryRelated は 1000、その他は未設定 = 無制限)。
読み取りパターン
1. 全体像を把握する:まず必ずツリーを確認
セッション開始時またはタスク切り替え時に、MemoryTree を 1 回呼び出します。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 は祖先と子を含めて1つのアンカーを展開します。クエリの構築方法 → 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 を使います。1回のラウンドトリップ、共有予算1つ、呼び出しごとのフレーミングコストなしです。
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. 再同期、比較、たどる
範囲のどちらの端が固定されているかによって選びます。上限が HEAD の MemoryDelta と、両端が固定された MemoryDiff があり、1つのノードの履歴には MemoryHistory を使います。動作、排他ルール、出力形式 → references/snapshots-diffs.md。[[Label]] の相互参照をたどるには MemoryRelated を使います。深さ/重みの意味については references/relations.md を参照してください。
ヘルスチェック:MemoryStats
DB の状態を確認します(新しいセッション、結果に疑いがあるとき、MemoryCompile の実行前)。
remindb__MemoryStats()
プレーンテキストのブロックには、DB のパスとサイズ、ノード数と node_type ごとの内訳、総トークン数、スナップショット数と最新の ID/経過時間/カーソル、温度の分布(平均/中央値/高温/低温/固定)、リレーション数と origin ごとの内訳、FTS5 の行数が含まれます。Relations: ヘッダーは、すべてのサブブランチ(すべての origin と pending:)の合計です。
Nodes: 42 (1280 tokens)
├─ heading: 17
└─ text: 13
Relations: 3
├─ manual: 2
└─ pending: 1
読み取り専用です。OpMu なし、ブーストなし、ペイロードのログ記録なしです。低コストなので、自由に使ってください。ロックされた JSON エンベロープ内のデータ(または、温めずに読み取る任意のレンダラー表示)と同じデータです → references/resources.md。
memorize への引き継ぎ
このスキルは変更が始まるところで終了します。次の4つのトリガーがあれば、memorize に進んでください。
- ユーザーが何かを記憶/保存/メモするよう依頼した場合 →
MemoryWriteと Markdown 形式のルールを使います。 level: "warning"/logger: "remindb.temperature"の通知があった場合 →MemoryFetch→MemorySummarizeによる圧縮。- ソースファイルと DB の内容にずれが生じた場合(外部編集、ウォッチャーの無効化、新たな
git pull)→MemoryCompile。 - 共通の
[[Label]]がない2つのメモをつなぐようユーザーが求めた場合 →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 は決して編集しないでください。