HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Show HN: Recall – Claude Codeのための完全ローカルなプロジェクト記憶機能

Show HN: Recall – fully-local project memory for Claude Code (github.com)

99 pointsby mateenah66 コメント

要約

Recallは、Claude Codeのセッションごとにプロジェクトの記憶をローカルに保持し、要約を生成するツールです。APIキーや外部モデルなしで完全にオフラインで動作し、各セッションでのプロジェクトの再説明が不要になるため、Claude Codeの「コールドスタート」問題を解決します。プライバシーを重視し、機密データが外部に送信されることなく、TF-IDFとTextRankによる抽出要約でコスト効率良く記憶を管理します。

全文翻訳

🔁 Recall — Claude Codeのための完全ローカルなプロジェクト記憶機能 Claude Codeはすべてのセッションを「コールドスタート」で開始します。Recallはセッションのローカルログを保持し、すぐに再開できる要約に凝縮します。これはすべてあなたのマシン上で行われます。APIキーも、外部モデルも、何もどこにも送信されません。これはサブスクリプションでClaude Codeをローカルで実行しているユーザー向けに構築されており、ループ内のAIはClaude Code自体のみです。要約は古典的なPythonサマライザーによって行われます。 Recallを選ぶ理由 サブスクリプションで無料です。これはコールドスタート問題を解決します。測定されるサマライザーで費用を増やすことなく、各セッションでプロジェクトを再説明する必要がなくなります。要約はローカルアルゴリズムであり、LLMコールではないため、すでに支払っているサブスクリプション以外に追加の費用はかかりません。 利用クレジットを節約します。2つの方法があります。(1)要約はローカルで構築されるため、記憶の取得と更新にモデルトークンは一切消費されません。(2)各セッションでプロジェクトをゼロから再説明する代わりに、コンパクトなcontext.md(約1〜2Kトークン)から再開することで、セッションあたりのトークン消費が大幅に削減され、サブスクリプションの利用制限を最大限に活用できます(APIの場合、請求されるクレジットが削減されます)。 何もあなたのマシンから離れません。あなたのトランスクリプト(コード、パス、時には秘密情報)は、いかなるAPIにも送信されません。ほとんどの「記憶」ツールはコンテキストをモデルエンドポイントにパイプしますが、Recallはそれができないプライバシー保証を提供します。 摩擦ゼロです。`pip install`も不要、ローカルモデルを実行する必要もなし、キーの設定も不要、オフラインで動作します。プラグインがロードされた瞬間に機能し始めます。 あなたのプロジェクトの`.recall/`の下に2つのファイルが書き込まれます。 `history.md` — ログです。追記専用です。各セッションは、発生した内容(あなたのプロンプト、Claudeの返信、変更されたファイル、実行されたコマンド)がここに記録されます。 `context.md` — 要約です。ローカルサマライザーによって上書きされます。次のセッションに読み込む「現在の状況」を凝縮したものです。目標、要約、次のステップ/未解決の課題、変更されたファイル、どこで中断したかなどが含まれます。 「Claude Codeにはすでに記憶機能がないのか?」 あります。そしてRecallはそれを補完するものであり、代替するものではありません。組み込みのオプションは異なる問題を解決します。 `CLAUDE.md`(および`#`ショートカット)は手書きの記憶です。Claudeが従うべき指示として読み込まれる、あなたがキュレーションするルールとメモです。「どのように作業してほしいか」には最適ですが、手作業での維持管理が必要であり、セッションで実際に何が起こったかは記録されません。 `--continue` / `--resume`は以前の会話を再生します。完全な忠実度ですが、トランスクリプト全体を再ロードするためトークンが重く、特定の1台のマシンのローカルセッション履歴に結びついており、持ち運び可能で読みやすいダイジェストではありません。 コンテキストの圧縮はセッション内の会話を凝縮しますが、数日後に再度開くような永続的な記録ではありません。 Recallはこれらすべてのギャップを埋めます。各セッションが何をしたかの自動的かつ決定論的な記録を、コンパクトな再開ポイントに凝縮します。 CLAUDE.md / # --continue / --resume Recall それが何であるか 手書きのメモとルール 以前の会話を再ロード 自動キャプチャされたセッションログ + ローカル要約 維持管理 手動 なし(セッションを選択する) なし — 作業中に書き込まれる 保持するもの 従うべき指示 以前のトランスクリプト全体 目標、ファイル、コマンド、中断した場所、次のステップ 再開コスト 小さい 大きい(完全なトランスクリプトを再生) 約1〜2Kトークン(コンパクトなダイジェスト) 形式 編集可能なMarkdown ローカルセッション状態 `.recall/`内のプレーンテキスト — 差分可能で共有可能 Claudeがそれをどのように扱うか 指示として 会話として 信頼できない参照データとして隔離 要するに、`CLAUDE.md`は「こう作業してほしい」というものであり、Recallは「前回何をして、どこで止めたか」をオフラインで生成し、モデルトークンを消費せずに提供します。 仕組み 瞬間 何が起こるか セッション中 `Stop` / `SessionEnd`フックが新しいアクティビティを`.recall/history.md`に追記します。キャプチャは増分(新しいターンのみ)で完全にローカルです。 セッション開始時 `SessionStart`フックが`context.md`を表示し、Claudeに2つのことを尋ねます。保存されたコンテキストから再開するか?このセッションをログに記録し続けるか? 終了する前 `/recall:save`を実行します。ローカルサマライザーが`history.md`を読み込み、`context.md`を(上書き)します。 …または自動的に `auto_save_context: "on_end"`を設定すると、セッションが終了するたびに`context.md`が再生成されます — `/recall:save`は不要です。 LLMコールはどこにもありません。要約はローカルで実行されるTF-IDF + TextRank(抽出要約)によって生成されます。サマライザーの`scripts/summarizer.py`は、セッションの中心となる文をランク付けします。 TF-IDF文ベクトル 文間のコサイン類似度グラフ そのグラフに対するTextRank — PageRankのべき乗反復 — を用いて文にスコアを付け、 上位N個を元の順序で保持します。 `context.md`はその要約を、トランスクリプトとGitから直接取得した決定論的な事実で包みます。これには、目標(最初の要求)、変更されたファイル、実行されたコマンド、中断した場所、`git diff --stat`が含まれます。 インストールは不要です。TF-IDF + TextRankの実装全体は`summarizer.py`にベンダーリングされています。`numpy`がインポート可能であれば、計算のベクトル化に利用され(大規模セッションで高速化)、そうでなければ、同一の純粋Python版TextRankが代わりに実行されます。同じアルゴリズムで同じ結果が得られます — `numpy`はオプションのアクセラレーターであり、必須ではありません。保存出力は、どのパスが実行されたかを示します。 コマンド `/recall:save` — ローカルサマライザーを実行し、`context.md`を(上書き)します。 `/recall:show` — `context.md`を表示します。 `/recall:log` — `history.md`をリアルタイムで表示します(tail)。 設定 — `recall.config.json` デフォルトを上書きするために、これをプロジェクトのルートに配置します。 キー デフォルト 目的 `output_dir` ".recall" `history.md` / `context.md`が置かれる場所。 `capture_history` true セッションアクティビティを`history.md`に追記するかどうか。 `auto_save_context` "off" セッション終了時に`context.md`を再生成するかどうか:"off"または"on_end"。 `summary_sentences` 8 要約が保持する文の数。 `redact` true `md`ファイルを書き込む前に明白な秘密情報を削除するかどうか。 `include_git` true `git diff --stat`と最近のコミットを`context.md`に追加するかどうか。 `max_input_chars` 200000 サマライザーに供給されるテキストの最大文字数(古いものから削除)。 設定を編集せずにプロジェクトのログ記録を一時停止するには、`.recall/.capture-paused`を作成します。再開するにはこれを削除します。 プライバシーとセキュリティ Recallはネットワークコールを行わず、APIキーを使用せず、サードパーティモデルをロードしません。サマライザーはローカルPythonであり、フックは標準ライブラリのみです(`numpy`はオプションのアクセラレーター)。セッションのトランスクリプトを読み込み、`output_dir`の下にのみ書き込みます。具体的には: 認証情報は一切ありません。プラグインはAPIキー、認証、`ANTHROPIC_*`、またはHTTPへの参照を一切持ちません。もしClaude自体が「Invalid API key」と表示する場合、それはCLI自身の認証です — 通常は、サブスクリプションログインを隠している古い`ANTHROPIC_API_KEY`環境変数です。`unset ANTHROPIC_API_KEY`(または`env -u ANTHROPIC_API_KEY claude …`を実行)してください。Recallとは関係ありません。 編集(Redaction)。`context.md` / `history.md`がコミットされる可能性があるため、書き込み前に一般的な秘密情報の形式(APIキー、トークン、`.env`割り当て、PEMキー)を削除する最善の努力が行われます。これは最善の努力であり、保証ではありません — コミットする前にレビューしてください。 強化されたGit。`git diff/log`は、`core.fsmonitor`、`diff.external`、`hooks`、およびページャーを無効にして実行されるため、信頼できないクローンされたリポジトリがRecallが真実データを読み取るときに独自のGit設定を使用してコードを実行することはありません。Gitを完全にスキップするには、`include_git: false`を設定します。 書き込みの制限。`output_dir`はプロジェクト内に留まるように強制されます。プロジェクトに同梱された設定は、絶対パスや`../...`への書き込みをリダイレクトすることはできません。 スコープされたトランスクリプト。Recallは現在のプロジェクトのトランスクリプトのみを読み込みます(現在の作業ディレクトリによって一致)。他のプロジェクトのセッションにフォールバックすることはありません。 共有メモリの信頼境界。`context.md`はセッション開始時にモデルに注入されます。もし`.recall/`を共有チームメモリとしてコミットする場合、他の共有入力と同様に扱ってください。チームメイト(またはリポジトリの書き込みアクセス権を持つ悪意のあるアクター)が、プロンプトインジェクションを試みるために`context.md`を細工する可能性があります。`SessionStart`はコンテンツを隔離し、信頼できないデータとしてラベル付けし、Claudeはそれに依存する前に尋ねます — しかし、リポジトリに書き込みできる人を完全に信頼できない場合は、`.recall/`を`.gitignore`で無視し続けてください(デフォルトは無視です)。 `.recall/`のコミット どちらも問題ありません。共有チームメモリのためにコミットするか、個人メモリのために`.gitignore`で無視してください(`.gitignore`はデフォルトで無視するように設定されています — コメントを解除すればコミットできます)。 インストール マーケットプレイスから(このリポジトリ自体がマーケットプレイスです): `/plugin marketplace add raiyanyahya/recall` `/plugin install recall@rec`