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.mdhooks/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 プレフィックスを使うようになって出力の取得も問題なし。めでたしめでたし。

じゃないし。フック解決してないし。引き続き更新を待つかぁ。

待ちきれずに結局自分で issue 書いた