"Vibe Coderのための「コード翻訳レンズ」をClaude×Geminiで1日で作った話"
Introduction: AI生成コードの「解読の壁」を突破するRosetta Lens構想
今GeminiにDeep Researchさせてるんだけどさ、内容は「初心者(俺)がAIの書いたコードの保守性がわからないので、コードの再翻訳をしてくれるレビューソフトの有無」なんだよね。Claudeとの朝のブレストから始まったこのプロジェクト、名前は「Rosetta Lens」に決めた。
DeepResearchの結果によれば、AIが書いたコードを人間が理解できる形に再翻訳するツールの空白地帯を発見。
今は「AIすごい!動いた!」のハネムーン期だけど、半年後には「誰も読めない負債」が爆増するはず。
特に自分みたいにコードが書けない人が増える時代、自分自身がユーザー像だからペインは本物だと思う。GeminiとClaudeと一緒に(窓は別だが)議論を重ねた結果、既存ツールにはない「非破壊で文脈を理解した仮想レイヤー翻訳」というコンセプトに辿り着いた。
対象読者は、AI生成コードのブラックボックス化に悩む全ての「Vibe Coder」たちだ。
Struggle: Decoration APIによる描画の限界と文字幅の壁
開発はClaude Codeに実装を任せ、Geminiにレビューを依頼する分業体制で進めた。フェーズ1の足場組みからフェーズ2の描画テストへ。当初はVS CodeのDecoration APIを使い、英語の識別子を透明化して、その上に日本語を重畳表示する「没入モード」を目指していた。
しかし、ここで大きな技術的困難に直面した。等幅フォント環境において日本語(全角)と英語(半角)のレンダリング幅が一致せず、データ保存あたりの表示が激しくダブってしまう。fetchUserAuthenticationCredentialsのような長い識別子では、after.marginによる微調整も虚しく、視認性が著しく低下した。
実際の表示はこんな状態になった:

ClaudeとGeminiとの会話でも、この「物理的な限界」が最大の懸念となった。
Insight: 対訳モードへのピボットとFlashモデルの採用
詰まっていたところに、Geminiから「UI描画モードを根本から見直すべき」という提言が入った。Decoration APIの「重ね書き」に固執せず、VS Code標準のInlay Hints APIへ移行する——英語の横に日本語をルビのように添える「対訳モード」だ。これで文字の重なりは数学的にゼロになる。
あわせてモデルの選定も見直した。「Gemini 2.5 Proより3.0 Flashの方が応答速度とコスト面で良くない?」とGeminiに相談したところ、回答は「大正解」。IDE拡張機能においてレイテンシは命だし、Gemini Flashの速度なら、ファイルを開いた瞬間に非同期で翻訳を完了できる。
これにより:
// Before(Decoration API・没入モード)
// 文字が重なってぐちゃぐちゃになる
// After(Inlay Hints API・対訳モード)
const user ユーザー取得 = await fetchUser ユーザー取得 ('user-123');
まさに「正鵠を射る」発見だった。
既存ツールとの比較を整理するとこうなる:
| 比較項目 | 既存の翻訳拡張機能 | 既存のAIリファクタツール | Rosetta Lens(仮想レイヤー) |
|---|---|---|---|
| 文脈理解 | 低(単なる辞書引き) | 高(AST/LLM連携) | 高(LSP/AST/LLM連携) |
| 安全性 | 高(非破壊的) | 低(破壊的置換) | 最高(Read-Only表示のみ) |
| 学習効果 | 低(都度ホバーが必要) | 低(英語を学べない) | 高(英語と日本語を瞬時にトグル) |
Solution: Inlay Hints APIとSQLiteキャッシュによる堅牢な実装
最終的に、Gemini 3 Flash(gemini-3-flash-preview)をエンジンに据え、Inlay Hints APIによる非破壊的な翻訳表示を実装した。APIコストを最小化するため、L1(LRUメモリキャッシュ)とL2(SQLite永続化キャッシュ)の2層構造を導入。これにより、2回目以降のファイル展開は「ゼロレイテンシ」を実現した。
// Inlay Hints APIを用いた非破壊的翻訳の核心部
vscode.languages.registerInlayHintsProvider(selector, {
provideInlayHints(document, range) {
const symbols = getCachedSymbols(document.uri);
return symbols.map(s => {
const hint = new vscode.InlayHint(s.location.range.start, ` ${s.translation}`);
hint.tooltip = new vscode.MarkdownString(`**${s.original}** の翻訳: ${s.translation} 🔍 Rosetta Lens`);
return hint;
});
}
});
元の英語コードを1バイトも書き換えることなく、エディタ上に文脈を汲み取った日本語を重畳できるようになった。X-Rayホバーで元の英語も確認できる「Rosetta Lens 0.1.0」が完成した。
完成後の動作はこんな感じ:

使い方
前提条件
- VS Code 1.85.0 以上
- Google AI Studio の Gemini API キー(無料で取得できる)
インストール
VS Code Marketplace(公開準備中)からインストール予定。現在はGitHubから直接インストールできる:
-
GitHubリリースページから
rosetta-lens-0.1.0.vsixをダウンロード - 以下のコマンドでインストール:
code --install-extension rosetta-lens-0.1.0.vsix
セットアップ
-
Ctrl+,(Mac:Cmd+,)で設定を開く -
rosettaLensで検索 - Gemini Api Key に取得したAPIキーを貼り付ける
{
"rosettaLens.geminiApiKey": "AIza...",
"rosettaLens.geminiModel": "gemini-3-flash-preview"
}
基本的な使い方
- TypeScript / JavaScript / Python ファイルを開く
-
Ctrl+Shift+L(Mac:Cmd+Shift+L)でトグル - 識別子の前に日本語翻訳がルビのように表示される
- 識別子にホバーすると元の英語名と翻訳の根拠が表示される(X-Ray Hover)
- もう一度
Ctrl+Shift+Lで元の英語表示に戻る
キャッシュについて
- 一度翻訳した結果はSQLiteにキャッシュされる(デフォルト7日間)
- 2回目以降はAPIを呼ばずにゼロレイテンシで表示
- キャッシュをクリアしたい場合は
Ctrl+Shift+P→Rosetta Lens: Clear Cache
注意事項
- VS Codeの
editor.inlayHints.enabledが有効になっていることを確認(デフォルトはON) - 対応言語:TypeScript / JavaScript / Python(初期リリース)
- APIキーはVS Code設定に保存されるためGitには上がらない
まとめ・今後
「コードは書けるけど読めない」Vibe Coder向けのツールを、Claude × Geminiの分業体制で1日でゼロから完成させた。
開発で気づいたのは、AIツールの役割分担が自然に生まれること。Geminiがリスクヘッジと提言、Claude Codeが実装、Claudeが設計とレビューという流れが気持ちよくはまった。
今後の展開としては:
- VS Code Marketplace への正式公開
- 没入モード(英語を完全に隠すモード)の実装
- カスタム辞書(ドメイン固有語の登録)機能
- JetBrains IDE対応
APIキーは自分で用意する必要があるけど、Gemini無料枠で十分動く。ぜひ試してみてほしい。
感想・バグ報告・機能要望はコメントか GitHub Issues へ!
この記事自体、チャットログをAIで変換して生成しています。開発の全ログは別途公開予定。