dead-code-removal について
Dead Code Removalは、未使用コードを安全に特定して削除するスキルです。コードベースを保守・整理する開発者向けに、プロジェクト構成や依存関係を調べ、バックアップ、段階的な変更、検証によって誤削除のリスクを抑えます。
主な機能
- 01言語とエントリーポイントの検出
- 02ファイル間の依存関係と参照の分析
- 03未使用のインポート、関数、クラスの検出
- 04動的な利用やフレームワークのパターンを保護
- 05バックアップと段階的な削除
- 06構文チェックとテストによる検証
活用シーン
- 01リファクタリング後の未使用コード整理
- 02リリース前のレガシーコード整理
- 03非推奨機能の削除
- 04Pythonファイルの未使用インポート確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ 89jobrien/ steve --skill dead-code-removalインストール後、Claude Code で/dead-code-removalを入力して読み込まれたか確認します。
同梱ファイルscripts/find-unused-imports.py
詳細
デッドコードの削除
このスキルは、複数のプログラミング言語にわたって未使用のコードを安全に特定し、削除します。実際には必要なコードを削除してしまわないよう、包括的な安全チェックが含まれています。
このスキルを使用する場面
- コードをリファクタリングして機能を削除した後
- バンドルサイズを削減するため、本番環境へのデプロイ前
- レガシーコードを整理するとき
- 非推奨の機能を削除するとき
- コードベースのサイズを最適化するとき
- コード品質の基準を維持するとき
このスキルでできること
- 言語の検出:プロジェクトの言語と構成を特定します
- エントリーポイントのマッピング:エントリーポイントと重要な処理経路をマッピングします
- 依存関係の分析:依存関係グラフと使用パターンを構築します
- 安全な検出:安全チェックを行いながら未使用の要素を特定します
- 段階的な削除:検証しながらコードを段階的に削除します
- バックアップの作成:変更を加える前にバックアップを作成します
ヘルパースクリプト
このスキルには、scripts/ 内に Python のヘルパースクリプトが含まれています。
-
find_unused_imports.py:AST 解析を使って Python ファイル内の未使用のインポートを正確に検出します。未使用のインポートと行番号を JSON 形式で出力します。python scripts/find_unused_imports.py src/utils.py src/services.py
使用方法
未使用コードの削除
Find and remove unused imports and functions in this project
Clean up dead code in src/ directory, but be conservative
特定の分析
Check for unused functions in src/utils/ and remove them safely
分析プロセス
1. 言語の検出
プロジェクトの種類を特定する:
- Python:
pyproject.toml、setup.py、requirements.txtを確認します - JavaScript/TypeScript:
package.json、tsconfig.jsonを確認します - Java:
pom.xml、build.gradleを確認します - Go:
go.modを確認します - Rust:
Cargo.tomlを確認します
エントリーポイントを検出する:
- Python:
main.py、__main__.py、app.py、run.py - JavaScript:
index.js、main.js、server.js、app.js - Java:
Main.java、*Application.java、*Controller.java - 設定ファイル:
*.config.*、settings.*、setup.* - テストファイル:
test_*.py、*.test.js、*.spec.js
2. 依存関係グラフの構築
ファイル間の依存関係:
- インポートと require を追跡します
- 関数やメソッドの呼び出しをマッピングします
- クラスの継承を特定します
- 動的な使用パターンを追跡します
フレームワークのパターン:
- フレームワーク固有のパターン(Django のモデル、React のコンポーネントなど)を保持します
- デコレーターとアノテーションを確認します
- エントリーポイントの登録を検証します
3. 未使用の要素の検出
ヘルパースクリプトの使用:
このスキルには、未使用のインポートを検出するための Python ヘルパースクリプトが含まれています。
# Find unused imports in Python files
python scripts/find_unused_imports.py src/utils.py src/services.py
未使用のインポート:
# Python: AST-based analysis
import ast
# Track: Import statements vs actual usage
# Skip: Dynamic imports (importlib, __import__)
// JavaScript: Module analysis
// Track: import/require vs references
// Skip: Dynamic imports, lazy loading
未使用の関数/クラス:
- 定義:宣言されているすべての関数/クラス
- 参照:直接呼び出し、継承、コールバック
- 保持:エントリーポイント、フレームワークのフック、イベントハンドラー
4. 安全チェック
次の場合は削除しない:
- Python:
getattr()、eval()、globals()の使用が検出された場合 - JavaScript:
window[]、this[]、動的なimport()の使用 - Java:リフレクション、アノテーション(
@Component、@Service) - フレームワークのパターン:モデル、コントローラー、ルート、コンポーネント
- エントリーポイント:メイン関数、アプリの初期化処理
- テストファイル:テスト関連のコードすべて
フレームワーク固有のコードの保持:
Python:
- Django:モデル、マイグレーション、管理画面への登録
- Flask:ルート、ブループリント、アプリファクトリー
- FastAPI:エンドポイント、依存関係
JavaScript:
- React:コンポーネント、フック、コンテキストプロバイダー
- Vue:コンポーネント、ディレクティブ、ミックスイン
- Angular:デコレーター、サービス、モジュール
Java:
- Spring:Bean、コントローラー、リポジトリー
- JPA:エンティティ、リポジトリー
5. 安全な削除プロセス
バックアップの作成:
backup_dir="./unused_code_backup_$(date +%Y%m%d_%H%M%S)"
cp -r . "$backup_dir" 2>/dev/null || mkdir -p "$backup_dir" && rsync -a . "$backup_dir"
段階的な削除:
- 変更を加えた一時ファイルを作成します
- 構文を検証します
- テストが利用可能な場合は実行します
- 変更を適用するか、ロールバックします
検証:
# Python
python -m py_compile file.py
python -m pytest
# JavaScript
npx eslint file.js
npm test
# Java
javac -Xlint file.java
mvn test
例
例 1:未使用のインポートを削除する
入力:src/utils/helpers.py 内の未使用のインポートを整理します
出力:
## Dead Code Removal: src/utils/helpers.py
### Analysis
- **File**: `src/utils/helpers.py`
- **Total imports**: 8
- **Unused imports**: 3
### Unused Imports Found
1. `import os` - Line 2 (not used anywhere)
2. `import json` - Line 3 (not used anywhere)
3. `from datetime import timedelta` - Line 5 (not used anywhere)
### Safe to Remove
✅ All 3 imports are safe to remove (no dynamic usage detected)
### Changes
```python
# Before
import os
import json
from datetime import datetime, timedelta
import requests
# After
from datetime import datetime
import requests
検証
- ✅ 構文チェックに合格
- ✅ テストに合格
- ✅ 動的インポートは検出されませんでした
### Example 2: Remove Unused Functions
**Input**: Find unused functions in `src/services/`
**Output**:
```markdown
## Dead Code Removal: src/services/
### Analysis
- **Files analyzed**: 12
- **Functions found**: 45
- **Unused functions**: 2
### Unused Functions
**1. `formatOldDate()` in `src/services/utils.js`**
- **Location**: Line 34-42
- **Status**: ✅ Safe to remove
- **Reason**: No references found, not exported, not used in tests
**2. `legacyAuth()` in `src/services/auth.js`**
- **Location**: Line 78-95
- **Status**: ⚠️ Preserved (framework pattern)
- **Reason**: Referenced in route configuration (line 12)
### Summary
- **Removed**: 1 function (`formatOldDate`)
- **Preserved**: 1 function (framework usage)
- **Lines removed**: 9
- **Size reduction**: ~300 bytes
ベストプラクティス
安全ガイドライン
実施すること:
- 削除するたびにテストを実行する
- フレームワークのパターンを維持する
- テンプレート内の文字列参照を確認する
- 継続的に構文を検証する
- 包括的なバックアップを作成する
- 段階的に削除する
実施しないこと:
- 目的を理解せずに削除する
- テストせずにまとめて削除する
- 動的な使用パターンを無視する
- 設定ファイルを確認しない
- マイグレーションから削除する
- エクスポートされた API/パブリック API を削除する
検出パターン
静的解析:
- 正確に検出するために AST 解析を使用する
- ファイル間の参照を追跡する
- 動的な使用パターンを確認する
- フレームワーク固有のパターンを検証する
検証:
- 必ず構文チェックを実行する
- 削除後にテストを実行する
- ビルドが引き続き正常に動作することを確認する
- 実行時エラーがないか確認する
レポート
レポートに含める内容:
- 解析したファイル(数と種類)
- 未使用として検出された項目(インポート、関数、クラス)
- 安全に削除した項目(検証状況を含む)
- 維持した項目(維持した理由)
- 影響指標(削除した行数、サイズ削減量)
関連するユースケース
- リリース前のコード整理
- バンドルサイズの削減
- 非推奨コードの削除
- コード品質の維持
- レガシーなコードベースのリファクタリング
- ビルド時間の最適化
コメント
Markdown 対応