
2026/09/23 1:53
Show HN:Treepeat ~Tree-sitter を使用したコードの類似性検出~
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
Treepeat は、抽象構文木(AST)を Tree-sitter を介して解析し、局所的感受性ハッシュング(locality-sensitive hashing)を用いてコードの類似性を検出するための概念検証ツールです。JavaScript、Python、Go、Rust、TypeScript、Java などをサポートする十余数カ種以上の言語に対応しています。ユーザーは、
none(行レベル)、default(空白・文字列を無視)、loose(匿名化された識別子を持つ構造的に類似したもの)の 3 つの正規化モードを通じて検出感度を制御できます。主要なコマンドラインフラグには、--similarity(1-100% の閾値)、--min-lines、サイドバイサイドビュー向けの --diff、CI パイプラインに適したコンソールまたは SARIF 出力向けの --format があり、追加オプションとしてメトリクスと進捗バーを表示する --verbose および --progress が用意されています。list-ruleset および treesitter などのサブコマンドはデバッグと設定に役立ちます。コミュニティからの寄与を歓迎する開発段階のツールである Treepeat は、チームがコピー&ペーストのエラーを早期に特定しソフトウェア品質を向上させるのに貢献します。アーキテクチャ決定記録(ADR)を含むドキュメントは docs/adr にあります。本文
Treepeat: コードベース内の類似箇所を検出するツール
Treepeat は、コードベース内で類似または重複しているコードブロックを検出するためのツールです。本ツールは概念検証のプロトタイプであり、開発者による PR の募集中です。
対応する言語
以下の言語に対応しています:
- Astro, Bash, CSS, Go, HTML
- JavaScript, Lua, Markdown
- Python, SQL
- TypeScript, Java, Kotlin
- Rust, YAML
主な機能
ツールは**ルールセット(正規化の厳密さ)**によって検出方法を変えられます。
- 言語固有の文脈に意義のある重複コードブロックを検出します(クラスや関数など)
- 設定例:
--ruleset none
- 設定例:
- 似ているが完全に一致しないコードを特定します
- 空白、文字列、関数名などの高レベルな AST ノードを無視して比較します。
- 設定例:
(デフォルト)--ruleset default
- 構造が類似したコードを発見します
- 識別子や定数などの匿名化処理が含まれます。
- 設定例:
--ruleset loose
インストールと使用方法
注: 具体的なインストール手順については、公式ドキュメントやリポジトリを参照してください。
検出の実行原理
Tree-sitter を活用した抽象構文木(AST)解析と、**局所感度ハッシュ化(Locality-sensitive hashing)**を用いて、コードベース全体を走査します。
メインなフラグ
以下は
treepeat detect コマンドで使用できる主要なオプションです。
: 使用する正規化ルールセットを指定します。--ruleset- 選択肢:
,none
,defaultloose - 目的:コードを比較する前にどの程度の正規化を行うかを制御します。
- 選択肢:
: 類似度閾値を指定します(1〜100 の範囲)。--similarity- デフォルトは
です(完全な重複を検出)。100
- デフォルトは
: マッチと判定するための最小行数を指定します。--min-lines- デフォルトは
です。5 行
- デフォルトは
: 類似しているブロックの左右対比表示(Diff)を表示します。--diff
: 出力形式を指定します。--format- デフォルト:コンソール出力
- CI ツール向け:SARIF 形式
: 追加の実行メトリクスを表示します(ステージごとの所要時間など)。--verbose
: 長期間実行されるパイプラインのステージごとに進行状況をバーグラフで表示します。--progress- 実装詳細: 進捗バー(tqdm)は標準エラー出力(stderr)に書き込まれ、通常のコマンド出力(stdout)や
で指定されたファイルには影響しません。-o
- 実装詳細: 進捗バー(tqdm)は標準エラー出力(stderr)に書き込まれ、通常のコマンド出力(stdout)や
コマンド例
1. 完全な重複を検出する場合
treepeat detect /path/to/codebase
2. 類似度 80% を閾値として、似ている箇所を検出する場合
treepeat detect --similarity 80 /path/to/codebase
3. 緩やかなルールセット(loose)を使用し、差分を表示して最小行数を 10 に設定する場合
treepeat --ruleset loose detect --diff --min-lines 10 /path/to/codebase
4. 解析の進行状況と各ステージごとの所要時間を詳細に表示する場合
treepeat detect --progress --verbose /path/to/codebase
5. CI ツール向けに SARIF 形式で結果を出力する場合
treepeat detect --format sarif -o results.sarif /path/to/codebase
その他のサブコマンド
: すべてのルールセットとその記述を一覧表示します。list-ruleset
フラグを使用すると、特定の言語に適用されるルールのみを表示できます。--language
: Treepeat がソースコードをどのように正規化して Tree-sitter トークンに変換し、類似性を検出しているかを表示します。treesitter- 元となるソースコードと、正規化されたトークンの表現を左右対比で表示します。
- 用途:特定のセクションが似ている理由を理解・デバッグする際に役立ちます。
開発環境の設定
- パフォーマンスベンチマーク: 本番リポジトリ内の
(ドキュメントあり)を使用します。tools/perf/harness.py
アーキテクチャに関する判断記録 (ADRs)
アーキテクチャに関する決定の記録は、
docs/adr ディレクトリに格納されています。