🍇

aqua経由でripgrepをインストールしているとClaude Codeのファイルパス補完が動かない

に公開
8

この記事ではCalude Codeのファイルパス補完が動かなかったときのメモです。

TL;DR

  • Calude Codeのファイルパス補完が動かない
  • aqua を使ってripgrep(rgコマンド)をインストールしていたのが原因だった
  • USE_BUILTIN_RIPGREP環境変数を設定すると動くようになる
    • ~/.claude/settings.jsonenvとして書くと良さそう

https://github.com/anthropics/claude-code/issues/155

{
  "permissions": {
    "allow": ["Read(~/.zshrc)"],
    "deny": ["Bash(curl:*)"]
  },
  "env": {
    "USE_BUILTIN_RIPGREP": 1
  }
}

環境

$ claude -v
1.0.17 (Claude Code)

$ aqua -v
aqua version 2.50.0

Claude Codeを使い始めた

Claude Maxプランを使えることになったのでClaude Code を使い始めました。

https://x.com/y_matsuwitter/status/1929826810466128044
https://tech.layerx.co.jp/entry/2025/06/05/161631

何が要因でこの性能が出ているのか私はよくわかっていないのですが、プロンプトやルールを頑張らなくてもかなり精度がよいので今週はAI系のコーディングツールとしてはClaude Codeしか使いませんでした。
個人的に感じたのは以下です。

  • 定額なので「とりあえずやらせてみる」みたいな使い方ができる
  • 「こんな雑な依頼の仕方では伝わらないな…(少なくても人間には)」みたいな指示でも自力で調べて対応してくれる
    • なので複数ターミナルで雑に指示を出しながら並列で作業を進めることが可能

ライブラリのバージョンアップ的な「やらなきゃいけないけど直接的な顧客価値が薄いから優先度上がらないタスク」もガシガシ潰せてよいです。
ccusageで確認するとかなりの額になっていたので、従量課金では躊躇していたトークン量と上級モデルの使用が功を奏しているのかもしれません。

https://github.com/ryoppippi/ccusage

…というのは前置き(余談)なのですが、Claude Codeを使っていて1つ困っていたのがファイルパス補完が動かないことでした。

Claude Codeのファイルパス補完が動かない

Claude Code@を入力するか、文字入力に続けてTABキーを入力するとファイル名を補完してくれる機能があります。

╭─────────────────────────────────────────────────────────────────────────╮
│ > Try "write a test for <filepath>"                                     │
╰-────────────────────────────────────────────────────────────────────────╯
  ! for bash mode       double tap esc to undo
  / for commands        shift + tab to auto-accept edits
  @ for file paths      ctrl + r for verbose output
  # to memorize         backslash (\) + return (⏎) for newline

この機能が私の環境では動きませんでした。
同僚に聞いても「デフォルトで動いているよ」と言われるし、他に同様の現象に悩んでいたのが周りには一人だけで、よくわからないままとりあえずIDE連携なので誤魔化していました。

aqua を使ってripgrep(rgコマンド)をインストールしていたのが原因だった

会社PC、私物PCで再現したので、自分の設定ファイルが問題だと思い、~.zshrcを一部ずつコメントアウトしながら検証したところ、ripgrepのインストール方法が原因でした。
Calude Codeはファイルパス補完にripgrepを利用しています。
私はripgrepをCLIツールのバージョン管理を行えるaquaを使ってグローバルインストールして使っていました。

https://aquaproj.github.io/

aquaに定義したripgrepをアンインストールするとファイルパス補完が正しく動くのを確認しました。

Calude CodeUSE_BUILTIN_RIPGREP環境変数を設定する

https://docs.anthropic.com/ja/docs/claude-code/overview

ドキュメントには載っておらず、以下のissueにしか言及されていないのですが、Calude CodeにはUSE_BUILTIN_RIPGREPという環境変数が存在します。
https://github.com/anthropics/claude-code/issues/155

これを有効にすると、vendoerディレクトリ以下にビルドインされているripgrepを使うようになります。

$ ls ~/.claude/local/node_modules/@anthropic-ai/claude-code/vendor/ripgrep
arm64-darwin arm64-linux  COPYING      x64-darwin   x64-linux    x64-win32

環境変数名が"グローバル"すぎるのが気になるので、~/.calude/settings.jsonに指定して解決しました。

https://docs.anthropic.com/en/docs/claude-code/settings#settings-files

{
  "permissions": {
    "allow": ["Read(~/.zshrc)"],
    "deny": ["Bash(curl:*)"]
  },
  "env": {
    "USE_BUILTIN_RIPGREP": 1
  }
}

おわりに

やっと他のみなさんと同じようにClaude Codeでファイルパス補完もできるようになりました。
IDE連携機能を使ってCursorからファイルパスをClaude Codeに送っていたのですが、これでClaude Codeに完結しそうです。
2025年になってからGoLandからCursorに移行し、Roo Codeも使っていたのですが、これならGoLandに戻れる[1]気がしますし、ターミナルで完結するならばNeovimまで戻っていいのでは?という気持ちになってます。

脚注
  1. 有償ツールなので当然と言えば当然なのかもしれませんが、JetBrainsIDEのファイル探索系のパフォーマンスはVSCode系ツールより圧倒的に高速です ↩︎

Discussion

Shunsuke SuzukiShunsuke Suzuki

こんにちは。 aqua の作者です。
aqua をご利用いただきありがとうございます。

  • aqua でどのように ripgrep をインストールしていたのか
  • aqua のバージョンはなにか
  • aqua.yaml はどうなっているか
  • なにかエラーを吐いていたのか

など詳細が読み取れないのでなんとも言えませんが、もしかするとこちらの記事が参考になるかもしれません。
https://zenn.dev/shunsuke_suzuki/scraps/73914f56f3f860
https://zenn.dev/shunsuke_suzuki/articles/aqua-cline-mcp-server-troubleshooting

Claude Code は使ったことがないのでよくわかっていませんが、 ripgrep を AQUA_GLOBAL_CONFIG でインストールしているとしたら、 USE_BUILTIN_RIPGREPenv で設定しているように AQUA_GLOBAL_CONFIGenv で設定すると解決するかもしれません。

budougumi0617budougumi0617

aqua大変便利に使わせていただいております。ありがとうございます!

ご助言ありがとうございます!ご推測の通りripgrepコマンドを AQUA_GLOBAL_CONFIG でインストールしていました。
早速試してみたのですが、うまくいきませんでした…。
設定しなくてもAQUA_GLOBAL_CONFIGも見えているようなのですが 😢

(問題自体は記事のやり方で解決できていて、どちらもちゃんと使えているので今後もaqua使わせていただきます!!)

budougumi0617budougumi0617

ありがとうございます!!

なぜなら aqua-proxy は実行時のコマンド名 ($0)で対象のコマンド名を取得するから。

同じsymbolic linkなHomebrewのripgrepだと動くのでこのへんが理由なんですかね 🤔

budougumi0617budougumi0617

もし問題ないなら https://github.com/anthropics/claude-code にも「こういうことがあるよ」とreportだけissueとして立ち上げてもいいでしょうか。
原因がaquaであることを知っていると、作ってもらったaquaのissueを見てわかるのですが、「Claude Codeのファイルパス補完が動かない」しか知らない状態で調べると( https://github.com/anthropics/claude-code のissueしか調べないと)全然なぜなのかわからないので 😇

Shunsuke SuzukiShunsuke Suzuki

同じsymbolic linkなHomebrewのripgrepだと動くのでこのへんが理由なんですかね 🤔

そうだと思います。

issueとして立ち上げてもいいでしょうか

ありがとうございます。助かります。
ただ aqua とその仕組みを知らないと理解が難しいかもしれませんね。

directory 構成
$(aqua root-dir)/
  bin/
    rg # symlink to ../aqua-proxy
  aqua-proxy # symlink to internal/.../aqua-proxy
  internal/pkgs/github_release/github.com/aquaproj/aqua-proxy/v1.2.9/aqua-proxy_darwin_arm64.tar.gz/aqua-proxy  
  pkgs/github_release/github.com/BurntSushi/ripgrep/14.1.1/ripgrep-14.1.1-aarch64-apple-darwin.tar.gz/ripgrep-14.1.1-aarch64-apple-darwin/rg

通常、 aqua は以下のようにツールをインストール・実行します。

  • aqua で ripgrep をインストールすると $(aqua root-dir)/pkgs 配下にインストールされ、 $(aqua root-dir)/bin/rg に symbolic link が作られる
  • rg コマンドを実行すると $(aqua root-dir)/bin/rg が実行され、それが aqua-proxy への symbolic になっているので、 aqua-proxy が実行される。このとき $0 は rg
  • aqua-proxy は aqua exec -- $0 "$@" を実行し、 aqua が実行される
  • aqua は設定ファイルを読み、 $0 のバージョンを動的に決定し、実行する

あとは説明した通り。
symbolic link を解決しつつコマンドのパスを取得してから絶対パスを指定してコマンドを実行すると aqua は現状動きません ($0 が期待されたものではないので)。