memgit について
memgitは、セッションやプロジェクト、エージェントをまたいで使うAIアシスタント向けのバージョン管理付きメモリストアです。BM25検索に加え、Git形式の履歴、ロールバック、同期を備えています。
主な機能
- 01BM25によるメモリ検索
- 02プロジェクト単位のメモリ絞り込み
- 03Git形式のコミット、差分、ロールバック
- 04メモリストアのプッシュと同期
- 05セッション再開とメモリフック
- 06複数エージェントのブランチとマージ
活用シーン
- 01AIセッション間でプロジェクトの文脈を引き継ぐ
- 02既存リポジトリからメモリを初期化する
- 03変更されたメモリを確認または復元する
- 04チームでメモリルールを共有する
MCP 対応
MCPサーバーは、セッション再開、検索、取得、一覧表示、保存、チェックポイント履歴の確認を行う6つのツールを公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
7掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| recent | integer | いいえ | 含める最近更新されたメモリの数(デフォルトは 10) |
| checkpoints | integer | いいえ | 含める直近のチェックポイント数(デフォルトは 5) |
詳細
memgit — AI の記憶のための git
AI アシスタントはセッションが終わるとすべてを忘れてしまいます。memgit がそれを解決します。
コードのように永続化、差分確認、ロールバック、同期ができる、バージョン管理された AI 間共通のコンテキストです。プロジェクトの途中で Claude から Cursor、ChatGPT へ切り替えても、コンテキストはすでに引き継がれています。
なぜ claude.md ではなく、なぜ mem-search ではないのですか?
すでに両方を試したことがあるかもしれません。これらには次のような限界があります。
| 機能 | claude.md | mem-search プラグイン | memgit |
|---|---|---|---|
| 関連するコンテキストのみを読み込む | ❌ すべて読み込む | ⚠️ 最近の観察結果を読み込む | ✅ BM25 検索 — クエリごとに上位 k 件 |
| 複数リポジトリにまたがるプロジェクトを把握 | ❌ ファイル単位 | ❌ | ✅ メモリに project があり、現在のワークスペースが優先される |
| 既存のコードベースに導入 | ❌ 空の状態から開始 | ❌ 空の状態から開始 | ✅ memgit onboard — リポジトリから一度にストアを作成 |
| バージョン履歴 | ❌ | ❌ | ✅ 完全なコミットログ |
| セッション間の差分 | ❌ | ❌ | ✅ memgit diff |
| 誤ったメモリのロールバック | ❌ 手動編集 | ❌ | ✅ memgit rollback |
| Cursor、Windsurf、GPT で動作 | ❌ Claude のみ | ❌ Claude のみ | ✅ MCP / HTTP 経由ですべてに対応 |
| チーム同期 | ❌ ファイルをコピー&ペースト | ❌ | ✅ memgit git push |
| 10k 以上のセッションに対応 | ❌ ファイルが肥大化 | ❌ 検索が遅くなる | ✅ memgit squash |
| トークン削減量を測定 | ❌ | ❌ | ✅ memgit stats |
| 標準形式でエクスポート/インポート | ❌ | ❌ | ✅ TOON + git |
実証 — 測定可能なコンテキストコスト
実際の数値を確認するには、ご自身のストアでこれを実行してください(可能な場合は実測値、推定値にはその旨を明記しています)。
$ memgit stats
Total memories: 108 (41 feedback · 23 user · 19 project · 12 reference · 8 convention · 5 lesson)
Priority: 3 critical · 67 medium · 38 low
Context footprint (measured where possible; estimates labeled)
Surface Tokens
Full store (every memory as context) 12,840
Resume digest (measured render) 540
Recall block (estimate: top-3 rules ≈ chars/4) ~60
per-session injected ≈ 600 tokens (estimate) vs 12,840 tokens if the full store were loaded
なぜこれほど大きな差が出るのでしょうか? claude.md はセッションごとにコンテキストを すべて 読み込みます。memgit は上限付きの再開用ダイジェストと BM25 で一致した想起内容を挿入し、これまでに記録したすべてではなく、このセッションに関連する内容のみ を読み込みます。ダイジェストは実際にレンダリングして測定し、ストア全体のサイズは実際のコーパスサイズです。ここにシミュレーションによるベンチマークはありません。
git との類似性は文字どおりです
memgit のデータモデルは git に正確に対応しています。
| memgit | git |
|---|---|
mnemonic | ファイル |
MindState | ツリー |
checkpoint | コミット |
thread | ブランチ |
memgit commit | git commit |
memgit diff | git diff |
memgit log | git log |
memgit squash --keep-last 100 | git rebase -i --autosquash |
memgit git push | git push |
これは単なる比喩ではありません。memgit は git と同一のアーキテクチャである、コンテンツアドレス方式のオブジェクトストア(SHA-256 blob)を使用します。すべてのメモリには固定の SHA があります。同一のコンテンツには同一の SHA が割り当てられます。以前の状態はいつでも復元できます。
ストアは git リポジトリです
すべてのメモリは memories/ 以下の、読み取り可能な .toon ファイルです。標準の git を使ってメモリ一式を GitHub にプッシュできます。
memgit git init --remote [email protected]:yourteam/ai-memory.git
memgit git push
チームメンバーはプルして、最初のセッションから AI が学習したルールを利用できます。
git clone [email protected]:yourteam/ai-memory.git ~/.claude/memgit-store
memgit setup all
コードと同じように、メモリに対して grep、git blame、git diff を実行できます。
grep -rl "database" ~/.claude/memgit-store/memories/
git log --follow memories/no-db-mock.toon
git diff HEAD~7 memories/
インストール
Mac / Linux:
pip install memgit
Mac(Homebrew):
brew tap code4161/tap && brew install memgit
Windows:
choco install memgit
# or
pip install memgit
(Chocolatey パッケージは community.chocolatey.org で公開されています。新しくプッシュしたバージョンは、モデレーションを通過するまで数日かかる場合があります。pip install memgit なら常に最新版を利用できます。)
任意の AI ツールの設定(Python 不要 — 初回実行時に npx が自動インストール):
{ "mcpServers": { "memgit": { "command": "npx", "args": ["-y", "memgit-mcp"] } } }
クイックスタート(3 分)
# 1. Install and initialize
pip install memgit
memgit init # auto-detects the best location, finds your existing
# Claude Code memories, and offers to import them
# 2. Register with your AI tools (interactive picker)
memgit setup
# 3. See your token savings
memgit stats
init が手順を案内するので、パスを探す必要はありません。(後からのインポートは引数なしのコマンド 1 つで完了します。memgit sync が ~/.claude/projects/*/memory を自動で見つけます。)
AI ツールを再起動してください。これで、すべてのセッションの開始時にメモリストアが検索されます。
プロジェクトの途中で memgit を導入する
メモリツールにはコールドスタートの問題があります。プロジェクトの途中でインストールしても、何も知らない状態です。最初の起点がなく、コンテキストは今後のセッションから少しずつしか蓄積されません。memgit は一度だけのシード処理でこれを解決します。
cd your-project
memgit onboard # mines the repo, prints the bootstrap brief
onboard はまず、リポジトリの要約を決定的に抽出します。Git の履歴(最近のコミットの件名、変更頻度の高いファイルやディレクトリ、作者、ブランチ、タグ)、マニフェストから検出した技術スタック、読む価値のあるドキュメントが対象です。読み取り専用の範囲を限定した調査を使うため、巨大なリポジトリでもほぼ瞬時に完了します。続くブリーフでは、AI エージェントに対して、その情報を使って何をすべきかを正確に指示します。指定されたファイルだけを読み(ツリーを再帰的にたどらず)、長期的に有用な事実を10~20個(目的、アーキテクチャ、規約、現在の状態、注意点)抽出し、それぞれを型付きメモリとして保存して、シード一式をチェックポイントに保存します。これをセッションに貼り付けても、貼り付けなくても構いません。メモリがないプロジェクトで AI がメモリを検索した場合、MCP サーバー自体が単なる「結果なし」ではなく、ブートストラップの手順を返します。
メモリはプロジェクト単位で管理され、デフォルトでフィルターされます(v0.7.0)。各メモリには所属するワークスペースが記録され、検索、再呼び出しの注入、再開ダイジェスト(最近のメモリ、チェックポイント、深さのヒント)は、現在のプロジェクトのファミリーと明示的にグローバルに設定されたメモリにフィルターされます。別のプロジェクトの内容が漏れることはありません。memgit search --all-projects/all_projects: true で意図的に範囲を広げると(その場合、すべての検索結果に project ラベルが付きます)、または --project で特定のプロジェクトに絞り込めます。プロジェクトが指定されていないメモリは明示的にグローバル(どこでも適用)です。memgit add --global または project: "" で保存します。プロジェクトを特定できない保存が、暗黙のうちにグローバルになることはありません。_unknown の下に隔離され(list では [?project] と表示され、lint でフラグが付けられ、検索結果には表示されません)、memgit doctor --relabel でラベルを付け直すまでそのままになります。
中断したところから再開する
新しいセッションで AI に「保留中のタスクを進められますか?」と尋ねると、たまたま開いているファイルから推測します。memgit resume は、その推測を記録に置き換えます。
memgit resume # last checkpoints, work in flight, recent + critical memories
memgit resume --plain # plain text, for piping into an AI context
memgit resume --json # for tooling
Claude Code に組み込んで、メモリを自動化しましょう。ツールの呼び出しも、判断も必要ありません。
memgit setup hooks # installs all six hooks (~/.claude/settings.json)
| フック | 強制される内容 |
|---|---|
SessionStart | すべてのセッションが、コンテキストに再開ダイジェスト(ステータスボード、チェックポイント、重要なルール、メモリインデックス)を含めた状態で始まります |
UserPromptSubmit | 各プロンプトがストアに対して BM25 で照合され、関連するメモリが注入されます。さらに関連メモリがある場合は「'' に関するメモリがあと +N 件あります」という深さのヒントで終わります(関連度の基準を満たすものがなければ何も表示されず、セッション中に繰り返しません)。スキップするには --no-recall を指定します |
PreToolUse | メモリのトリガーに一致する Bash 呼び出しまたはファイル書き込み呼び出しは、ルールを理由として拒否されるか(優先度3のフィードバックと規約)、コンテキストとしてルールが渡されます(それ以外)。memgit allow SLUG で短時間のオーバーライド期間を開始できます。トリガーキャッシュのみを使用します。スキップするには --no-gate を指定します |
PostToolUse | パスがメモリタグに一致するファイルを読み込むと、1行のヒント(「このパスには 'x' のタグが付いたメモリが6件関連しています」)が表示されます。タグマップキャッシュのみを使用し、セッションあたり最大3回です。スキップするには --no-ctx-recall を指定します |
Stop(ガード) | ゲートを通らずに実行された管理対象の呼び出し、または実作業を行ったのに何も保存しなかったセッションは、終了前に1回だけブロックされます。スキップするには --no-guard を指定します |
Stop(同期) | セッション終了時に、Markdown 形式のメモリが非同期でチェックポイントに保存されます |
優れたツールの説明を書くのではなく、なぜフックを使うのでしょうか?実測しました。実際の166セッションで、フックによって注入されたコンテキストは**100%に届いた一方、自発的なメモリツールの呼び出しは6%**でした。フックによって強制されることは、確実に実行されます。
再開ダイジェストの範囲は意図的に限定されています(500件のメモリストアで測定した場合、約350トークン)。ルールは短縮され、重要項目の一覧には上限があり、全文は get_memory を1回呼び出すだけで確認できます。
10,000 件以上のセッションに対応
数か月使い続けると、チェックポイントの履歴が増えていきます。Squash で圧縮し、gc でディスク領域を回収できます。
memgit squash --keep-last 100 # keep last 100 checkpoints, squash everything older
memgit squash --older-than 30 # squash everything older than 30 days
memgit squash --dry-run # preview first
memgit gc # delete unreachable objects, trim reflogs
memgit gc --dry-run # preview
memgit gc --squash-keep 200 # compact history, then sweep
現在のメモリの状態は常に保持されます。また、squash は実質的にロスレスです。折りたたまれた各チェックポイントは、.memgit/logs/archive/ にある追記専用のアーカイブに、1 行の記録(時刻、作成者、差分、メッセージ)を残し、gc がこのアーカイブに触れることはありません。2,000 件のチェックポイントを含むストアでのベンチマークでは、94% 小さくなり(39.5 MB → 2.2 MB)、fsck も問題ありませんでした。履歴操作はチェーンが増えても O(1) のままです(SHA の解決とチェックポイント数のカウントは、2,000 件で約 0.08 ms でした)。
複数のエージェントで1つのメモリを共有
すべての書き込みは Git 形式のストアロックを通るため(オーバーヘッドは 0.08 ms)、エージェントが同時に動作してもストアが破損したり、互いの更新が失われたりすることはありません。方法は2つあります。
共有スレッド — エージェントが同時に書き込みます。一方のエージェントがコミットしたときに、もう一方の作業がステージ済みであれば、2回目のコミットでは上書きするのではなく、記録されたベースに対して3方向マージが自動的に行われます。各チェックポイントに実行者を記録するには、MEMGIT_AUTHOR=agent-name を設定します。
エージェントごとのスレッド — 分離してから統合します。
memgit thread create agent-1 # branch off for each agent
# ... agents work on their own threads ...
memgit merge agent-1 # three-way merge back (common-ancestor based)
競合(同じメモリが両側で変更された場合)は、最新のバージョンに解決されます。編集は常に削除より優先されます。両方の履歴が保持されます。
AI に表示される内容
MCP 経由で登録すると、各 AI ツールに6つのツールが表示されます。
| ツール | AI が使用するタイミング |
|---|---|
resume_session | 以前の状態に依存するリクエストの場合 — 「続けて」、「保留中のタスク」、セッション開始時 |
search_memories | 過去の作業や好みに触れる質問に答える前 |
get_memory | 特定のメモリの詳細が必要な場合 |
list_memories | 保存されている内容を確認または監査する場合 |
save_memory | 次回のために保存する価値のあることを学んだ場合 |
get_checkpoint_log | メモリが最後に同期された時刻を確認する場合 |
ツールの説明では、キーワードによる判定ではなく、「このリクエストは、コンテキストにない状態に依存しているか?」という判断力を AI に教えます。ツール全体のコストを測定したところ、セッションごとに約 1,150 トークンで、resume_session の応答は約 335 トークンでした。
破損した状態で届いた保存要求は、保存せずに拒否されます(v0.13.0)。モデルがフィールド名のタグ(</rule>)で値を閉じてしまい、その後ホストが次のパラメーターをその値の中に渡すことがあります。その結果、why、when、tags、type_code が届かず、メモリがデフォルト値で保存されます。あるマシンでは、3,025 件の保存のうち748件で発生しました。save_memory は現在、ツール呼び出しのマークアップを含む値を拒否し、フィールド名と、その中に取り込まれたパラメーターを示します。モデルは同じターン内で再試行します。バッククォート内に意図的に引用されたマークアップは許可されます。保存が成功するたびに、保存した各フィールドの長さ、空のまま届いたフィールド、デフォルト値が使われた値が出力されます。ストア内にすでにある破損したメモリが、コンテキストに返されることはありません。ダイジェスト、想起フック、読み取り結果では、破損箇所で各フィールドが切り詰められて表示されます。memgit doctor は破損件数を数え、memgit doctor --repair-markup は各フィールドに分割して元に戻します。
コア運用ガイド(v0.5.0)
プロジェクトのオンボーディングで最も難しいのは、何をするかではなく、どう作業するかです。どのスキルを呼び出すか、どのコマンドを実行するか、どのツールを使うか。こうした情報は、AI ホストが読み込むよう設定されているとは限らない CLAUDE.md やスキルフォルダーに保存されています。memgit がこれを引き継ぎます。
memgit core seed は、プロジェクトに既存のスキルとルールファイルから、コンパクトな運用ガイドを作成します。memgit core sync は、各 AI ホスト固有のルール領域すべてに、memgit が所有する専用ファイルとして書き込みます — .claude/rules/memgit.md、.cursor/rules/memgit.mdc、.windsurf/rules/memgit.md、.clinerules/、.roo/rules/、.continue/rules/ — さらに、共有の GEMINI.md(Gemini CLI はこのファイルのみを自動読み込みします)と Codex の AGENTS.md に、マーカーで区切られたブロックを書き込みます。これは追加のみで、memgit がユーザー自身の設定やコンテンツに手を加えることはありません。また、セッション開始時に挿入されるため、ネイティブの設定がなくても、どのツールもプロジェクトでの作業方法を把握できます。
さらに、学習します。サイドカーの使用履歴により、実際に呼び出されたメモリが追跡され、最もよく使われるメモリは、時間とともにガイド内のポインターとして自動的に昇格されます(予算に上限があり、時間とともに減衰し、常にリポジトリ独自のルールに従います。ルールを言い換えたり、上書きしたりすることはありません)。内容が古くなった場合は、memgit core heal で再構築できます。
0.8.0 からは、ガイドも自動で作成されます。プロジェクトにいくつかのメモリが蓄積されると、最初のガイドが自動的に作成されるため、誰かが core seed の実行を思い出すまでループが止まることはありません。ガイドの冒頭では、プロジェクトに実際に保存されている内容を示します — 「このプロジェクトには、トピックを扱う保存済みメモリが N 件あります」。実際の過去の作業件数を示すことは、モデルが行動する根拠になります。一方、メモリを確認するよう抽象的に指示しても、モデルは自分の確信度と照らし合わせて無視する可能性があります。
memgit Pro — すべてのマシンで使えるひとつのメモリ
ローカルエンジン、ストア、MCP サーバー、および以下のすべてのコマンドは MIT ライセンスで、利用制限はありません。Pro は、複数のマシンやチームで作業する人向けのホスト型サービスです。サーバーには暗号文のみを保存するエンドツーエンド暗号化の同期を、ひとつのライセンスキーで利用できます。
memgit pro activate <key> # validate the key with Polar and store it (mode 0600)
memgit pro status # Free / Pro, last verification, expiry
memgit pro deactivate # remove the key from this machine
- memgit.dev/#pricing でキーを購入できます — 月額 12 ドルまたは年額 99 ドルです。Polar による請求で(販売者として記録され、税金も処理されます)、キーはメールと Polar の購入ページに届きます。
- マシンから外部に送信されるデータは、キーと memgit の公開組織 ID のみで、Polar の検証エンドポイントに送られます。メモリの内容が送信されることはありません。
- ヘッドレスホストでは、MCP サーバーの環境変数に
MEMGIT_LICENSE_KEY=<key>を設定します。同じキャッシュを使って検証され、ディスクには書き込まれません。 - フェイルオープン方式です。過去 14 日以内に検証されたキーはオフラインでも引き続き使えます。キーが拒否された場合は、明確なメッセージとともに Free に切り替わります。プランの期限が切れてもデータがロックされることはなく、読み込み、プル、エクスポートは引き続き利用できます。
- このストアが memgit cloud にログインしている場合、
pro activateを実行すると、そのアカウントもアップグレードされます。
マシン間およびチームとの同期
memgit cloud signup --email [email protected] # 14-day trial; keys are made on this machine
memgit cloud team create myteam
memgit cloud link myteam/memory # creates the cloud repo on first link
memgit cloud auto on # every save syncs in the background from now on
自動同期が有効な場合、保存するたびに(AI によるすべての save_memory を含みます)、バックグラウンドでプルしてからプッシュする処理が 1 回開始され、すぐに戻ります。また、各セッションの開始時に、ほかのマシンで保存された内容がプルされます。memgit cloud auto status では、最後の実行と、実行されなかった場合はその理由を確認できます。
エージェントは実行するものの、対話型セッションは実行しないマシン(Mac mini や VM など)では、一度ログインしてリンクし、その後は systemd または launchd で最新の状態を保ちます。
memgit cloud watch --interval 60 # pull and push forever, one JSON line per run
memgit cloud watch --export ~/agent/.hermes.md # also write the digest for agents that read context files
マシンから外部に送信されるデータはすべてエンドツーエンドで暗号化され、サーバーには暗号文のみが保存されます。
実際に実行されるバックアップ
memgitの前提は、AIが操作を担うことです。しかし以前は、バックアップするには人間がmemgit git init --remote <url>を覚えて実行し、その後もプッシュし続ける必要がありました。このプロジェクトのストア自体では、開始から5週間、1,734件のメモリーが1台のディスクにしかなく、ほかにコピーはありませんでした。人間がコマンドを実行しなければならないメンテナンスタスクは、実行されないタスクです。
0.9.0以降、セッションの終了時に自動で実行されるようになりました。安全性の境界は、作業の手間ではなく、ネットワークへの送信にあります。
- ローカルの保存先には自動でバックアップします — すでに利用しているクラウド同期フォルダー(iCloud、Dropbox、Google Drive、OneDrive)や外部ボリュームが対象です。memgitはファイルをコピーするだけで、接続を開くことも、サービスに登録することもありません。あとは既存の同期クライアントが処理します。
- Gitリモートへのプッシュは、すでに設定している場合に限ります。 memgitがリモートを勝手に作成したり、リポジトリを作成したり、選んでいないホストにメモリーを送信したりすることはありません。メモリーには認証情報が含まれることがあり、利便性は、選んだことのない場所に公開する理由にはなりません。
バックアップはディレクトリツリーではなく、単一のmemgit-store.tar.gzです。203 MBのストアには小さなオブジェクトファイルが10,295個含まれており、同期するたびに同期クライアントに1万個のファイルを照合させると、同期がいつまでも終わらなくなります。バックアップは一時領域に作成し、アトミックに名前を変更するため、新しいコピーが配置されるまで古いコピーが維持されます。中断されたバックアップによって、正常なファイルがあった場所に破損したファイルが残ってはなりません。
memgit backup status # where the last copy went, and what else is available
検証可能なランキング
以前は、直感を頼りに検索品質を調整していました。memgit evalは、ストア自体から抽出した2つの固定データセットを使って、それを測定に置き換えます。
- recall — 実際のプロンプトと、それに対してmemgitが実際に提示したメモリーです。安定性を測定します。変更によって、以前は機能していたものが壊れていないかを確認します。
- synthetic — 各メモリーを、そのメモリー自身の
whyで検索し、結果としてそのメモリー自体が返されることを期待します。クエリからはスラッグに含まれる語を取り除きます。過去のランキングとは独立して、正確性を測定します。(recallデータセットだけでは循環論法になります。回答はテスト対象のランキングから得られているためです。)
どちらも、固定されたベースラインに対してhit@1、recall@3/5/10、MRRを報告します。意図的に単一の合成スコアは設けず、架空の「節約トークン数」も示しません。
その価値はすぐに明らかになります。0.8.0向けに作られた2つの変更は、一見すると明らかに正しいように見えましたが、測定結果は異なりました。新しさによる乗数(実際のプロンプトでのhit@1が−0.020、MRRが−0.018となったため不採用)と、破壊的なステミング(きっかけとなったクエリは改善したものの、全体のhit@1が−0.038となったため、加算型フィールドとして再構築し、その後+0.020/+0.041/+0.019)です。同じリリースで導入されたBM25の正規化バグも、同じ方法で検出されました。
深度の告知、トラッカー、置き換え(v0.6.0)
実際の289セッションで測定したところ、注入された記憶は約59%のセッションに届いていましたが、アクティブ検索を実行したのはわずか**6.8%**でした。注入された上位3件は「記憶を参照した」と受け取られるため、その背後に検索可能なストアがあることをモデルが学習できません。0.6.0では、パッシブ層がアクティブ層の知識を告知するようになりました。
- メモリーインデックス — 再開用ダイジェストの末尾にタグ→件数のペア(`8a8f4ec (6) · instagram (5))と、さらに詳しく調べるための正確な呼び出し方法が表示されます。件数は正確です。置き換えられた記憶は除外され、告知されるトピックはすべて、検索結果が必ず返ることが保証されます。
- 「+N件」の記憶ヒント — プロンプトごとの記憶ブロックの背後に、関連する記憶がさらにある場合は、そのことと、取得するための呼び出し方法が表示されます。
- コンテキストをトリガーとする記憶の呼び出し —
PostToolUseフックです。パスが記憶タグに一致するファイルを読み込むと、memgit: 6 memories tagged 'x' relate to this pathと表示されます。コミット時のタグマップキャッシュのみを読み込み(ストアは読み込みません)、セッションあたり最大3回に制限されます。 - トラッカー(
tr) — 処理中のエンティティごとに1件の記憶(<entity>-status)を用意し、同じスラッグで再保存して更新します。毎セッションの冒頭にステータスボードとして表示されます。エンティティのステータスの正本はmemgitであり、ファイルの情報は古くなっている場合があります。 - 置き換え — 修正内容には「CORRECTED:」という接頭辞ではなく、置き換える対象(
supersedes=[old-slug])を指定します。置き換えられた記憶は検索、記憶の呼び出し、再開用ダイジェストから除外されます(履歴は保持され、listには ⊘ のマーク付きで引き続き表示されます)。そのため、注入されるコンテキストが古くなることはありません。
コマンド
# Core (git-like)
memgit init # initialize store (auto-detects best path)
memgit onboard # bootstrap brief for an existing codebase
memgit add <slug> <rule> # stage a memory (--body detail, --project scope, --global everywhere, --supersedes old-slug)
memgit commit -m "message" # checkpoint current state
memgit log # history
memgit diff [sha1] [sha2] # what changed
memgit show <slug> # display a memory
memgit remove <slug> # remove from active index (history preserved)
memgit status # staged changes
memgit search <query> # BM25 search, scoped to this project + global (--all-projects to widen)
memgit rollback <ref> # restore state to a checkpoint (HEAD~N or SHA)
memgit resume # where we left off — session-start digest
memgit merge <thread> # three-way merge a thread into the current one
memgit remove <slug> # (aliases: delete, rm, del) — mistypes get a "did you mean?"
# Core operating guide — per-project, always-on, cross-host
memgit core seed # draft a guide from this project's skills + rule files
memgit core sync # deliver it into each AI host's own rules file (additive)
memgit core show / edit # view / curate the guide
memgit core heal # self-repair a guide that has drifted
# (a project's FIRST guide is created automatically
# once it holds 5+ memories — no command needed)
# Durability — automatic, no human command required
memgit backup status # last copy, staleness, available destinations
memgit backup now # force one immediately
memgit backup set <path> # pin a destination
memgit backup off / on # control the automatic path
# Retrieval evaluation — prove a ranking change helped
memgit eval mine # freeze a regression set from real recall events
memgit eval mine --synthetic # non-circular set: query each memory by its own `why`
memgit eval run --set recall # hit@1 / recall@3,5,10 / MRR vs the pinned baseline
memgit eval run --baseline # pin the current result as the comparison point
memgit eval run --misses 10 # inspect the cases where nothing relevant surfaced
# Scale & proof
memgit squash # compress old history (archives what it collapses)
memgit gc # reclaim disk: sweep unreachable objects + stale session caches
memgit stats # measured context costs + disk usage
memgit doctor # hygiene + scope losses: split labels, quarantined, stale caches, orphaned usage
memgit doctor --audit # every split and stranded label, the save landing rate, throughput
memgit doctor --audit --json # the same report as JSON
memgit doctor --relabel map.json # bulk re-project memories ({"slug": "Label" | ""}); one checkpoint
memgit doctor --repair-markup # dry run: memories whose fields swallowed other parameters on save
memgit doctor --repair-markup --yes [--project LABEL] # split them back into their fields; one checkpoint
memgit lint # validate all memories (flags unknown provenance)
memgit fsck # verify store integrity
# Import / export
memgit sync # sync from Claude Code files + commit (auto-finds them)
memgit import claude-code [path] # path optional — defaults to ~/.claude/projects/*/memory
memgit import file <path>
memgit export <slug>
# Git sync (team features)
memgit git init [--remote URL]
memgit git push [remote] [branch]
memgit git pull [remote] [branch]
memgit git export
memgit git status
# AI tool registration
memgit setup # interactive step-by-step picker
memgit setup all # auto-register every detected tool
memgit setup claude-code
memgit setup cursor
memgit setup windsurf
memgit setup cline
memgit setup continue
memgit setup gemini-cli
memgit setup hooks # Claude Code hooks: resume at start, per-prompt recall,
# action gate on Bash and file writes, compliance and
# capture guard + auto-sync at stop (--no-recall / --no-guard / --no-gate)
memgit doctor --rules # critical rules next to same-topic lines in CLAUDE.md, AGENTS.md, ...
# Pro (licence key)
memgit pro activate <key> # Polar-issued key; unlocks hosted E2E sync
memgit pro status / deactivate
# Server
memgit serve # MCP stdio (Claude Code, Cursor, Windsurf, Cline)
memgit serve --http # HTTP REST (ChatGPT Custom Actions, Gemini)
# Visualization
memgit graph # D3.js interactive relationship map
memgit thread list / switch / create
AI ツールのサポート
| ツール | プロトコル | コマンド |
|---|---|---|
| Claude Code | MCP stdio | memgit setup claude-code |
| Claude Desktop | MCP stdio | memgit setup claude-desktop |
| Cursor | MCP stdio | memgit setup cursor |
| Windsurf | MCP stdio | memgit setup windsurf |
| Cline / Roo-Code | MCP stdio | memgit setup cline |
| Continue.dev | MCP stdio | memgit setup continue |
| Codex | MCP stdio (TOML) | memgit setup codex |
| Antigravity | MCP stdio | memgit setup antigravity |
| Gemini CLI | MCP stdio | memgit setup gemini-cli |
| ChatGPT (Custom Actions) | HTTP + OpenAPI | memgit serve --http → http://localhost:7474/openapi.json をインポート |
| Gemini API | HTTP 関数呼び出し | memgit serve --http + llm-tool-definitions.json |
| 任意のMCPツール | MCP stdio | {"command": "memgit", "args": ["serve"]} を設定に追加 |
memgit が環境から読み取るもの
memgit はエージェント内で実行されるため、「このプロセスは環境から何を読み取るのか?」という問いには、約束ではなく確認できる形で答えるべきです。以下の表は memgit/env.py から生成されます。また、tests/test_env_inventory.py はテスト実行のたびにパッケージ内を調べ、この一覧にない名前をコードが読み取った場合、または一覧にある名前を何も読み取っていない場合に失敗します。この一覧がコードと食い違うことはありません。
memgit が読み取るのは以下だけで、それ以外は読み取りません。これらに書き込みを行うこともありません。いずれもネットワークアクセスを有効にはしません。クラウドのエンドポイントは、memgit cloud login でオプトイン済みの同期先を上書きするためのものです。ライセンスもクラウドログインもなければ、memgit は何にも接続しません。
| 変数 | memgit による用途 | |
|---|---|---|
| ストアと状態 | MEMGIT_STORE | メモリストアへの絶対パスです。設定されている場合、これだけが候補になります。明示的に指定したストアが、別のストアにひそかにフォールバックすることはありません。 |
MEMGIT_HOME | memgit のユーザーごとの状態を保存する基本ディレクトリです。現在はライセンスファイルが対象です(デフォルトは ~/.memgit、モードは 0600)。 | |
MEMGIT_PROJECT | 作業ディレクトリからの検出に代わり、プロジェクトラベルを指定します。 | |
| 帰属情報 | MEMGIT_AUTHOR | チェックポイントに記録する明示的な作成者です。複数の書き込み元が同じマシンアカウントを共有するジョブで使用します。MEMGIT_CLIENT より優先されます。 |
MEMGIT_CLIENT | このプロセスを起動したホスト(claude-code、cursor、...)です。メモリの出所がわかるように、チェックポイントに記録されます。 | |
USER | MEMGIT_AUTHOR も MEMGIT_CLIENT も設定されていない場合の、作成者名のフォールバックです。 | |
USERNAME | USER の Windows 用フォールバックです。 | |
| ライセンス(memgit Pro) | MEMGIT_LICENSE_KEY | memgit Pro のライセンスキーです。全体が表示されることはありません。memgit pro status には末尾 4 文字が表示されます。 |
MEMGIT_POLAR_API | ライセンス検証 API のベース URL を上書きします(テスト用)。 | |
MEMGIT_POLAR_ORG_ID | ライセンスの照合先となる Polar 組織を上書きします。 | |
| クラウド同期 | MEMGIT_CLOUD_API | memgit クラウド API のベース URL を上書きします。 |
MEMGIT_CLOUD_APP | 表示されるリンクで使用する memgit クラウド Web アプリのベース URL を上書きします。 | |
MEMGIT_CLOUD_NO_CACHE | 1/true/yes に設定すると、復号されたキーを credentials.json に保存しません。その場合、コマンドを実行するたびにパスフレーズの再入力が求められます。 | |
MEMGIT_NO_AUTOSYNC | 1/true/yes に設定すると、このプロセスに限り、保存やセッション開始時にバックグラウンドで memgit クラウドへ同期されなくなります。 | |
| 調整 | MEMGIT_LOCK_TIMEOUT | 書き込み元がストアのロックを待ってから諦めるまでの秒数です(デフォルトは 10)。 |
MEMGIT_IDLE_EVICT_SECONDS | MCP サーバーが接続を維持したままインメモリキャッシュを破棄するまでのアイドル秒数です(デフォルトは 900)。 | |
MEMGIT_HOUSEKEEPING_INTERVAL | MCP サーバーがハウスキーピング処理を実行する間隔(秒)です。 | |
| 他のソフトウェアが設定 | CLAUDE_PROJECT_DIR | Claude Code がフックプロセス用に設定します。作業ディレクトリがプロジェクトのルートでない場合に、プロジェクト検出の入力の一つとして使用されます。 |
PYTEST_CURRENT_TEST | pytest が設定します。この変数が存在すると自動バックアップが抑止されるため、テスト実行によって実際のバックアップ先に書き込まれることはありません。 |
プロジェクトラベルの決定方法
メモリはプロジェクトごとに管理されるため、ラベルが間違っていると、二度と見つけられない場所にメモリが保存されます。ラベルは、次のうち最初に値が得られたものから決まります。また、MCP サーバー、CLI、フックで共通の検出経路を使用するため、保存時に導出したラベルと呼び出し時に導出したラベルが食い違うことはありません。
MEMGIT_PROJECT— 強制ラベル。値はそのまま使用されます- ホストがフックのペイロードで報告する
cwd(プロセスの作業ディレクトリが別の場所でも、実際のワークスペースを示します) CLAUDE_PROJECT_DIR- プロセスの作業ディレクトリ
ラベルでは [A-Za-z0-9-] を保持し、それ以外の文字はすべてダッシュに置き換えます。これは Claude Code が projects/ ディレクトリ名に使用する方法と同じで、_ もダッシュに変換されます。v0.12.0 より前に書き込まれたラベルでは _ が保持されていましたが、2 つのラベルを比較するときにダッシュ形式へと統合されます。そのため、以前の形式で書き込まれた内容も引き続き見つかり、保存済みのデータが書き換えられることもありません。
メモリが2 つのラベルに分散しているプロジェクトでも、どこにもエラーは発生しません。保存は成功し、fsck の結果も問題ありませんが、必要な情報が欠けた回答になるという症状だけが現れます。memgit doctor はデフォルトで、分散、孤立したラベル、保存先の正解率を報告します。memgit doctor --audit を実行すると、すべての行が表示されます。修復では、メモリの数が多い方ではなく、ディレクトリが存在する方のラベルに統合されます。
どの方法でもラベルを取得できない場合(たとえば $HOME から実行した場合)、書き込みはグローバルに保存されず、_unknown に隔離されます。memgit doctor --relabel を実行すると、保存先を指定して移動できます。自由入力のラベルを既存のプロジェクトに統合する処理(log-report → Downloads-log-report)は、入力が既知のラベルの末尾部分と完全に一致し、かつそのラベルにすでにメモリが保存されている場合にのみ行われます。曖昧な場合は変更せず、統合はすべて報告され、黙って実行されることはありません。
TOON 形式 — コンパクトで読みやすく、差分を確認しやすい
標準的な Markdown メモリファイル:
## Rule: Never mock the database in tests
**Type:** feedback
**Priority:** medium
**Why:** We got burned last quarter — mocked tests passed but the prod migration failed.
**When to apply:** Any time writing tests that touch persistence layers.
**Tags:** testing, database
同じメモリの TOON 形式:
TOON1|fb|no-db-mock|2026-07-01T10:00Z
#testing #database
PROJ:my-app
RULE:Never mock the database in tests
WHY:Mocked tests passed but prod migration failed last quarter
WHEN:Any persistence test
BODY:Full long-form detail lives here, losslessly (newlines escaped).\nSearch returns the compact RULE; get_memory returns everything.
実際のトークナイザーで測定すると、TOON は同等の Markdown より約 5~10%効率的です。これはうれしい利点ですが、主なポイントではありません。主な節約効果は検索にあります。memgit はすべてのメモリを読み込むのではなく、クエリごとに関連性の高い上位 8 件のメモリを読み込みます。
108 件のメモリの場合:12,840 トークン(すべてをダンプ)→ 640 トークン(memgit BM25 上位 8 件)
memgit stats で正確なトークン数を表示するには、オプションのトークナイザーをインストールしてください:pip install "memgit[tokens]"。
アーキテクチャ
~/.claude/memgit-store/
.memgit/
objects/ ← SHA-256 content-addressed blobs (gzip compressed)
refs/threads/main ← HEAD checkpoint SHA
TOON_INDEX ← active slug→sha mapping
config ← author, default thread
logs/ ← ref change audit trail
memories/ ← flat .toon files (git-trackable, human-readable)
.git/ ← standard git repo (after `memgit git init`)
コントリビューション
git clone https://github.com/code4161/memgit.git
cd memgit
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # 431 tests, all passing, < 5 seconds
CONTRIBUTING.md を参照してください。
ロードマップ
- コンテンツアドレス方式のオブジェクトストア(Gitと同一のアーキテクチャ)
- TOON 形式(コンパクトな行指向メモリ形式)
- MCP サーバー — Claude Code、Cursor、Windsurf、Cline、Continue.dev
- HTTP サーバー — ChatGPT Custom Actions、Gemini function calling
- BM25 関連性検索(重要な情報だけを読み込みます)
-
memgit stats— トークン節約効果を測定して実証 -
memgit squash— 10k 以上のセッションに対応 -
memgit git push/pull— 標準の Git によるチーム同期 - フラットな
memories/ディレクトリ — メモリを grep/diff/blame で確認 - メモリ間の関係を D3.js でグラフ表示
-
memgit resume+ SessionStart フック — セッション開始時に「前回の続き」を表示 - ガードレールフック — プロンプトごとの自動想起 + セッション終了時の保存ガード(v0.4.0)
- コア運用ガイド — プロジェクトごと、常時有効、ホストをまたいで利用可能、自己改善型(v0.5.0)
-
memgit gc— 容量の再利用(マークアンドスイープ、損失のない squash アーカイブ) - マルチエージェントの書き込み安全性 — ストアロック、自動マージコミット、
memgit merge - PyPI + Homebrew(tap)+ npm で公開(v0.1.5)
- Chocolatey — community.chocolatey.org で公開中(
choco install memgit) - 対話型セットアップウィザード(
memgit setup) - スマートな
memgit init(ツールを自動検出し、パスの指定は不要) - 情報を損なわないメモリ — コンパクトなルールに加えて完全な
bodyを保持(v0.3.0) - プロジェクト単位のメモリ + プロジェクト途中からのセットアップに対応する
memgit onboard(v0.3.0) - VS Code 拡張機能(v0.1.5、Marketplace: code416-memgit.memgit)
- Codex + Antigravity に対応 — MCP 登録 +
AGENTS.mdコアガイド(v0.8.0) -
memgit eval— 実データと非循環データセットによる検索品質の測定(v0.8.0) - 使用状況を考慮したランキング — 想起履歴をガイドだけでなく関連性の判定にも活用(v0.8.0)
- コアガイドの自動セットアップ — 自己改善ループを自動で開始(v0.8.0)
- マシン外への自動バックアップ — ユーザーによるコマンド実行は不要(v0.9.0)
- JetBrains プラグイン(フェーズ 3)
- 埋め込みによるセマンティック検索 —
memgit evalで実際の改善が確認された場合に実施(フェーズ 4) - 公開ベンチマークの数値(LongMemEval、LoCoMo)(フェーズ 4)
- memgit.dev ウェブサイト(公開中)
- メモリ圧縮/自動要約(フェーズ 5)
- チームのアクセス制御 + 監査証跡(フェーズ 5)
- メモリマーケットプレイス — 再利用可能なコンテキストパックを共有(フェーズ 6)
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。