記憶スコープとライフサイクル:デジタルブレインを管理する
この章で学べること
- スコープを区別する:どの記憶が「あなたと一緒に移動する」(クロスプロジェクト)ものか、「プロジェクトと一緒に移動する」(プロジェクト専用)ものかを理解します。
- 記憶を管理する:記憶を手動で確認、追加、削除する方法を学び、Agent の認知を整理しておきます。
- Agent をデバッグする:Agent が「間違った」ものを覚えている場合、どこを修正すべきかを知ります。
基本的な考え方
opencode-supermemory は記憶を 2 つの分離された スコープ (Scope) に分けます。これはプログラミング言語のグローバル変数とローカル変数に似ています。
1. 2 種類のスコープ
| スコープ | 識別子 (Scope ID) | ライフサイクル | 典型的な用途 |
|---|---|---|---|
| User Scope (ユーザースコープ) | user | 常にあなたと共に すべてのプロジェクトで共有 | • コーディングスタイルの好み(例:「TypeScript を好む」) • 個人的な習慣(例:「常にコメントを書く」) • 一般的な知識 |
| Project Scope (プロジェクトスコープ) | project | 現在のプロジェクトのみ ディレクトリを切り替えると無効になる | • プロジェクトのアーキテクチャ設計 • ビジネスロジックの説明 • 特定の Bug の修正方案 |
スコープはどのように生成されるのですか?
プラグインは src/services/tags.ts を通じて一意のタグを自動的に生成します:
- User Scope: Git メールアドレスのハッシュに基づいて生成されます (
opencode_user_{hash})。 - Project Scope: 現在のプロジェクトパスのハッシュに基づいて生成されます (
opencode_project_{hash})。
2. 記憶のライフサイクル
- 作成 (Add): CLI 初期化または Agent 対話 (
Remember this...) を通じて書き込まれます。 - 有効化 (Inject): 新しいセッションを開始するたびに、プラグインは関連する User と Project 記憶を自動的に取得してコンテキストに注入します。
- 検索 (Search): 会話中に Agent は特定の記憶を能動的に検索できます。
- 忘却 (Forget): 記憶が古くなったり間違っていたりする場合、ID を通じて削除します。
実践:記憶を管理する
Agent との対話を通じて、これら 2 つのスコープの記憶を手動で管理します。
ステップ 1:既存の記憶を確認
まず、Agent が現在何を記憶しているかを見てみましょう。
操作:OpenCode チャットボックスに以下を入力します:
現在のプロジェクトのすべての記憶をリストアップしてください (List memories in project scope)期待される出力: Agent は supermemory ツールの list モードを呼び出し、リストを返します:
// 出力例
{
"success": true,
"scope": "project",
"count": 3,
"memories": [
{
"id": "mem_123456",
"content": "プロジェクトは MVC アーキテクチャを使用し、Service レイヤーはビジネスロジックを担当します",
"createdAt": "2023-10-01T10:00:00Z"
}
// ...
]
}ステップ 2:クロスプロジェクト記憶を追加 (User Scope)
すべてのプロジェクトで Agent に日本語で返信してほしいと仮定します。これは User Scope に適した記憶です。
操作:以下のコマンドを入力します:
私の個人的な好みを覚えておいてください:どのプロジェクトでも、常に日本語で返信してください。
これを User Scope に保存してください。期待される出力: Agent は add ツールを呼び出し、パラメータ scope: "user" を渡します:
{
"mode": "add",
"content": "User prefers responses in Japanese across all projects",
"scope": "user",
"type": "preference"
}システムは記憶が追加されたことを確認し、id を返します。
ステップ 3:プロジェクト専用記憶を追加 (Project Scope)
次に、現在のプロジェクトに特定のルールを追加します。
操作:以下のコマンドを入力します:
覚えておいてください:このプロジェクトでは、すべての日付形式は YYYY-MM-DD である必要があります。
Project Scope に保存してください。期待される出力: Agent は add ツールを呼び出し、パラメータ scope: "project" を渡します(これはデフォルト値なので、Agent は省略するかもしれません):
{
"mode": "add",
"content": "Date format must be YYYY-MM-DD in this project",
"scope": "project",
"type": "project-config"
}ステップ 4:分離性を確認
スコープが有効であるか確認するために、検索を試みることができます。
操作:以下を入力します:
「日付形式」に関する記憶を検索してください期待される出力: Agent は search ツールを呼び出します。scope: "project" を指定しているか、混合検索を行っている場合、先ほどの記憶が見つかるはずです。
クロスプロジェクト能力の確認
新しいターミナルウィンドウを開き、別の異なるプロジェクトディレクトリに入り、「日付形式」を尋ねると、Agent はこの記憶を見つけられないはずです(元のプロジェクトの Project Scope に分離されているため)。しかし、「どの言語で返信してほしいか」と尋ねると、User Scope から「日本語で返信」の好みを取り出せるはずです。
ステップ 5:古い記憶を削除
プロジェクトの規約が変更された場合、古い記憶を削除する必要があります。
操作:
- ステップ 1 を実行して記憶 ID を取得します(例:
mem_987654)。 - 以下のコマンドを入力します:
ID が mem_987654 の日付形式に関する記憶を忘れてください。期待される出力: Agent は forget ツールを呼び出します:
{
"mode": "forget",
"memoryId": "mem_987654"
}システムは success: true を返します。
よくある質問 (FAQ)
Q: コンピューターを変えた場合、User Scope の記憶は残っていますか?
A: Git 設定によります。 User Scope は git config user.email に基づいて生成されます。2 台のコンピューターで同じ Git メールアドレスを使用し、同じ Supermemory アカウント(同じ API Key を使用)に接続している場合、記憶は同期されます。
Q: 追加したばかりの記憶が見えないのはなぜですか?
A: キャッシュまたはインデックスの遅延の可能性があります。 Supermemory のベクトルインデックスは通常秒単位ですが、ネットワークの不安定さにより一時的な遅延が発生する場合があります。また、Agent がセッションの開始時に注入するコンテキストは静的(スナップショット)であるため、新しく追加された記憶はセッションを再起動(/clear または OpenCode の再起動)しないと「自動注入」で有効にならない場合がありますが、search ツールを通じてすぐに見つけることができます。
付録:ソースコード参照
クリックしてソースコードの場所を表示
更新日:2026-01-23
| 機能 | ファイルパス | 行番号 |
|---|---|---|
| Scope 生成ロジック | src/services/tags.ts | 18-36 |
| 記憶ツールの定義 | src/index.ts | 183-485 |
| 記憶タイプの定義 | src/types/index.ts | - |
| クライアントの実装 | src/services/client.ts | 23-182 |
重要な関数:
getUserTag(): Git メールアドレスに基づいてユーザータグを生成getProjectTag(): ディレクトリパスに基づいてプロジェクトタグを生成supermemoryClient.addMemory(): 記憶の追加 API 呼び出しsupermemoryClient.deleteMemory(): 記憶の削除 API 呼び出し
次の章の予告
次の章では 先制圧縮の原理 を学びます。
以下のことができるようになります:
- なぜ Agent が「記憶を忘れる」のか(コンテキストオーバーフロー)
- プラグインが Token 使用率を自動的に検出する方法
- 重要な情報を失わずにセッションを圧縮する方法