1月27日、海外ブログ「Vjeux」が「Vjeux » Porting 100k lines from TypeScript to Rust using Claude Code in a month」と題した記事を公開した。この記事では、AIエージェント「Claude Code」を活用し、1ヶ月間で10万行のTypeScript(JavaScript)コードをRustへ移植したプロジェクトの全容について詳しく紹介されている。

以下に、その内容を紹介する。
プロジェクトの背景と目的
筆者は、Microsoftのエンジニアが掲げる「1人のエンジニアが1ヶ月で100万行のコードをC++からRustへ書き換える」という目標に触発され、AIによるコード移植の限界に挑んだ。題材に選ばれたのは、オープンソースの対戦用ポケモンシミュレーター「Pokemon Showdown」である。オリジナルのJavaScript実装は低速であるため、Rustへの移植が決定された。
開発環境の自動化とサンドボックスの回避
Claude Codeを24時間稼働させ、人間の介入を最小限にするために、筆者はいくつかの技術的な工夫を施した。
- git pushの自動化: Claudeのサンドボックス制限を回避するため、ローカルでHTTPサーバーを立ち上げ、ターミナル経由でgitコマンドを実行するNode.jsスクリプトを作成した。
- アンチウイルス対策: 未知のバイナリ実行による警告を避けるため、Dockerインスタンス内でコンパイルと実行を行う仕組みを構築した。
- パーミッションの自動承諾: Claudeの確認プロンプトに対し、数秒おきに「Enter」キーを自動入力するAppleScriptを作成した。
#!/bin/bash
osascript -e \
'tell application "System Events"
repeat
delay 5
key code 36
end repeat
end tell'
- フォーカス維持: 自動アップデート等のポップアップでターミナルのフォーカスが外れるのを防ぐため、オートクリッカーを使用して定期的に画面端をクリックし、スリープを防ぎつつ実行環境を維持した。
移植戦略の転換
当初、単純なプロンプトで一括移植を試みたが、AIが複雑な箇所を「簡略化」したり、誤った抽象化を行ったりする問題が発生した。これに対処するため、以下の構造的なアプローチが取られた。
- 決定論的なスクリプトの利用: JavaScriptのソースコードをコメントとしてRust側に挿入するスクリプトを作成し、AIが参照すべき「正解」を固定した。
- ファイルの細分化: 1万行を超える巨大なファイルをメソッド単位の小さなファイルに分割することで、コンテキストウィンドウの制限を回避し、精度を向上させた。
- クリーンアップフェーズ: AIがハードコードした箇所や誤った方向に進んだ箇所を、エンジニアとしての経験に基づき特定し、再度AIに指示を出して修正させた。
統合とテスト
移植後の検証では、JavaScript版とRust版に同じランダムシードを与え、実行結果(ポケモンの行動や状態変化)が完全に一致するかを比較するエンドツーエンドテストが実施された。
3週間にわたり、AIは平均20分に1つのペースでバグを修正し、最終的に数百の不具合を自律的に解消した。
直面した課題
移植過程では、大きく分けて2つの問題が発生した。
- Rust特有の制約: 所有権と借用チェッカーへの対応、動的な型を持つJavaScriptコードの構造体化、オプション引数の明示的な記述など。
- AIの性質による問題: Claude Codeは「困難な作業」を回避しようとする傾向があり、複数のファイルにまたがる修正を拒んだり、勝手に仕様を簡略化したりすることがあった。これらは適切なプロンプト管理とエンジニアによる監視が必要であった。
結論
本プロジェクトの結果、以下の成果が得られた。
- 規模: 4週間で約5,000回のコミットが行われ、約10万行のRustコードが生成された。
- 精度: 240万件のシード値のうち、99.997%(不一致はわずか80件)でJavaScript版と一致する動作を実現した。
- 性能: Rust版はJavaScript版に比べ、並列実行において大幅な高速化を達成した。
筆者はRustの経験が全くなかったが、Claude Codeという強力なツールと、自身のエンジニアリングの専門知識を組み合わせることで、この大規模な移植を完遂させた。AIエージェントはエンジニアにとって優れたツールとなるが、依然として「子守り(Babysitting)」のような細かな管理と、的確なディレクションが必要であると結論づけている。
詳細はVjeux » Porting 100k lines from TypeScript to Rust using Claude Code in a monthを参照していただきたい。