WSL + VSCode Copilot Chat で RTK が動かなかった話
TL;DR — RTK のフックが vscode の Copilot Chat では動かない(2つの理由がある)。フックをやめてグローバルインストラクションに
.github/copilot-instructions.mdの内容を転記すれば Copilot が自発的にrtkプレフィックスを使うようになった。
職場の WSL 環境に RTK を入れて VSCode Copilot Chat と組み合わせようとしたら、フックが全然動かなかった。調査した結果と、現状の対策を書いておく。
RTK とは
RTK(Rust Token Killer) は CLI プロキシで、コマンド出力を 60〜90% 圧縮して AI エージェントのトークン消費を削減するツール。git status の代わりに rtk git status を使うと、AI に渡る出力がコンパクトになる。
前の記事でも紹介したなこれ。書かなくてもいいかと思ったけど一応書いておく。
rtk init -g は Copilot 向けではない
RTK のセットアップで rtk init -g を実行すると Claude Code 向けのフックしか設置されない。Copilot 向けは --copilot フラグが必要:
rtk init -g --copilot
ただし -g(グローバル)をつけても実質プロジェクトスコープで、このコマンドを実行したディレクトリの .github/ 以下に copilot-instructions.md と hooks/rtk-rewrite.json が生成される。
いやそれだと色々厳しい、と思いつつ調べたらグローバルインストールは未対応(Issue #1107 でオープン中)。
早めの対応をお願いしたいところ。あと、すでにカレントディレクトリに .github/copilot-instructions.md があっても全力で上書きされた。こわい。
フックが動かなかった原因:2層構造
フラグを直してもフックは動かなかった。原因は2つある。
① RTK が run_in_terminal を認識しない
VSCode Copilot Chat が渡す tool_name は "run_in_terminal" だが、RTK の detect_format() の認識リストに含まれていない。
// run_in_terminal が抜けている
if matches!(tool_name, "runTerminalCommand" | "Bash" | "bash") {
ローカルビルドで追加すれば動くけど、これは RTK 側のバグじゃないかなぁ。
誰もあげないようなら、Issue あげてみるか。
② "ask" + updatedInput の承認ループ
で、実際ローカルビルドしたもので試したら承認求められて3回承認したところで諦められた…
RTK v0.36.0 からデフォルトの permissionDecision が "allow" → "ask" に変更された(CHANGELOG に記載)のが原因とのこと。
以下は Claude さんの見解。
VSCode Copilot Chat は
"ask"を受け取ると承認ダイアログを出すが、承認後にupdatedInput(書き換え後コマンド)が反映されず元のコマンドを再実行しようとする。結果、承認ループが発生して抜けられない。これは Copilot Chat 側の挙動で、RTK 側だけでは解決できない。upstream 待ち。
ほんとかな?まあ説明はそれっぽい。
CopilotCLI 側の実装(以下のコード)と同じで、“deny” を使えばループを回避できるんじゃないかなと踏んでる。
fn handle_copilot_cli(cmd: &str) -> Result<()> {
...
let output = json!({
"permissionDecision": "deny",
"permissionDecisionReason": format!(
"Token savings: use `{}` instead (rtk saves 60-90% tokens)",
rewritten
)
});
結論:インストラクションに転記すれば動く
じゃあどうしたかと言うと、フックは一旦諦めて削除、rtk init -g --copilot で生成された、.github/copilot-instructions.md の中身を自分のグローバルインストラクションに転記した。
中身は以下のように、RTK の使い方説明だけ。見出しを調整して転記。
# RTK — Token-Optimized CLI
**rtk** is a CLI proxy that filters and compresses command outputs, saving 60-90% tokens.
## Rule
Always prefix shell commands with `rtk`:
```bash
# Instead of: Use:
git status rtk git status
git log -10 rtk git log -10
cargo test rtk cargo test
docker ps rtk docker ps
kubectl get pods rtk kubectl pods
```
## Meta commands (use directly)
```bash
rtk gain # Token savings dashboard
rtk gain --history # Per-command savings history
rtk discover # Find missed rtk opportunities
rtk proxy <cmd> # Run raw (no filtering) but track usage
```
Copilot が自発的に rtk プレフィックスを使うようになって出力の取得も問題なし。めでたしめでたし。
じゃないし。フック解決してないし。引き続き更新を待つかぁ。