QMD

VS Code の Chronicle 機能が結構便利だった

TL;DR — Chronicle は Copilot Chat のチャット履歴をローカルで記録・分析する実験的機能。/chronicle:standup でその日の作業サマリー、/chronicle:tips で自分の使い方フィードバックが出せる。これがなかなか良い。Claude にはこういう公式機能はないけど、自宅では QMD で履歴検索は実現してる。

職場で VS Code を使っていて、ふと試してみた機能の話。

Chronicle とは

VS Code v1.118 で実験的に追加された GitHub Copilot Chat の機能。Copilot とのやり取り、編集したファイル、参照した PR や Issue あたりをローカルの SQLite データベースに記録しておいて、あとから振り返ったり分析したりできる。

で、早速使ってみた。

有効化は github.copilot.chat.localIndex.enabledtrue にするだけ。

GUI の設定じゃないのはまだプレビュー段階だからかな。

使えるコマンドは主に 3 つ。

/chronicle:standup 過去 24 時間の作業内容をまとめてくれる。「このブランチでこのファイル触って、この PR を参照した」みたいな感じで出てくる。朝会の準備が秒で終わるらしい(使ったことはない)。

/chronicle:tips 7 日間の使い方を分析して、「お前こういうプロンプトの書き方してるけど、こうしたほうが良くね?」みたいなフィードバックをくれる。自分の癖を指摘してもらえるのがおもしろいし、フィードバックがまあまあためになる。これはよき。

/chronicle [query] 自然言語で過去の履歴を検索できる。「先週やってたあれ、なんだっけ」が出てくる。

試してよかったのは tips

「同じような質問を繰り返してる」とか「毎回コンテキストを初めから説明してる」みたいな自分のパターンを指摘してくれる。ほう、わかってんじゃねーかこいつ…

Copilot との対話の仕方に改善余地があると気づかせてくれるのが嬉しい。

やるじゃん。

Claude だと?

で、家で使ってる Claude Code でこういう機能があるかというと、公式にはない。 そこんとこどうなんよ?と Claude さんに聞いてみた結果が以下。

QMD の MCP サーバーをやめて Bash で直接叩くようにした

TL;DR — QMD の MCP サーバーが重すぎたので、プラグインを削除して qmd query --no-rerank を Bash で直接呼ぶ運用に切り替えた。リランカーなしでも BM25 + ベクトル検索の組み合わせで十分実用的。

以前の記事で QMD を MCP サーバーとして導入した話を書いた。

その後、重さが気になり過ぎて運用を見直した話。

いや、本気で重かったのよ。全然結果が返ってこない。

なにこれとか思って調べたら GPU なしだとこんなもんだろうとのこと。

そうですかぁ…

今の運用

ということでどうしたかというと、Claude さんが過去セッションを検索するときは、MCP ツールではなく Bash コマンドを直接叩くようになった。

qmd query --no-rerank "調べたいキーワード"

CLAUDE.md に「QMD は qmd query --no-rerank で使う」と書いてあるので、Claude さんが自動でこの形式で呼ぶ。settings.jsonpermissions.allow には Bash(qmd *) を追加済み。

なぜ重かったか

以下 Claude さんの解説。

QMD は内部で 2 つのローカル ML モデルを動かしている。

モデルサイズ用途
embeddinggemma-300M-Q8_0.gguf314 MBベクトル埋め込み生成
Qwen3-Reranker-0.6B-Q8_0.gguf610 MB検索結果のリランキング

自分の環境は専用 GPU がなく CPU 推論になるので、2 モデル合計で 924 MB がオンメモリに乗る。MCP サーバーとして常駐させていると、起動のたびにこれをロードして複数プロセスを spawn する。qmd query(MCP が使う推奨コマンド)はさらにリランキングまで走らせるので、検索 1 回に数分かかることもあった。

npm グローバル管理から mise に移行したら npm キャッシュにハマった話

TL;DR — mise の npm バックエンドで @latest が存在しないバージョンに解決される場合、mise cache clear で mise の versions host キャッシュを消すと直る。

npm でグローバル管理していたツールを mise に移行しようとしたら、キャッシュ問題でちょっとハマったので記録しておく。

移行対象

$ npm list -g --depth=0
├── @playwright/cli@0.1.1   ← 新しいやつ(旧: playwright-cli)
├── @tobilu/qmd@2.1.0
├── @playwright/mcp@0.0.68
└── npm@11.11.0

今回 mise に移行したのは @playwright/cli@tobilu/qmd の2つ。

@playwright/cli の移行でハマった

まず Deprecated なパッケージを入れてしまう

まず playwright-cli(旧・Deprecated)と @playwright/cli(新)を間違えて Deprecated の方を mise に入れてしまった。mise unuse で無効化してから改めてやり直し。

そしたら謎のエラーが出た。

$ mise use --global npm:@playwright/cli@latest
npm error code ETARGET
npm error notarget No matching version found for @playwright/cli@0.262.0.

@latest を指定しているのに 0.262.0 という存在しないバージョンを引いてくる。なにそれ。

Claude Code のセッション履歴をベクトル検索できる QMD を入れた

TL;DR — QMD は BM25 + ベクトル検索でローカル Markdown を横断検索できる MCP ツール。Stop hook で Claude Code セッション終了時に自動インデックス化することで、複数リポジトリのセッション履歴を横断検索できる。

nanoclaw(Claude Code の fork)をアップデートしているとき、内部で QMD が使われているのを見かけた。調べてみたら「お、これ良さそう」となったので入れた。

QMD とは

QMD は、ローカルの Markdown ファイルを対象に検索エンジンを立てる CLI ツール兼 MCP サーバー。単純な grep と違うのは、BM25(キーワード検索)とベクトル検索を組み合わせて意味的に近いドキュメントを引けること。検索用の埋め込みモデルもローカルで動く(GPU がなくても動作する、が後ほど書くけど CPU だとクソ重い処理が一回だけある)。

インストール

本体は以下のように、npm でインストール。

npm install -g @tobilu/qmd

Claude Code はプラグインとして追加する。

claude plugin marketplace add tobi/qmd
claude plugin install qmd@qmd

今回やりたかったことと設定

自分は複数のリポジトリで Claude Code を使っていて、技術的な会話もリポジトリをまたいでいる。そこで、QMD のコレクションに全リポジトリのセッション Markdown を入れておけば、「あのリポジトリでやった話、なんだったっけ」を後から引ける。

同じようなことを実現できるものとして、claude-mem がある。

そもそもこれ入れればいいじゃんって話もあるけど、なんか分からんけど直感で QMD いいかもって思ってしまったので仕方ない。直感で突き進みます。

まずは、Claude のセッションをマークダウンに変換するスクリプト convert-sessions.js を用意して、~/.claude/hooks 配下に配置。