remove-deadcode について
TypeScript プロジェクトで不要なコードを検出・削除するワークフロー用スキルです。スキャン、LSP による参照確認、並列エージェントへの作業分担を行い、エントリーポイントなどの誤判定を防ぎます。
主な機能
- 01不要コード候補の並列スキャン
- 02LSP による参照確認
- 03誤判定を避ける除外ルール
- 04ファイル単位の削除バッチ
- 05型チェック・テスト・ビルド
活用シーン
- 01TypeScript の未使用シンボルの監査
- 02確認済みの削除を複数ファイルに分担
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ code-yeongyu/ oh-my-openagent --skill remove-deadcodeインストール後、Claude Code で/remove-deadcodeを入力して読み込まれたか確認します。
詳細
並列ディープエージェントを活用してデッドコードを削除します。あなたはオーケストレーターです。スキャン、検証、バッチ分けを行ってから、すべての削除を並列エージェントに委任してください。
- **LSP が最優先です。** 削除を決定する前に、必ず `LspFindReferences(includeDeclaration=false)` で確認してください。 - **エントリーポイントは削除しないでください。** `src/index.ts`、`src/cli/index.ts`、テストファイル、設定ファイル、`packages/` は対象外です。 - **自分でコードを削除しないでください。** スキャン、検証、バッチ分けを行ってから、ディープエージェントを起動してください。作業はエージェントが行います。 デッドコードと判定してはいけないもの: - `src/index.ts` またはバレル `index.ts` で再エクスポートされているシンボル - テストファイルから参照されているシンボル(テストは有効な利用者です) - `@public` / `@api` の JSDoc タグが付いたシンボル - フックファクトリー(`createXXXHook`)、ツールファクトリー(`createXXXTool`)、`agentSources` 内のエージェント定義 - コマンドテンプレート、スキル定義、MCP 設定 - `package.json` の exports に含まれるシンボルPHASE 1: SCAN — デッドコード候補を見つける
以下をすべて並列で実行してください。
TypeScript strict モード(主要なスキャナーです。最初に実行してください):
bunx tsc --noEmit --noUnusedLocals --noUnusedParameters 2>&1
未使用のローカル変数、インポート、パラメーター、型の確定リストが、正確な file:line の位置とともに得られます。
探索エージェント(すべて同時にバックグラウンドで起動してください):
task(subagent_type="explore", run_in_background=true, load_skills=[],
description="Find orphaned files",
prompt="Find files in src/ NOT imported by any other file. Check all import statements. EXCLUDE: index.ts, *.test.ts, entry points, .md, packages/. Return: file paths.")
task(subagent_type="explore", run_in_background=true, load_skills=[],
description="Find unused exported symbols",
prompt="Find exported functions/types/constants in src/ that are never imported by other files. Cross-reference: for each export, grep the symbol name across src/ — if it only appears in its own file, it's a candidate. EXCLUDE: src/index.ts exports, test files. Return: file path, line, symbol name, export type.")
すべての結果を候補のマスターリストにまとめてください。
PHASE 2: VERIFY — LSP による確認(誤検出ゼロ)
フェーズ 1 の各候補について:
LspFindReferences(filePath, line, character, includeDeclaration=false)
// 0 references → CONFIRMED dead
// 1+ references → NOT dead, drop from list
また、上記の誤検出防止策も適用してください。確認済みリストを作成します。
| # | File | Symbol | Type | Action |
|---|------|--------|------|--------|
| 1 | src/foo.ts:42 | unusedFunc | function | REMOVE |
| 2 | src/bar.ts:10 | OldType | type | REMOVE |
| 3 | src/baz.ts:7 | ctx | parameter | PREFIX _ |
アクションの種類:
REMOVE— シンボル/インポート/ファイル全体を削除するPREFIX _— シグネチャ上必要だが未使用の関数パラメーター →_paramNameに名前を変更する
確認済みの候補がゼロの場合は、「デッドコードは見つかりませんでした」と報告して終了してください。
PHASE 3: BATCH — ファイルごとに競合なく並列化できるようグループ化する
目標:Git の競合をゼロにして、並列エージェントの数を最大化します。
- 確認済みのデッドコード項目をファイルパスごとにグループ化します
- 同じファイル内の項目はすべて同じバッチに割り当てます(2 つのエージェントが同じファイルを編集するのを防ぎます)
- デッドファイル(ファイル全体の削除)がある場合は、独立したバッチにします
- バッチ数は 5~15 を目標にします。合計項目数が 5 未満の場合は、項目ごとに 1 バッチを使用します。
バッチ分けの例:
Batch A: [src/hooks/foo/hook.ts — 3 unused imports]
Batch B: [src/features/bar/manager.ts — 2 unused constants, 1 dead function]
Batch C: [src/tools/baz/tool.ts — 1 unused param, src/tools/baz/types.ts — 1 unused type]
Batch D: [src/dead-file.ts — entire file deletion]
同じディレクトリ内のファイルはまとめてバッチにできます(2 つのエージェントが同じファイルを編集しない限り、競合は発生しません)。並列化のため、バッチ数を最大化してください。
PHASE 4: EXECUTE — 並列ディープエージェントを起動する
各バッチについて、ディープエージェントを起動してください。
task(
category="deep-low",
load_skills=["typescript-programmer", "git-master"],
run_in_background=true,
description="Remove dead code batch N: [brief description]",
prompt="[see template below]"
)
各ディープエージェントには、以下のプロンプト構成を渡します(バッチごとに内容を埋めてください)。
## TASK: Remove dead code from [file list]
## DEAD CODE TO REMOVE
### [file path] line [N]
- Symbol: `[name]` — [type: unused import / unused constant / unused function / unused parameter / dead file]
- Action: [REMOVE entirely / REMOVE from import list / PREFIX with _]
### [file path] line [N]
- ...
## PROTOCOL
1. Read each file to understand exact syntax at the target lines
2. For each symbol, run LspFindReferences to RE-VERIFY it's still dead (another agent may have changed things)
3. Apply the change:
- Unused import (only symbol in line): remove entire import line
- Unused import (one of many): remove only that symbol from the import list
- Unused constant/function/type: remove the declaration. Clean up trailing blank lines.
- Unused parameter: prefix with `_` (do NOT remove — required by signature)
- Dead file: delete with `rm`
4. After ALL edits in this batch, run: `bun run typecheck`
5. If typecheck fails: `git checkout -- [files]` and report failure
6. If typecheck passes: stage ONLY your files and commit:
`git add [your-specific-files] && git commit -m "refactor: remove dead code from [brief file list]"`
7. Report what you removed and the commit hash
## CRITICAL
- Stage ONLY your batch's files (`git add [specific files]`). NEVER `git add -A` — other agents are working in parallel.
- If typecheck fails after your edits, REVERT all changes and report. Do not attempt to fix.
- Pre-existing test failures in other files are expected. Only typecheck matters for your batch.
すべてのバッチを同時に起動し、すべての完了を待ってください。
PHASE 5: FINAL VERIFICATION
すべてのエージェントが完了した後:
bun run typecheck # must pass
bun test # note any NEW failures vs pre-existing
bun run build # must pass
概要を作成してください。
## Dead Code Removal Complete
### Removed
| # | Symbol | File | Type | Commit | Agent |
|---|--------|------|------|--------|-------|
| 1 | unusedFunc | src/foo.ts | function | abc1234 | Batch A |
### Skipped (agent reported failure)
| # | Symbol | File | Reason |
|---|--------|------|--------|
### Verification
- Typecheck: PASS/FAIL
- Tests: X passing, Y failing (Z pre-existing)
- Build: PASS/FAIL
- Total removed: N symbols across M files
- Total commits: K atomic commits
- Parallel agents used: P
SCOPE CONTROL
$ARGUMENTS が指定されている場合は、スキャン範囲を絞ります。
- ファイルパス → そのファイルのみ
- ディレクトリ → そのディレクトリのみ
- シンボル名 → そのシンボルのみ
allまたは空 → プロジェクト全体をスキャン(デフォルト)
ABORT CONDITIONS
以下の場合は停止して報告してください。
- 候補が 50 件を超える(ユーザーに範囲を絞るか、続行を確認するよう依頼します)
- ビルドが失敗し、元に戻しても修正できない