概要
VS Code の拡張機能 Roo Code を使用している際、RPROMPT
を .zshrc
に設定していると、コマンドラインの出力が正しく取得できない という問題が発生しました。
この問題について、Roo Code の GitHub Issue #1083 として報告しました。
本記事では、この問題の詳細や再現方法、回避策について解説します。
また、同様の問題が VS Code 拡張「Cline」でも発生しており、RPROMPT の回避策を適用しても完全には解決しない ため、Cline では別の原因がある可能性があることについても言及します。 Cline での問題については最後の追記参照。
確認したバージョン
Roo Code: v3.3.21
Cline: v3.4.5
発生した問題
VS Code のターミナルで Zsh を使用し、RPROMPT
を .zshrc
に設定した状態で、Roo Code に次のような指示を出しました。
ls -la の出力結果を教えて。
しかし、Roo Code は ls -la
を実行したものの、その 出力結果を取得できず、ユーザーに返せない という問題が発生しました。
なお、ターミナル自体では ls -la
の結果が正常に表示されており、出力が阻害されているわけではありません。
このことから、Roo Code のターミナル出力の取得方法と RPROMPT
の設定が干渉している可能性が考えられます。
再現方法
- 以下の
.zshrc
を設定する。RED=$'%{\e[1;31m%}' DEFAULT=$'%{\e[1;m%}' RPROMPT=$RED'[%~]'$DEFAULT
- VS Code のターミナルを開き、Zsh を使用する。
- Roo Code に次の指示を出す。
Tell me the output of the command ls -la.
- Roo Code が
ls -la
の出力を取得できず、結果が返されないことを確認する。
原因の考察
この問題は、Roo Code が RPROMPT
に設定された ANSI エスケープシーケンスを適切に処理できず、ターミナル出力を正しく認識できないことが原因 である可能性が高いです。
Zsh の RPROMPT
は、ターミナルの 右側に表示されるプロンプト であり、上記の設定では「現在のディレクトリ (%~
) を赤色で表示する」ようにカスタマイズされています。
通常のターミナル(iTerm2 や macOS の標準ターミナル)では問題なく動作しますが、VS Code の Roo Code では RPROMPT
の影響で出力の解析がうまくできず、コマンドの結果を取得できない という問題が発生している可能性があります。
回避策
回避策 1: VS Code では RPROMPT
を無効化
if [[ "$TERM_PROGRAM" != "vscode" ]]; then
RPROMPT=$RED'[%~]'$DEFAULT
fi
この設定を .zshrc
に追加すると、VS Code のターミナルでは RPROMPT
を使用せず、他のターミナルでは従来通り動作 します。
回避策 2: RPROMPT
を削除する
根本的に問題を避けるなら、RPROMPT
を設定しないのも一つの手です。
unset RPROMPT
ただし、RPROMPT
を使ってターミナルをカスタマイズしている場合は、この方法は望ましくないかもしれません。
関連情報
- GitHub Issue: Roo Code Issue #1083
-
環境情報:
- VS Code Version: 1.97.2 (Universal)
- OS: macOS 15.1.1
- Shell: Zsh
- Terminal Emulator: VS Code Integrated Terminal
- Roo Code Version: 3.3.21
-
LLM Used:
google/gemini-flash-1.5
まとめ
-
RPROMPT
を.zshrc
に設定していると、Roo Code がls -la
の出力を取得できなくなる。 -
RPROMPT
を VS Code のターミナルのみ無効化することで回避できる。 -
同様の問題が Cline でも発生するが、RPROMPT を無効化しても解決しないため、別の原因がある可能性がある。Cline での問題については最後の追記参照。 - Roo Code のこの問題について、GitHub Issue #1083 に報告済み。
もし同じ問題に遭遇した方がいれば、上記の回避策を試してみてください!🚀
追記 - 2025/2/20
Cline では、以下の様にRED=$'%{\e[1;31m%}'
だけでコマンドライン出力が取得できなくなる事がわかりました。。
RED=$'%{\e[1;31m%}'