プログラミング
Show HN: コーディングエージェント向けCapn-hook – 同じ謎を二度grepしない
Show HN: Capn-hook for coding agents – don't grep the same mystery twice (github.com)
要約
Capn-hookは、コーディングエージェントのために永続的なメモリを提供するツールです。エージェントがコードベース内の特定のファイルを見つけるのに費やした時間を節約し、次回セッションでワンコマンドでアクセスできるようにします。さらに、基盤となるファイルが変更されると、保存された回答は自動的に削除されるため、常に最新の情報が提供されます。これにより、トークン使用量が77%削減され、開発効率が向上することが実証されています。
全文翻訳
🧢🪝 cap'n hook 同じ謎を二度grepしない。コーディングエージェントのための永続的なメモリ。エージェントがコードベース内のどこに何かがあるかを見つけるのに10分費やすと、capnはその質問に答えるファイルを保存します。次のセッションでは、再探索する代わりに1つのコマンドでそれらを取り戻すことができます — そして、基盤となるファイルが変更された瞬間、保存された回答は自己削除されます。
繰り返し質問に対するトークン使用量が77%削減
5つの本番コードベース(Dub、Polar、PostHog、Twenty、Documenso)での60件の実際の開発者からの質問において、capnから記憶しているエージェントは、コールド状態のエージェントよりも77%少ないトークンを使用しました — 両方の腕で全ての回答が正しく、60件の質問全てで正しいチャートが記憶され、チャートセッションは約1.6回の記憶で元が取れます。評価の実行方法、完全な数値、および生の証拠 → · capnは誰向けか → · ユースケース →
問題
コーディングエージェントはセッション間で全てを忘れます。「支払いウェブフックはどこで処理されますか?」から「src/api/webhooks.ts、src/billing/handlers/」へのルートは、実際の時間とトークンを消費します — そしてセッションが終わると消滅します。明日のセッションは同じ発見のために再び支払いをします。
仕組み
capn initは、Claude CodeとCodexのためのセッション開始フックをインストールします。新しいセッションごとに、エージェントは短いメモを見ます:コードベースを検索する前に、capnに尋ねる。苦労して見つけた発見の後、それを保存する。そのメモ(capnコンテキスト)が統合の全てです — ラッパーなし、ミドルウェアなし、強制的な動作なし。モデルはそれを読み、決定します。そこからループは3つの動きです:
1. 検索前に尋ねる。
capn ask "支払いウェブフックはどこで処理されますか?"
ヒットすると、質問に答える正確なファイルを含むJSONLが返され、検索全体がスキップされます。ミスの場合、標準エラー出力に探索して見つけたものをチャート化するよう促すメッセージが表示されます — ミスは数秒で済みますが、再探索は数分かかります。
2. 学習にコストがかかったものを保存する。
エージェントが苦労して答えを見つけ出したとき、それは小さな、回答可能な質問とそれを答えるファイル、そして追加情報(行番号や注意点など)のためのオプションの詳細を記録します:
capn chart "支払いウェブフックはどこで処理されますか?" \ --files src/api/webhooks.ts,src/billing/handlers/stripe.ts \ --details "ルーターは行40付近で開始します。Stripeハンドラーが署名チェックを所有しています。"
各バックファイルは保存時にフィンガープリント(sha256)が付けられます。良いチャートは、巨大なコンテキストダンプではなく、アトミックなものです。分離可能な事実は別々のチャートに分割しますが、単一の焦点を絞った質問に共同で答える場合は複数のファイルを含めます。
3. 古い回答は自己削除される。
基盤となるファイルが変更または消失した場合、そのエントリは再度回答される前に削除されます。保存された回答は編集されません — 回答はまだ真実である(ファイルが変更されていない)か、価値がないかのどちらかです。だからコマンドがchartとunchartであり、addとupdateではないのです:capnはあなたのコードベースを海岸線のように扱います。エージェントは探索したものをチャート化します。海岸線が移動すると、古いチャートは捨てられ、エージェントは次の遭遇時に再チャート化します。最悪の場合、エントリが削除され、エージェントが再探索しますが、それはcapnなしでも行うことと同じです。
インストール
npm install -g capn-hook
# または bun install -g capn-hook
cd /path/to/your/project
capn init
# .capn/、capnのQMDインデックス、Claude Codeフック、およびCodexフック
capn init --git
# post-commitフックもインストールしてプルーニングします
公開されているCLIはJavaScriptとして出荷され、Bunが利用可能な場合はBunで実行され、Node.jsにフォールバックします。委任を優先しますか?コーディングエージェントにINSTALL.mdを取得してフォローするように指示してください — これはあなたが手でコピーするためではなく、エージェントが実行するために書かれています。
エージェント ファイル フック コマンド 効果
Claude Code .claude/settings.json SessionStart /usr/bin/env capn context ask-first charting契約を注入
Codex .codex/hooks.json SessionStart /usr/bin/env capn context ask-first charting契約を注入
RecallはQMD上で実行されます:デフォルトでセマンティック(ハイブリッド)検索、capn init --no-embeddingでプレーンキーワード(BM25)検索。デフォルトパスは初回使用時に埋め込みモデルをダウンロードします(約300MB upfront、完全なハイブリッドパイプラインで最大約2GB)。コールドなcapn askは、それらが存在する場合、数秒かかることがあります。BM25パスは何もダウンロードせず、完全に決定論的です。
すでにqmdを使用していますか?capnのインデックスは.capn/下の独自のsqliteであり、あなたのコレクションはそれを見ることはなく、それもあなたのものを見ることはありません。
コマンド
コマンド 説明
capn init [--git] [--embedding|--no-embedding] .capn/、capnのQMDインデックス、フック、および.capn/ gitignore行を設定します
capn context セッション開始フックで使用されるask-first charting契約を出力します
capn ask "<質問>" 古いエントリをプルーニングした後に、関連するチャート化された回答のJSONLを出力します
capn chart "<質問>" --files <a,b> [--details "<追加コンテキスト>"] 各バックファイルをハッシュして発見を記録します
capn unchart <id> 1つのチャートエントリを手動で削除します
capn bust <path> 1つのファイルでバックアップされた全てのチャートエントリを削除します
capn prune ファイルが変更または消失した全てのチャートエントリを削除します
capn list チャート化されたエントリを人間が読める形式で表示します
チャート .capn/entries/<id>.md — 質問ごとに1つのローカルマークダウンファイル。エントリは人間が読み取れるプレーンテキストであり、チャートはツールだけでなく人間も閲覧できます。
capn initは.capn/をgitignoreするため、このメモリはワーキングコピーにローカルに留まります。
---
capn: 1
id: 9f3a1c2e
at: 2026-07-03T18:00:00.000Z
files:
src/api/webhooks.ts: 2f4c0b9c3e0a0c7b5d5d7f8f0a6e2d1c4b8a6f1e2d3c4b5a6978877665544332
---
# 支払いウェブフックはどこで処理されますか?
ルーターは行40付近で開始します。Stripeハンドラーが署名チェックを所有しています。
.capn/map.json — ファイルパスから現在のハッシュとエントリIDへの派生逆インデックス。欠落または破損している場合、capnはエントリのフロントマターから再構築します。
{
"src/api/webhooks.ts": {
"hash": "2f4c0b9c3e0a0c7b5d5d7f8f0a6e2d1c4b8a6f1e2d3c4b5a6978877665544332",
"entries": ["9f3a1c2e"]
}
}
.capn/config.json はローカルプロジェクトオプションを格納します(例:「embedding": true)。
.capn/qmd/index.sqlite はQMD SDKによって生成され、通常のsqlite -wal/-shm兄弟が隣接しています。`.capn/entries/`下のマークダウンは永続的な真実の情報源であり、capn initはインデックスを再構築できます。`.capn/`ディレクトリ全体はローカルエージェントメモリであり、capn initによってgitignoredされます。
チャートエントリはコードベースに関するエピソード的なメモリです:ローカルで、使い捨て可能で、再探索によって安全に再構築できます。
設計原則
チャートまたはアンチャート、決して更新しない。陳腐さはコンテンツハッシュによって決定され、判断によるものではありません。回答は決して陳腐ではありません。capn askは、何かを返す前に無効なエントリを削除します。
チャートは使い捨てです。任意のエントリはいつでも削除できます。最悪の場合、エージェントが再探索しますが、それは現状と同じです。
エージェントに依存しないコア。CLIとチャートフォーマットはClaude Codeについて何も知りません。フックは薄いアダプターです。他のエージェントは同じCLIを呼び出すことで統合されます。
ローカルファーストの記憶。QMDは、ホストのqmdインストールから分離された`.capn/qmd/index.sqlite`に対して、SDKを介してインプロセスで実行されます。デーモンもサーバーもありません — 実行し続けるものはありません。
ライセンス MIT