Skip to content
| Marketplace
Sign in
Visual Studio Code>SCM Providers>BlitzGrepNew to Visual Studio Code? Get it now.
BlitzGrep

BlitzGrep

rkojima

|
1 install
| (0) | Free
「この実装どこから来た?」を探す全文検索。ワーキングツリー・全ブランチ・git履歴(pickaxe)・Claude Code の会話ログを横断します。
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

BlitzGrep

English README

CI

「この実装、どこから来た?」を探すための VS Code 拡張機能。

Ctrl+Shift+F が届かない場所 — 他のブランチ、コミット履歴、そして Claude Code の会話ログ — を 同じ UI で横断検索します。

AI エージェントに作らせたコードを後から見て「そんな仕様どこに書いてあったっけ?」となったとき、 答えは現在のツリーに無いことがあります。ブランチにあるのか、消されたコミットにあるのか、 そもそもファイルではなく会話にしか無いのか。その 3 箇所を一度に当たれるようにしたものです。

インストール

VS Code の拡張機能ビューで「BlitzGrep」を検索するか、

code --install-extension rkojima.blitzgrep

まずこれ: Ctrl+Alt+O

気になる行にカーソルを置いて Ctrl+Alt+O(BlitzGrep: この実装はどこから来た?)。 3 つのソースを 1 回で引いて、1 つのリストに並べます。

📍 a1b2c3d4  最後に触ったコミット — 合言葉の有効期限を追加   2026-08-01 you
   traced.ts:1  export const PASSPHRASE_TTL_HOURS = 24;
◆ a1b2c3d4  合言葉の有効期限を追加                        2026-08-01 you
 + traced.ts:1  export const PASSPHRASE_TTL_HOURS = 24;
💬 2026-08-01  my-project                                  main
   🤖Write   "content": "export const PASSPHRASE_TTL_HOURS = 24;"
   👤発言    合言葉は何時間で切れるようにする?
   🤖思考    合言葉の有効期限は 24 時間にする。

上から「その行を最後に触ったのは誰か」「いつ入ったか」「なぜそうなったか」の順です。 最後の 💬 をクリックすると、その会話が読める形で開いて該当発言まで飛びます。

行そのものが会話に一字一句出てくることは稀なので、完全一致で空振りしたときは 行から特徴語を 1 つ取り出して自動的に引き直します(何で引き直したかは結果に表示されます)。

4 つの検索対象

対象 答える問い 使うもの
いま (ワーキングツリー) どこで使ってる 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 つです。

  1. 「なぜ」の在り処が違う。 GitLens が読むのは git が知っていること(誰が・いつ・何を)だけです。 AI エージェントと作ったコードの「なぜ」は、コミットメッセージではなく会話に残ります。 BlitzGrep はそこを検索対象に含めます。git の外にあるこの情報源を扱うのが、他と決定的に違う点です。
  2. 問いを分けずに投げられる。 「blame を見て、次にログを検索して、次に会話を漁る」を 人間が順にやる代わりに、1 つの語を 4 つの出所へ同時に投げて 1 つの時系列に並べます。 どの段が何件返したかはサイドバーのパイプライン表示で見えます。

GitLens を入れたまま併用してください。行の blame を常時眺めるのは GitLens、 「この仕様どこから来た?」で詰まったときだけ Ctrl+Alt+O が BlitzGrep、という住み分けです。

やらないこと

  • 行末の blame 注釈、ホバー、ファイル履歴ビュー、コミットグラフ — GitLens の領域です。
  • git 操作(commit / push / stage)— 一切しません。読むだけです。
  • ChatGPT など他の AI ツールの履歴 — いまは Claude Code の transcript 形式のみ対応です。

使い方

  1. アクティビティバーの虫めがねアイコン、または Ctrl+Alt+F。
  2. 「対象」を切り替えて検索語を入力。
  3. ワーキングツリーと会話ログは入力しながら検索、ブランチ横断と履歴は 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

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2026 Microsoft