finding-duplicate-functions について
意図は同じでも実装が異なる関数を見つけるスキルです。関数の抽出、領域別分類、LLMによる分析を組み合わせ、リファクタリング前の統合候補の特定を支援します。
主な機能
- 01テストを既定で除外して関数一覧を抽出
- 02関数を領域別に分類
- 03グループ単位で意味的な重複を分析
- 04確信度順のレポートを生成
- 05人による確認と後続テストを支援
活用シーン
- 01リファクタリング前のユーティリティ重複調査
- 02jscpdで見つからない意味的重複の検出
- 03複数の開発者やLLMが関わったコードベースの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ obra/ superpowers-lab --skill finding-duplicate-functionsインストール後、Claude Code で/finding-duplicate-functionsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/categorize-prompt.mdextract-functions.shfind-duplicates-prompt.mdgenerate-report.shprepare-category-analysis.sh詳細
意図が重複する関数の検出
概要
LLM が生成したコードベースでは、意味的な重複が蓄積します。同じ目的を果たす関数が、個別に実装されたものです。従来のコピー&ペースト検出ツール(jscpd)は構文上の重複を検出しますが、「実装は異なるが意図は同じ」ものは見逃します。
このスキルでは、従来の抽出に続いて LLM を活用した意図のクラスタリングを行う、2 段階のアプローチを使用します。
使用するタイミング
- 人間または LLM の複数のコントリビューターによって、コードベースが徐々に拡大している場合
- ユーティリティ関数が複数回実装されている疑いがある場合
- 統合できる箇所を特定するため、大規模なリファクタリングの前
- jscpd の実行後で、構文上の重複への対処が済んでいる場合
クイックリファレンス
| フェーズ | ツール | モデル | 出力 |
|---|---|---|---|
| 1. 抽出 | scripts/extract-functions.sh | - | catalog.json |
| 2. 分類 | scripts/categorize-prompt.md | haiku | categorized.json |
| 3. 分割 | scripts/prepare-category-analysis.sh | - | categories/*.json |
| 4. 検出 | scripts/find-duplicates-prompt.md | opus | duplicates/*.json |
| 5. レポート | scripts/generate-report.sh | - | report.md |
プロセス
digraph duplicate_detection {
rankdir=TB;
node [shape=box];
extract [label="1. Extract function catalog\n./scripts/extract-functions.sh"];
categorize [label="2. Categorize by domain\n(haiku subagent)"];
split [label="3. Split into categories\n./scripts/prepare-category-analysis.sh"];
detect [label="4. Find duplicates per category\n(opus subagent per category)"];
report [label="5. Generate report\n./scripts/generate-report.sh"];
review [label="6. Human review & consolidate"];
extract -> categorize -> split -> detect -> report -> review;
}
フェーズ 1: 関数カタログの抽出
./scripts/extract-functions.sh src/ -o catalog.json
オプション:
-o FILE:出力ファイル(デフォルト:標準出力)-c N:取得するコンテキストの行数(デフォルト:15)-t GLOB:ファイルの種類(デフォルト:*.ts,*.tsx,*.js,*.jsx)--include-tests:テストファイルを含めます(デフォルトでは除外)
テストファイル(*.test.*、*.spec.*、__tests__/**)は、テスト用ユーティリティが統合候補になる可能性は低いため、デフォルトでは除外されます。
フェーズ 2: ドメイン別の分類
scripts/categorize-prompt.md のプロンプトを使用して、haiku サブエージェントを実行します。
プロンプトテンプレートで指定されている箇所に catalog.json の内容を挿入します。出力を categorized.json として保存します。
フェーズ 3: カテゴリ別に分割
./scripts/prepare-category-analysis.sh categorized.json ./categories
カテゴリごとに JSON ファイルを 1 つ作成します。分析する価値があるのは、関数が 3 つ以上あるカテゴリのみです。
フェーズ 4: 重複の検出(カテゴリごと)
./categories/ 内の各カテゴリファイルについて、scripts/find-duplicates-prompt.md のプロンプトを使用して、opus サブエージェントを実行します。
各出力を ./duplicates/{category}.json として保存します。
フェーズ 5: レポートの生成
./scripts/generate-report.sh ./duplicates ./duplicates-report.md
確信度別にまとめた、優先順位付きの Markdown レポートを生成します。
フェーズ 6: 人によるレビュー
レポートを確認します。確信度が HIGH の重複については、以下を行います。
- 推奨された残す関数にテストがあることを確認します
- 呼び出し元を更新して、残す関数を使用するようにします
- 重複する関数を削除します
- テストを実行します
重複リスクの高い領域
まずは以下の領域を優先して抽出します。重複が最も速く蓄積する領域です。
| 領域 | よくある重複 |
|---|---|
utils/、helpers/、lib/ | 一般的なユーティリティの再実装 |
| バリデーションコード | 同じチェックを複数の方法で記述 |
| エラーのフォーマット | エラーから文字列への変換 |
| パス操作 | パスの結合、解決、正規化 |
| 文字列のフォーマット | 大文字・小文字の変換、切り詰め、エスケープ |
| 日付のフォーマット | 同じフォーマットの繰り返し実装 |
| API レスポンスの整形 | 異なるエンドポイント向けの類似した変換 |
よくある間違い
抽出しすぎる:エクスポートされた関数とパブリックメソッドに絞ります。内部ヘルパーがファイル間で重複する可能性は低くなります。
分類のステップを省略する:カタログ全体を対象に、いきなり重複検出を行うとノイズが増えます。カテゴリによって比較対象を絞り込めます。
重複検出に haiku を使う:haiku は分類にはコスト効率が良い一方で、微妙な意味上の重複を見逃します。実際の重複分析には Opus を使用してください。
テストなしで統合する:重複を削除する前に、残す関数に、削除する関数のすべてのユースケースをカバーするテストがあることを確認してください。