Doppelgangers — 重複PR/Issue可視化ツール
概要
Doppelgangersは、GitHub上のIssueやプルリクエスト(PR)を取得してテキスト埋め込みを作成し、UMAPで2次元/3次元に投影して類似性に基づくクラスタを視覚化する小さなツール群です。似た内容のIssueやPRが近くにプロットされるため、手作業によるトリアージが楽になり、クラスター内の重複をまとめて開いて閉じるといった作業でリポジトリのスラッジ(冗長・重複)を削減できます。プロトタイプとして「sloppy tools for sloppy times」と表現されるように、実用的なワークフローを手早く実現することを目的としています。
リポジトリの統計情報
- スター数: 11
- フォーク数: 2
- ウォッチャー数: 11
- コミット数: 9
- ファイル数: 8
- メインの言語: TypeScript
主な特徴
- GitHubのIssue/PRを取得して埋め込みを生成し可視化するワークフロー
- UMAPによる2D/3D投影で類似アイテムを直感的にクラスタ表示
- クラスタ単位での選択・一括操作(開く/閉じる等)によるトリアージ支援
- プロトタイプ寄りの軽量実装で実験・カスタマイズが容易
技術的なポイント
Doppelgangersはテキスト埋め込みと次元削減を組み合わせた「類似検出+可視化」アプローチが核です。ワークフローは大まかに次の段階に分かれます:GitHub APIで対象リポジトリのIssue/PRをフェッチ → 各テキスト(タイトル+本文等)から埋め込みを生成 → 埋め込みベクトル群に対してUMAPで次元削減(2D/3D) → 可視化・インタラクション(クラスタ選択、複数開閉など)。埋め込み生成はREADMEやデモの示唆から外部埋め込みサービス(OpenAI等)やローカルモデルのどちらでも実装可能で、抽出するテキストの前処理(ノイズ除去、正規化、メタ情報の付加)が最終的な類似性判定に影響します。
UMAPを選ぶ利点は、大規模データでも局所構造を保ったまま低次元に投影できる点で、視覚的に「似たものが近くにまとまる」ことを期待できます。可視化部分はWebベースのインタラクティブUI(TypeScript実装)で実装される想定で、点選択やバウンディングによるグルーピング、選択クラスタの一括API操作(例: 対象PRをまとめて開いて検証、重複を閉じるなど)をサポートします。
実運用上の考慮点として、GitHub APIのレート制限、埋め込み生成にかかるコスト・遅延、誤検出(類似だが重複でないケース)に対するヒューマンインザループな確認プロセスが重要です。またスケーラビリティの観点からは大量のIssue/PRを扱う場合のバッチ処理、近傍検索(faiss等)との連携、クラスタ閾値の調整やメタデータ(ラベル、作者、作成日時)を使ったフィルタリングが有効です。プロトタイプ性を活かし、カスタム埋め込みや閾値チューニング、UIでのカスタム操作を追加することで実用度を高められます。
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- .husky: dir
- README.md: file
- biome.json: file
- package-lock.json: file
その他のファイル(計8ファイル中の残り)にはTypeScriptソースや設定、簡易のフロントエンド/ビルド関連ファイルが含まれている想定です。全体として軽量な構成で、実験・拡張を容易にする設計が伺えます。
まとめ
視覚化で重複PR/Issueの発見と一括整理を手早く行える実験的ツール。
リポジトリ情報:
- 名前: doppelgangers
- 説明: Find duplicate PRs through embedding visualization
- スター数: 11
- 言語: TypeScript
- URL: https://github.com/badlogic/doppelgangers
- オーナー: badlogic
- アバター: https://avatars.githubusercontent.com/u/514052?v=4
READMEの抜粋:
Doppelgangers
Sloppy tools for sloppy times.
https://github.com/user-attachments/assets/60212797-8caa-4a8c-aa6b-a39cf86bed99
Explore all the slop issues and PRs of your GitHub repos visually. Triage them manually or give clusters to your clanker to clean things up.
Fetches issues/PRs, generates embeddings, projects them to 2D/3D via UMAP. Similar items cluster together. Select a cluster, open all, close the dupes.
Demos: openai/codex | [ss…