ぶていのログでぶログ

思い出したが吉日

WSL+fish環境でCursorのAI Agentがコマンドの完了を検知しない問題

仕事や個人の開発でCursorを使って開発を行っている。Agentモードを使い色々作業をさせているのだが、コマンドの終了をうまく検知できず手動でターミナルを閉じたり、コマンドを終了させたりしていて不便だった。 しかし先日会社のSlackで同僚がこの問題の解決策を共有していて*1、それを参考にしたら解決した! id:doskoi64 ++

forum.cursor.com

解決方法

$__fish_config_dir/config.fish に以下を追記する。

source $(code --locate-shell-integration-path fish)

追記後にCursorを再起動するとAgentが実行するコマンドの終了を検知できるようになるはず。

詳細

Cursorはコマンドの検知にエスケープシーケンス*2を使っている。 このエスケープシーケンスは、VSCodeのシェルインテグレーションをインストールすることで自動で出力されるようになる。 しかし、WSL環境ではうまくインストールできず結果としてコマンド検知ができていないという状態になっていたようだ。

code.visualstudio.com

プロンプトを変える

VSCodeのシェルインテグレーションを入れるとプロンプトが変わってしまう。 デフォルトではログインユーザ名、ホスト名、カレントディレクトリのパス、ブランチ名などが表示されるようになっている。 しかし、これが思ったより長ったらしくAgentが実行するコマンドの視認性が悪くなるのでプロンプトを短くしたい。 単純にfish_promptを定義してしまうとコマンド終了の検知ができなくなってしまうので工夫する必要がある。

VSCodeのシェルインテグレーションを確認すると以下のようになっている。

function fish_prompt
                        __vsc_fish_prompt
                        __vsc_fish_cmd_start

end

__vsc_fish_cmd_startがエスケープシーケンスを出力する関数なのでこれだけ呼び出せばよさそうにみえる。 そこで、私は以下のように定義した。

if string match vscode $TERM_PROGRAM > /dev/null
    source $(code --locate-shell-integration-path fish)

    function fish_prompt
        printf '> '
        __vsc_fish_cmd_start
    end
end

変更した結果↓みたいになった。

おわりに

CursorのAgentがコマンドの完了検知できるようになって便利になった!最高!

*1:正確にはzsh環境で同様の問題が起こっていてその解決策の共有だったが、フォーラムにあった別の解決策で私の問題も解決された

*2:OSC633というVSCodeのカスタムエスケープシーケンスを使っているっぽい。OSC133っていうのもあるっぽいが、あえてカスタムにしているのはなんでだろうなぁ。