mcpField
F
finding-duplicate-functions

finding-duplicate-functions

github.com/obraテスト・品質434637 回インストール21 週間前に更新
リポジトリ

finding-duplicate-functions について

意図は同じでも実装が異なる関数を見つけるスキルです。関数の抽出、領域別分類、LLMによる分析を組み合わせ、リファクタリング前の統合候補の特定を支援します。

主な機能

  1. 01テストを既定で除外して関数一覧を抽出
  2. 02関数を領域別に分類
  3. 03グループ単位で意味的な重複を分析
  4. 04確信度順のレポートを生成
  5. 05人による確認と後続テストを支援

活用シーン

  1. 01リファクタリング前のユーティリティ重複調査
  2. 02jscpdで見つからない意味的重複の検出
  3. 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.md
extract-functions.sh
find-duplicates-prompt.md
generate-report.sh
prepare-category-analysis.sh

詳細

意図が重複する関数の検出

概要

LLM が生成したコードベースでは、意味的な重複が蓄積します。同じ目的を果たす関数が、個別に実装されたものです。従来のコピー&ペースト検出ツール(jscpd)は構文上の重複を検出しますが、「実装は異なるが意図は同じ」ものは見逃します。

このスキルでは、従来の抽出に続いて LLM を活用した意図のクラスタリングを行う、2 段階のアプローチを使用します。

使用するタイミング

  • 人間または LLM の複数のコントリビューターによって、コードベースが徐々に拡大している場合
  • ユーティリティ関数が複数回実装されている疑いがある場合
  • 統合できる箇所を特定するため、大規模なリファクタリングの前
  • jscpd の実行後で、構文上の重複への対処が済んでいる場合

クイックリファレンス

フェーズツールモデル出力
1. 抽出scripts/extract-functions.sh-catalog.json
2. 分類scripts/categorize-prompt.mdhaikucategorized.json
3. 分割scripts/prepare-category-analysis.sh-categories/*.json
4. 検出scripts/find-duplicates-prompt.mdopusduplicates/*.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 の重複については、以下を行います。

  1. 推奨された残す関数にテストがあることを確認します
  2. 呼び出し元を更新して、残す関数を使用するようにします
  3. 重複する関数を削除します
  4. テストを実行します

重複リスクの高い領域

まずは以下の領域を優先して抽出します。重複が最も速く蓄積する領域です。

領域よくある重複
utils/、helpers/、lib/一般的なユーティリティの再実装
バリデーションコード同じチェックを複数の方法で記述
エラーのフォーマットエラーから文字列への変換
パス操作パスの結合、解決、正規化
文字列のフォーマット大文字・小文字の変換、切り詰め、エスケープ
日付のフォーマット同じフォーマットの繰り返し実装
API レスポンスの整形異なるエンドポイント向けの類似した変換

よくある間違い

抽出しすぎる:エクスポートされた関数とパブリックメソッドに絞ります。内部ヘルパーがファイル間で重複する可能性は低くなります。

分類のステップを省略する:カタログ全体を対象に、いきなり重複検出を行うとノイズが増えます。カテゴリによって比較対象を絞り込めます。

重複検出に haiku を使う:haiku は分類にはコスト効率が良い一方で、微妙な意味上の重複を見逃します。実際の重複分析には Opus を使用してください。

テストなしで統合する:重複を削除する前に、残す関数に、削除する関数のすべてのユースケースをカバーするテストがあることを確認してください。

コメント