BlitzGrep「この実装、どこから来た?」を探すための VS Code 拡張機能。
インストールVS Code の拡張機能ビューで「BlitzGrep」を検索するか、
まずこれ:
|
| 対象 | 答える問い | 使うもの |
|---|---|---|
| いま (ワーキングツリー) | どこで使ってる | ripgrep (VS Code 同梱版を自動検出) |
| ブランチ横断 | 誰かのブランチにだけ在る? | git grep <ref> を並列実行 |
| 履歴 | いつ入った / そのとき一緒に何が入った | git log -S / -G (pickaxe) |
| 会話ログ | なぜ入った / 誰が言い出した | ~/.claude/projects/**/*.jsonl |
3 つ目と 4 つ目が本題です。1 つ目は VS Code の標準検索で足りるので、比較用に置いてあるだけです。
なぜ 4 つ必要か
- 履歴 (pickaxe) は HEAD から到達できる範囲しか見ません。マージされていないブランチは映らない。
- ブランチ横断は現存する ref しか見ません。squash merge 後に削除されたブランチは映らない。
- 会話ログにしか無いものがあります。あなたが会話の途中で一言添えた仕様、Claude が提案して あなたが「それでいい」と答えた仕様は、どのコミットにもファイルにも存在しません。
他の拡張機能との違い
GitLens と競合しません。答える問いが違います。
| 問い | VS Code 標準検索 | GitLens | BlitzGrep |
|---|---|---|---|
| いまどこにある | ✅ | — | ✅ |
| 他のブランチに在る? | ❌ 開いているツリーのみ | ❌ 検索ではなく閲覧 | ✅ 全 ref を git grep で横断 |
| いつ入った(消えた行も) | ❌ | △ コミット検索はあるが行単位の追跡ではない | ✅ git log -S を差分まで解析 |
| 誰が最後に触った | ❌ | ✅ blame が本領 | ✅ 出所追跡の 1 段目として |
| なぜそうなった | ❌ | ❌ | ✅ Claude Code の会話ログ |
| 上の全部を1 回で | ❌ | ❌ | ✅ Ctrl+Alt+O |
要点は 2 つです。
- 「なぜ」の在り処が違う。 GitLens が読むのは git が知っていること(誰が・いつ・何を)だけです。 AI エージェントと作ったコードの「なぜ」は、コミットメッセージではなく会話に残ります。 BlitzGrep はそこを検索対象に含めます。git の外にあるこの情報源を扱うのが、他と決定的に違う点です。
- 問いを分けずに投げられる。 「blame を見て、次にログを検索して、次に会話を漁る」を 人間が順にやる代わりに、1 つの語を 4 つの出所へ同時に投げて 1 つの時系列に並べます。 どの段が何件返したかはサイドバーのパイプライン表示で見えます。
GitLens を入れたまま併用してください。行の blame を常時眺めるのは GitLens、
「この仕様どこから来た?」で詰まったときだけ Ctrl+Alt+O が BlitzGrep、という住み分けです。
やらないこと
- 行末の blame 注釈、ホバー、ファイル履歴ビュー、コミットグラフ — GitLens の領域です。
- git 操作(commit / push / stage)— 一切しません。読むだけです。
- ChatGPT など他の AI ツールの履歴 — いまは Claude Code の transcript 形式のみ対応です。
使い方
- アクティビティバーの虫めがねアイコン、または
Ctrl+Alt+F。 - 「対象」を切り替えて検索語を入力。
- ワーキングツリーと会話ログは入力しながら検索、ブランチ横断と履歴は
Enterで実行します(重いため)。
対象を選ぶと、それが何をするのかが 1 行で出ます。空振りしたときは、その対象で次に試せることを一覧に出します。
パイプライン表示
複数段を走る検索(出所を追う / ブランチ横断)は、進行が段ごとに見えます。
● 📍 最後に触ったコミット 1 件
│
◐ ◆ いつ入った (git log -S) 4 件
│ "traceOrigin" で再検索中
○ 💬 なぜ入った (会話ログ)
走る前に全段が並ぶので「あと何が残っているか」が分かります。走らなかった段は理由つきで残り
(まだコミットされていません / エディタの行が起点にないため など)、空振り時の自動再検索は
注記に出ます。ブランチ横断では 7/20 ブランチ と進捗バーが出ます。
履歴検索
コミット単位でまとまって表示されます。+ が追加された行、- が削除された行。
同じコミットの下に並ぶ他のヒットが「そのとき一緒に入ったもの」です。
結果をクリックすると、追加行はそのコミットの版、削除行はその親の版(消える直前の状態)が開きます。
会話ログ検索
検索できるブロックを選べます。
| ブロック | 中身 | 既定 |
|---|---|---|
| 発言 | あなたのプロンプトと Claude の応答本文 | オン |
| 思考 | Claude の thinking。判断理由が残っていることが多い | オン |
| ツール引数 | Edit / Write の引数。実際に書かれた内容はここ |
オン |
| ツール結果 | ツールの出力。巨大でノイズが多い | オフ |
既定では現在のワークスペースに対応するプロジェクトのみ。「全プロジェクト」で横断できます。 サブエージェント(Task)の会話も対象に入ります。
会話ログはリポジトリの外(~/.claude/projects/)にあります。 4 つの対象のうち、これだけが
git の外を読みます。データはどこにも送信されず、すべてローカルで完結します。
対応プロジェクトの特定は、まずディレクトリ名で照合し、当たらなければ transcript に記録された
cwd を直接見ます。命名規則は Claude Code の内部仕様なので、名前だけに頼ると変更で静かに全滅するためです。
「全プロジェクト」を有効にしている間は、無関係なフォルダで交わした会話も対象に入ります。
そうと分かるよう、ツールバーに ⚠ 全プロジェクトの会話ログ を出し、結果一覧の該当セッションには
別プロジェクト の印を付けます。
結果をクリックすると、その会話を読める Markdown に組み立て直して開き、該当発言まで飛びます。
キーボード
| キー | 動作 |
|---|---|
Ctrl+Alt+O (Cmd+Alt+O) |
この実装はどこから来た?(blame + 履歴 + 会話ログ) |
Ctrl+Alt+F (Cmd+Alt+F) |
BlitzGrep を開いて検索ボックスにフォーカス |
Ctrl+Alt+Shift+F |
エディタの選択範囲(または単語)をそのまま検索 |
F4 / Shift+F4 |
次 / 前の一致へジャンプ |
Enter |
検索を実行 |
↑ / ↓ |
結果を移動しながらプレビュー |
← / → |
結果一覧で見出しを畳む / 開く(一覧にフォーカスがあるとき) |
Alt+C / Alt+W / Alt+R |
大文字小文字 / 単語単位 / 正規表現 |
Esc |
実行中の検索を中断 |
開いた行の見つけ方
「行」と「一致そのもの」を別の役割で示します。同じ色味で重ねると一致が行に沈むためです。
| 何を | どう示すか |
|---|---|
| 一致そのもの | 不透明に塗り潰し、文字色まで変える(蛍光ペン) |
| 行 | 無彩色の薄い地 + 行頭の帯 + 余白(gutter)の ▶ |
| 飛んだ直後 | 行が 0.7 秒だけ光る(blitzgrep.flashOnJump) |
会話ログのように一致位置を特定できなかった場合でも、行の目印は必ず出ます。 色はテーマから上書きできます。
| 色 | 用途 |
|---|---|
blitzgrep.currentMatchBackground |
一致の塗り |
blitzgrep.currentMatchForeground |
一致の文字色 |
blitzgrep.currentMatchBorder |
一致の枠・行頭の帯・gutter マーカー |
blitzgrep.currentLineBackground |
行の地 |
blitzgrep.flashBackground |
飛んだ直後の点滅 |
制約(正直に)
会話ログは消えます。 Claude Code は古い transcript を自動削除します(cleanupPeriodDays、既定 30 日)。
~/.claude/settings.json で伸ばせますが、過ぎた分は戻りません。「なぜ」を長く残したいなら
保持期間を先に延ばしておいてください。
transcript の形式は公開仕様ではありません。 Claude Code の内部形式なので、変わる可能性があります。 変わったときに「一致はありません」としか出ないのが最悪なので、次の 2 つを用意しています。
- 検索が全ファイルから 1 件も取り出せなかった場合、「一致なし」ではなく読めていないこと自体を報告します。
- コマンド
BlitzGrep: 会話ログを診断— 何本読んで何を取り出せたか、知らないブロック種別が 出ていないかを一覧にします。そのまま不具合報告に貼れる形式です。
その他:
- ブランチ検索の対象はローカルに取得済みの ref だけです。未 fetch の
origin/xxxは出ません。 - 履歴検索は既定で直近 300 コミットまで(
blitzgrep.historyMaxCommits)。マージコミットの差分は除外します。 - 正規表現の方言が対象ごとに違います: ワーキングツリー = Rust regex、ブランチ = PCRE (
git grep -P)、 履歴 =git log -Gの POSIX、会話ログ = JavaScript。 - 仮想リポジトリ (
vscode-vfs) では履歴検索は使えません。ブランチ検索は API 経由で、初回に そのブランチのアーカイブ全体をダウンロードします(120 MB 超は中断)。 - ブランチ・履歴側のファイルは UTF-8 として読みます。Shift-JIS は文字化けします。
- 信頼されていないワークスペースでは外部プロセス(ripgrep / git)を起動しません。
設定
| 設定 | 既定値 | 説明 |
|---|---|---|
blitzgrep.maxResults |
10000 |
収集する最大ヒット数 |
blitzgrep.debounceMs |
120 |
インクリメンタル検索のデバウンス |
blitzgrep.historyMaxCommits |
300 |
履歴検索でさかのぼる最大コミット数 |
blitzgrep.useGitignore |
true |
.gitignore を尊重する |
blitzgrep.includeHidden |
false |
隠しファイルも検索する |
blitzgrep.excludeGlobs |
node_modules 等 |
常に適用する除外グロブ |
blitzgrep.maxFileSizeKb |
2048 |
これを超えるファイルはスキップ |
blitzgrep.branchConcurrency |
6 |
git grep の同時実行数 |
blitzgrep.highlightInEditor |
true |
検索語の一致すべてを控えめにハイライト |
blitzgrep.highlightCurrentLine |
true |
開いた行を行全体 + 帯 + gutter マーカーで強調 |
blitzgrep.flashOnJump |
true |
開いた直後に行を一瞬光らせる |
blitzgrep.contextLines |
0 |
前後のコンテキスト行数(ワーキングツリーのみ) |
blitzgrep.ripgrepPath |
"" |
ripgrep のパスを明示する |
blitzgrep.githubMaxFilesPerBranch |
1500 |
仮想リポジトリで 1 ブランチあたり読むファイル数の上限 |
blitzgrep.openPreview |
true |
シングルクリックをプレビュータブで開く |
実装メモ
- 会話ログの走査: 145 MB / 25 ファイルで全行
JSON.parseが約 460 ms。生の行に対する部分一致で 足切りしても約 390 ms で差がほぼ無かった(行数は 1.3 万行しかなく、サイズは少数の巨大なtool_resultが占めるため)。よって足切りはせず、全部読んで抽出結果をキャッシュしています。tool_resultはサイズが桁違いなのでキャッシュ対象外。 - transcript の探索: プロジェクトディレクトリ直下だけでなく、セッション UUID の サブディレクトリ配下にもサブエージェントの会話が置かれるため再帰します。
- 日本語の特徴語: 形態素解析はしないので、漢字列とカタカナ列だけを内容語として取り出します。 ひらがなを混ぜると「この値は合言葉の有効期限」が丸ごと 1 語になり、検索語として使えないためです。
- ripgrep の場所: VS Code のバージョンによってパッケージ名もレイアウトも変わる
(
@vscode/ripgrep→@vscode/ripgrep-universal/bin/<platform>-<arch>/)ため、 既知パスを試したあと@vscode配下を浅く走査して追従します。
開発
npm install
npm run watch # esbuild のウォッチビルド
npm run typecheck # tsc --noEmit
npm test # 単体テスト + webview スモークテスト
npm run test:integration # 隔離した VS Code を起動しての統合テスト
npm run package # blitzgrep.vsix を生成
VS Code でこのフォルダを開き F5 で拡張機能開発ホストが立ち上がります。
単体テストは vscode モジュールをスタブに差し替え、本物の git と ripgrep(インストール済み
VS Code から自動検出)に対して実行されます。webview(media/main.js)は VS Code の中でしか
動かないため、test/webview.js が最小の DOM スタブ上で読み込んで描画を検証します。
CI は Ubuntu / macOS / Windows の 3 OS で全スイートを回します。統合テストは @vscode/test-electron が
.vscode-test/ にダウンロードした VS Code を使い、あなたの設定・拡張機能・会話ログには触れません
(CLAUDE_CONFIG_DIR をフィクスチャに向けます)。
ライセンス
MIT