
コードベースが大きくなると、「あの機能どこにあったっけ」という場面が増えてきます。ディレクトリ構造をたどっても目的のコードにたどり着けない——そんな経験がある方は多いのではないでしょうか。Semantic Navigatorは、まさにこの問題を解決するために作られたツールです。
Semantic Navigatorの基本的な仕組み
Semantic Navigatorは、Haskell開発者のGabriel Gonzalez氏が開発したオープンソースツールです。リポジトリのコードをLLMで解析し、ファイルの物理的な配置ではなく「意味」でグルーピングして表示してくれます。
たとえば、通常のプロジェクトではsrc/utils/helper.jsやlib/core/parser.tsのようにディレクトリで分類されていますよね。しかし、実際に開発者が知りたいのは「認証関連のコードはどこか」「データベース接続の処理はどれか」といった意味的な分類であることがほとんどです。Semantic Navigatorはこのギャップを埋めてくれます。
Semantic Navigatorの使い方
使い方はシンプルで、OpenAI APIキーを設定してリポジトリのパスを指定するだけです。
$ export OPENAI_API_KEY="your-api-key"
$ semantic-navigator ./path/to/repository
実行するとツリービューアが表示され、コードが意味的なクラスターに整理された状態でブラウズできます。プロジェクトの規模にもよりますが、数秒から1分程度で解析が完了するとのことです。
チャットインターフェースとの違い
開発者のGonzalez氏が強調しているのは、「チャットボックスの外で考える」というコンセプトです。CursorやClaude CodeのようなAIコーディングツールはチャットインターフェースが主流ですが、コードの全体像を把握するには必ずしも最適ではありません。
チャットで「認証関連のコードを教えて」と聞くこともできますが、いくつかの問題があります。まず情報過多になりやすく、返ってきた長文の中から必要な情報を探す手間がかかります。また、質問を文字で入力して待つというプロセス自体に手間がかかるんですよね。
Semantic Navigatorはツリービューという視覚的なインターフェースを採用することで、この問題を回避しています。クリックで展開していくだけで、コードの意味的な構造が一目でわかるようになっています。
技術的な仕組み
内部的には、リポジトリ内のファイルをembedding(ベクトル化)し、似た意味を持つコードをクラスタリングしています。そして、各クラスターにLLMでラベルを付与する仕組みです。デフォルトではgpt-5-miniを使ってラベル生成を行っているため、コストを抑えながらも精度の高い分類が可能になっています。
この方式はRAG(検索拡張生成)のアプローチに近い部分があり、ベクトル検索技術の応用例としても興味深いところです。
「エージェンティックコーディング」の先にあるもの
Gonzalez氏はブログ記事「Beyond Agentic Coding」で、チャット以外のAI開発ツールの可能性について論じています。現在のAIコーディングツールはほぼすべてがチャットベースですが、それが唯一の正解ではないという指摘は説得力があります。
実際、AIコーディングエディタの進化を見ていると、チャット+コード補完という組み合わせが標準になっていますが、コードの俯瞰的な理解を助けるツールはまだ少ないと感じます。Semantic Navigatorのようなアプローチは、今後もっと増えてくるかもしれません。
どんな場面で使えるか
個人的に特に役立ちそうだと感じたのは、以下のような場面です。
新しいプロジェクトに参加したときのオンボーディングには最適ですね。ドキュメントが不足しているプロジェクトでも、コードの意味的な構造がわかれば全体像をつかみやすくなります。また、大規模なリファクタリングの計画時にも、どのコードが関連しているかを俯瞰できるのは便利だと思います。
ソースコードはGitHubで公開されているので、興味のある方は試してみてください。Haskellで書かれていますが、解析対象は任意の言語のリポジトリに対応しています。
まとめ
Semantic Navigatorは、コードを「ディレクトリ」ではなく「意味」で整理するという、シンプルだけど意外と誰もやっていなかったアプローチのツールです。チャットAIの流行に一石を投じるコンセプトとしても面白いですし、実用的にも新規プロジェクトの理解やリファクタリングに役立ちそうな印象を受けました。AIコーディングツールの次の進化を考えるきっかけになるかもしれません。