このプロジェクトについて
Dittoは、コンパイル、テスト、リントに並ぶ追加のパイプライン質問として「セマンティックCI」を提示します。それは、「このコードベースは、すでに知っていることを再発明していないか?」という問いです。本ツールは、トークンベースやASTベースの重複検出器では一般的に報告されない、書き方は異なるが振る舞いが同じ「タイプ4クローン」をターゲットとしています。
ドキュメントに記載されたパイプラインの仕組みは以下の通りです。バックエンドがリポジトリのtarballをダウンロードし、ts-morphで走査して非エクスポート関数を含むすべての関数を抽出します。その後、安価なモデルを使用して、名前を伏せた状態で各関数を個別にフィンガープリントします。これらのフィンガープリント(生のコードや名前は含まれません)は埋め込みされ、メモリ内でコサイン類似度によってクラスター化されます。結果として得られた候補クラスターのみが、判定および敵対的入力の提案を行うより大規模なモデルに送られます。機能的に純粋な関数は、タイムアウト付きのworker_threadsサンドボックス内で並行して実行され、そこで確認された乖離が実行証拠として提示されます。不純な関数もクラスター化および判定されますが、「実行済み」ではなく「予測」としてラベル付けされます。結果はMongoDBに書き込まれ、読み取り専用エンドポイントとNext.jsフロントエンドによって提供されます。提供パスでモデルは呼び出されません。
READMEでは、5つのリポジトリ(2,870、2,654、336、31、6関数)にわたる実行結果が報告されており、重複クラスター、振る舞いの競合、および実行によって証明された18のケースがリストされています。これには、clineにおけるtruncateText実装の一群が含まれており、予約スペースの計算により、特定の制限を超えると保持されるテキストが1文字にまで縮小される問題が指摘されています。また、jscpdではこれらのファイル間でクローンがゼロであると報告されています。適切にメンテナンスされている2つの小規模ライブラリではクリーンな結果となり、これが過剰報告がない証拠として提示されています。
明記されている制限事項は以下の通りです。ASTレイヤーにts-morphを使用しているためJavaScript/TypeScriptのみに対応しています。実行には純粋関数である必要があります。大規模なリポジトリは、関数を静かにドロップするとクラスター全体が消失する可能性があるため、切り捨てではなく明示的にスコープを指定する必要があります。また、2つの競合する実装のどちらを保持すべきかは推奨せず、それを人間による決定として位置づけています。READMEにあるコストと時間の数値(例:2,870関数の分析に232ルピー、計画中のGuardチェックでプルリクエストあたり約1ルピー)はプロジェクト独自の測定値であり、独立したベンチマークではありません。ホストされたデモでは、メンテナーのAPIクレジット制限によりオンデマンド分析が600関数に制限されていますが、自身のキーを使用してローカルで実行すればこの制限は解除されます。
セットアップノートには、MongoDBやAPIキーなしでのリポジトリインデックス作成、MongoDB、OpenAI、およびオプションのGitHub/モデル設定を含む.envファイル、1200秒のリクエストタイムアウトを設定したCloud Runへのデプロイ、Atlasネットワークアクセス、およびビルド時にNEXT_PUBLIC_*値がインライン化されるVercelでのフロントエンド構築について記載されています。ロードマップには、GitHub ActionのプルリクエストチェックであるDitto Guard、コーディングエージェントが重複を書き込む前にインデックスを照会できるMCPツール、tree-sitterによる他言語への対応、およびインクリメンタルな再インデックス化が挙げられています。コントリビューターには、ラベル付けされた「good first issues」が案内されています。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.