mcpField
D
dead-code-detector

dead-code-detector

github.com/terrylicaテスト・品質2149 回インストール1 日前に更新
リポジトリ

dead-code-detector について

Python、TypeScript、Rustのプロジェクトで未使用コードを検出・削除するコーディングスキルです。言語別の解析ツールに加え、誤検出への対応と削除前の検証方法を示します。

主な機能

  1. 01vultureによるPython解析
  2. 02knipによるTypeScript解析
  3. 03Rust lintによる検出
  4. 04誤検出への対処ガイド
  5. 05削除前の検出結果検証

活用シーン

  1. 01リリース前のコード整理
  2. 02リファクタリングの保守負担軽減
  3. 03バンドルサイズやコンパイル時間の調査
  4. 04オンボーディング時のコード把握

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/terrylica/cc-skills --skill dead-code-detector

インストール後、Claude Code で/dead-code-detectorを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
evolution-log.md
python-workflow.md
rust-workflow.md
typescript-workflow.md

詳細

デッドコード検出ツール

Python、TypeScript、Rust のコードベース全体で未使用のコードを見つけて削除します。

自己進化型スキル:このスキルは使用を通じて改善されます。指示に誤りがある場合、パラメーターがずれている場合、または回避策が必要になった場合は、先延ばしにせず、このファイルをすぐに修正してください。実際に再現可能な問題がある場合のみ更新してください。

言語別ツール

言語ツール検出対象
Pythonvulture v2.14+未使用のインポート、関数、クラス、変数
TypeScriptknip v5.0+未使用のエクスポート、依存関係、ファイル
Rustcargo clippy + rustc の lint未使用の関数、インポート、dead_code 警告

これらのツールを使う理由

  • vulture:AST ベースで、信頼度スコア(60~100%)とホワイトリストに対応
  • knip:ts-prune の後継(メンテナンスモード)、モノレポを認識、自動修正に対応
  • cargo clippy:Rust ツールチェーンに組み込み済みで、追加の依存関係は不要

このスキルを使うタイミング

次のような場合にこのスキルを使います。

  • リリース前にコードベースを整理する
  • メンテナンスの負担を減らすためにリファクタリングする
  • バンドルサイズやコンパイル時間の問題を調査する
  • 実際に使われているコードを把握するためにプロジェクトに参加する

対象外:コードの重複(quality-tools:code-clone-assistant を使ってください)


クイックスタートのワークフロー

Python(vulture)
# Step 1: Install
uv pip install vulture

# Step 2: Scan with 80% confidence threshold
vulture src/ --min-confidence 80

# Step 3: Generate whitelist for false positives
vulture src/ --make-whitelist > vulture_whitelist.py

# Step 4: Re-scan with whitelist
vulture src/ vulture_whitelist.py --min-confidence 80
TypeScript(knip)
# Step 1: Install (project-local recommended)
bun add -d knip

# Step 2: Initialize config
bunx knip --init

# Step 3: Scan for dead code
bunx knip

# Step 4: Auto-fix (removes unused exports)
bunx knip --fix
Rust(cargo clippy)
# Step 1: Scan for dead code warnings
cargo clippy -- -W dead_code -W unused_imports -W unused_variables

# Step 2: For stricter enforcement
cargo clippy -- -D dead_code  # Deny (error) instead of warn

# Step 3: Auto-fix what's possible
cargo clippy --fix --allow-dirty

信頼度と誤検出

Python(vulture)
信頼度意味対応
100%解析対象ファイル内で未使用であることが確実安全に削除できます
80-99%未使用である可能性が非常に高い削除前に確認してください
60-79%未使用の可能性あり(動的呼び出し、フレームワーク)意図的な場合はホワイトリストに追加してください

よくある誤検出(フレームワークから呼び出されるコード):

  • ルートハンドラー/コントローラーメソッド(Web フレームワークから呼び出される)
  • テストフィクスチャとセットアップ用ユーティリティ(テストランナーから呼び出される)
  • パブリック API のエクスポート(利用側向けに再エクスポートされる)
  • バックグラウンドジョブのハンドラー(タスクキュー/スケジューラーから呼び出される)
  • イベントリスナー/フック(イベントシステムから呼び出される)
  • シリアライズのコールバック(エンコード/デコード時に呼び出される)
TypeScript(knip)

Knip は、精度を高めるために TypeScript の型システムを使用します。knip.json で設定します。

{
  "entry": ["src/index.ts"],
  "project": ["src/**/*.ts"],
  "ignore": ["**/*.test.ts"],
  "ignoreDependencies": ["@types/*"]
}
Rust

属性を使って誤検出を抑制します。

#[allow(dead_code)]  // Single item
fn intentionally_unused() {}

// Or module-wide
#![allow(dead_code)]

CI との統合

Python(pyproject.toml)
[tool.vulture]
min_confidence = 80
paths = ["src"]
exclude = ["*_test.py", "conftest.py"]
TypeScript(package.json)
{
  "scripts": {
    "dead-code": "knip",
    "dead-code:fix": "knip --fix"
  }
}
Rust(Cargo.toml)
[lints.rust]
dead_code = "warn"
unused_imports = "warn"

リファレンスドキュメント

詳しい情報については、次を参照してください。


トラブルシューティング

問題原因解決策
フレームワークから呼び出されたコードが報告されるフレームワークのマジック/コールバックホワイトリストまたは除外設定に追加
動的に読み込まれるコードが検出されない静的なエントリーポイントに含まれていないプラグイン/拡張機能のディレクトリを含めるよう、エントリーポイントを設定する
テスト専用のヘルパーに警告が出るテストコードが別途コンパイルされる条件付きコンパイルまたはテスト専用の除外を使用する
誤検知が多すぎるしきい値が低すぎる信頼度のしきい値を上げるか、無視パターンを設定する
型のみの参照が見つからないコンパイル時にのみ使用される最新のツールの多くは対応しています。ツールのバージョンを確認してください

複数の視点による検証(重要)

重要:検出された「デッドコード」を削除する前に、複数の視点から調査結果を検証するため、並行してサブエージェントを起動してください。デッドコードは、実際には未実装の機能や不完全な統合である可能性があります。

分類マトリックス
検出タイプ本当のデッドコード未実装の機能不完全な統合
未使用の呼び出し可能要素呼び出し元、テスト、ドキュメントがないTODO/FIXMEがある、仕様書で参照されている呼び出しチェーンが一部存在する
未使用のエクスポート/公開要素どこからもインポートされていない公開APIに含まれ、ドキュメント化されている同階層のモジュールで使用されている
未使用のインポート/インクルードタイポ、リファクタリングで不要になった副作用のために必要型のみ、またはコンパイル時のみ
未使用のバインディング代入されているが、一度も読み取られない将来のためのプレースホルダーデバッグ/計測機能が削除された
検証ワークフロー

検出ツールの実行後、次の並行サブエージェントを起動してください:

┌─────────────────────────────────────────────────────────────────┐
│                    Dead Code Findings                           │
└─────────────────────────────────────────────────────────────────┘
                              │
          ┌───────────────────┼───────────────────┐
          ▼                   ▼                   ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Intent Agent    │ │ Integration     │ │ History Agent   │
│                 │ │ Agent           │ │                 │
│ - Check TODOs   │ │ - Trace call    │ │ - Git blame     │
│ - Search specs  │ │   chains        │ │ - Commit msgs   │
│ - Find issues   │ │ - Check exports │ │ - PR context    │
│ - Read ADRs     │ │ - Test coverage │ │ - Author intent │
└─────────────────┘ └─────────────────┘ └─────────────────┘
          │                   │                   │
          └───────────────────┼───────────────────┘
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│              AskUserQuestion: Confirm Classification            │
│  [ ] True dead code - safe to remove                            │
│  [ ] Unimplemented - create GitHub Issue to track               │
│  [ ] Incomplete - investigate integration gaps                  │
│  [ ] False positive - add to whitelist                          │
└─────────────────────────────────────────────────────────────────┘
エージェントへのプロンプト

意図エージェント(予定されている使用箇所を検索):

Search for references to [IDENTIFIER] in:
1. TODO/FIXME/HACK comments in codebase
2. Issue tracker (open and closed issues)
3. Design documents and architecture decision records
4. README and project documentation files
Report: Was this code planned but not yet integrated?

統合エージェント(実行パスをたどる):

For [IDENTIFIER], analyze:
1. All module import/include/use statements
2. Runtime module loading mechanisms (lazy loading, plugins)
3. Framework-invoked patterns (metadata attributes, config bindings, annotations)
4. Test files that may exercise this code path
Report: Is there a partial or indirect call chain?

履歴エージェント(由来を調査):

For [IDENTIFIER], check:
1. VCS blame/annotate - who wrote it and when
2. Commit message - what was the stated intent
3. Code review / merge request context - was it part of larger feature
4. Recent commits - was calling code removed or refactored
Report: Was this intentionally orphaned or accidentally broken?
例:検出結果の検証
# Step 1: Run detection tool for your language
<tool> <source-path> --confidence-threshold 80 > findings.txt

# Step 2: For each high-confidence finding, spawn validation
# (Claude Code will use Task tool with Explore agents)

検出結果の例:unused function 'calculate_metrics' (src/analytics.py:45)

複数エージェントによる調査結果:

  • 意図エージェント:src/dashboard.py:12に「ここでcalculate_metricsを統合する」というTODOを発見
  • 統合エージェント:関数はtests/test_analytics.pyでインポートされていますが、テストはskip/pendingとしてマークされています
  • 履歴エージェント:MR #234「分析機能の基盤を追加」で追加され、ダッシュボードとの統合は保留されています

結論:デッドコードではありません。未実装の機能です。追跡用のIssueを作成してください。

ユーザー確認フロー

エージェントによる分析後、multiSelect: trueを指定してAskUserQuestionを使用します:

AskUserQuestion({
  questions: [
    {
      question: "How should we handle these findings?",
      header: "Action",
      multiSelect: true,
      options: [
        {
          label: "Remove confirmed dead code",
          description: "Delete items verified as truly unused",
        },
        {
          label: "Create issues for unimplemented",
          description: "Track planned features in GitHub Issues",
        },
        {
          label: "Investigate incomplete integrations",
          description: "Spawn deeper analysis for partial implementations",
        },
        {
          label: "Update whitelist",
          description: "Add false positives to tool whitelist",
        },
      ],
    },
  ],
});
リスク分類
リスクレベル基準対応
低信頼度100%、どこにも参照がなく、6か月以上前のコードVCSコミットとともに自動削除
中信頼度80~99%、間接参照が一部あるまずエージェントで検証する
高信頼度80%未満、最近のコード、テストカバレッジがある手動レビューが必要
重大公開APIの表面、ドキュメント化されている、外部の依存先がある自動削除は絶対に行わない

参考資料

実行後の振り返り

このスキルの実行後、終了する前に以下を確認してください。

  1. コマンドは成功しましたか? — 成功しなかった場合は、原因となった指示またはエラーテーブルを修正してください。
  2. パラメーターや出力に変更はありましたか? — 基盤となるツールのインターフェースに変更があった場合は、使用例とパラメーターテーブルを合わせて更新してください。
  3. 回避策が必要でしたか? — 異なるフラグや追加手順などの工夫が必要だった場合は、次回同じ回避策が不要になるよう、この SKILL.md を更新してください。

問題が実際に発生し、再現可能な場合に限り更新してください。推測に基づいて更新しないでください。

コメント