Agent skill
dead-code-cleanup
Identify and safely remove dead code, deprecated code, and unused exports from codebase. Use when you need to clean up unused or obsolete code.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/dead-code-cleanup
SKILL.md
Dead Code Cleanup Command
Purpose
Systematically identify and remove unused code while maintaining project integrity.
Target Code:
- Unused exports/functions/classes with no references
- Deprecated code without active migration plan
- Orphaned files (no imports from anywhere)
- Unreachable code paths
Critical Constraint: Project must build and pass all tests after cleanup.
User Input
$ARGUMENTS
Interpretation:
| Input | Action |
|---|---|
| Empty | Analyze entire codebase |
Path (e.g., src/legacy/) |
Analyze specified directory |
--dry-run |
Report only, no deletions |
--auto |
Delete HIGH confidence items without confirmation |
Preservation Rules (NEVER DELETE)
Absolute Preservation
| Category | Detection Method | Examples |
|---|---|---|
| Public API | package.json exports, index.ts re-exports |
Library entry points |
| Planned Features | TODO/FIXME with ticket/issue | // TODO(#123): implement |
| Framework Conventions | Path-based (pages/, app/, api/) | Next.js routes, NestJS modules |
| Test Infrastructure | Imported by *.test.*, *.spec.* |
Fixtures, mocks, test utils |
| Dynamic Imports | import(), require() patterns |
Lazy loading, code splitting |
| Build Dependencies | Referenced in package.json scripts | Build tools, CLI scripts |
| External Contracts | GraphQL types, API schemas | Schema definitions |
Special Cases
Exported but unused internally:
- Public library → PRESERVE (external consumers unknown)
- Private app → Flag for review
Deprecated with timeline:
- Deadline NOT passed → PRESERVE
- Deadline passed + no usage → DELETE
Analysis Workflow
Phase 1: Context Gathering
1.1 Detect Project Type
# Framework detection
[ -f "next.config.js" ] && echo "Next.js"
[ -f "tsconfig.json" ] && echo "TypeScript"
[ -f "go.mod" ] && echo "Go"
1.2 Identify Package Scope
# Public library vs private app
grep '"private": false' package.json && echo "PUBLIC_LIBRARY"
1.3 Map Public API Surface
- Check
package.jsonexports field - Find
index.tsre-exports - List Go exported symbols (capital letter)
Phase 2: Dead Code Detection
2.1 Unused Exports
For each export statement:
- Search for import references across codebase
- Check dynamic import patterns
- Verify not in public API surface
2.2 Deprecated Code
grep -rn "@deprecated" --include="*.ts" --include="*.go"
grep -rn "DEPRECATED" --include="*.ts" --include="*.go"
Evaluate:
- Has migration deadline? Check if passed
- Has replacement? Check usage migrated
- No timeline? Flag for review
2.3 Orphaned Files
Files not imported anywhere:
- Exclude: entry points, config files, scripts
- Exclude: test files, type declarations
- Flag: utility files with no imports
2.4 Unreachable Code
- Code after return/throw
- Always-false conditions
- Dead switch cases
Phase 3: Validation
For each candidate:
- Cross-reference check: Search all possible import patterns
- String reference check: Filename as string (dynamic loading)
- Comment reference check: TODO/FIXME mentioning future use
- Preservation rule check: Apply rules from above
Confidence Classification:
| Level | Criteria | Action |
|---|---|---|
| HIGH | No references, not preserved, clear dead code | Auto-delete (with --auto) |
| MEDIUM | No direct refs, but string/comment mentions | Ask confirmation |
| LOW | Exported publicly, ambiguous usage | Report only |
Phase 4: Safe Deletion
4.1 Pre-Deletion
# Warn if uncommitted changes
git status --porcelain | grep -q . && echo "⚠️ Uncommitted changes exist"
4.2 Incremental Deletion
- Delete in batches (5-10 items)
- Verify after each batch
- Stop on first failure
4.3 Post-Deletion Verification
# Must pass after each batch
{build_command} # npm run build / go build ./...
{test_command} # npm test / go test ./...
{lint_command} # npm run lint / golangci-lint run
4.4 Rollback on Failure
git checkout -- {failed_files}
Output Format
Progress Updates (During Analysis)
🔍 Analyzing codebase...
**Project**: TypeScript (Next.js)
**Scope**: Entire codebase
**Mode**: Standard
---
## Context ✓
- Public API: 12 exports in src/index.ts
- Framework: Next.js (preserving pages/, app/, api/)
- Test utils: 5 shared utilities
## Detection Progress
- Scanning exports... (45/120)
- Checking deprecated markers...
Final Report
# 🧹 Dead Code Cleanup Report
**Generated**: {timestamp}
**Scope**: {analyzed_paths}
---
## 📊 Summary
| Category | Count | Lines |
| --------------- | ------- | ----------- |
| Unused Exports | {n} | {lines} |
| Deprecated Code | {n} | {lines} |
| Orphaned Files | {n} | {lines} |
| **TOTAL** | **{n}** | **{lines}** |
---
## 🔴 DELETED (HIGH Confidence)
### {file_path}:{line}
- **Type**: {function/class/variable}
- **Reason**: No references found
- **Verification**: Build ✓ Tests ✓
---
## 🟡 SKIPPED - Needs Review
### {file_path}:{line}
- **Type**: {function/class/variable}
- **Reason**: {why detected as dead}
- **Skip Reason**: {why preserved}
- **Action**: {recommended next step}
---
## 🟢 PRESERVED (Matched Rules)
### {file_path}:{line}
- **Rule**: {which preservation rule}
- **Detail**: {specifics}
---
## ⚠️ MANUAL REVIEW REQUIRED
Items requiring human decision:
1. **{file_path}:{line}**
- Detected: {what was found}
- Concern: {why uncertain}
- Suggestion: {recommended action}
---
## ✅ Verification Results
- Build: {PASS/FAIL}
- Tests: {PASS/FAIL} ({passed}/{total})
- Lint: {PASS/FAIL}
---
## 📋 Next Steps
### Immediate
- [ ] Review {n} SKIPPED items
- [ ] Investigate {n} MANUAL REVIEW items
### Recommended
- [ ] Add deprecation notices before removing LOW confidence items
- [ ] Update documentation for removed APIs
- [ ] Configure lint rules to prevent future dead code
---
## 📝 Session Summary
- Analyzed: {total_files} files, {total_lines} lines
- Deleted: {deleted_count} items ({deleted_lines} lines)
- Skipped: {skipped_count} items (see reasons above)
- Preserved: {preserved_count} items (matched rules)
Key Rules
✅ Must Do
- Run build + tests after EVERY deletion batch
- Document skip reasons for every preserved item
- Report all skipped items in final summary
- Preserve items matching preservation rules
❌ Must Not Do
- Delete without verification
- Ignore preservation rules
- Skip final report generation
- Batch too many deletions (max 10 per batch)
🛡️ Safety First
- When uncertain → SKIP and report
- When ambiguous → Ask user
- When build fails → Rollback immediately
Execution Instructions
Step 1: Parse Input
- Check for
--dry-run,--autoflags - Determine target path (default: entire codebase)
Step 2: Safety Check
git status --porcelain
- Warn if uncommitted changes exist
- Suggest: "Consider committing or stashing changes first"
Step 3: Context Gathering (Phase 1)
- Detect project type and framework
- Identify if public library
- Map public API surface
- List test infrastructure
Step 4: Detection (Phase 2)
For TypeScript/JavaScript:
# Find exports
grep -rn "export \(function\|class\|const\|interface\|type\)" src/
# For each, check imports
grep -r "import.*{.*ExportName.*}" --exclude-dir=node_modules
For Go:
# Find exported symbols
grep -rn "^func [A-Z]" --include="*.go"
grep -rn "^type [A-Z]" --include="*.go"
Step 5: Validation (Phase 3)
For each candidate:
- Run cross-reference checks
- Apply preservation rules
- Classify confidence level
Step 6: Action (Phase 4)
Based on mode:
--dry-run: Generate report only--auto: Delete HIGH confidence, report rest- Default: Ask confirmation for each deletion
Step 7: Verification
After each batch:
# Detect package manager and run
npm run build && npm test
# OR
pnpm build && pnpm test
# OR
go build ./... && go test ./...
Step 8: Final Report
Generate comprehensive report with:
- All deleted items
- All skipped items with reasons
- All preserved items with rules
- Manual review recommendations
- Verification results
CRITICAL: Always include skipped items in final report.
Example Usage
# Report only (no deletions)
/dead-code-cleanup --dry-run
# Analyze specific directory
/dead-code-cleanup src/legacy/
# Auto-delete HIGH confidence items
/dead-code-cleanup --auto
# Default: interactive mode
/dead-code-cleanup
Troubleshooting
False Positives
Symptom: Code flagged but actually needed
Check:
- Dynamic imports with variables
- Framework lifecycle methods
- External consumer usage
Build Failures
Action:
- Rollback:
git checkout -- . - Review failed item
- Add to preservation rules if legitimate
Missed Dead Code
Solutions:
- Check if matches preservation rules incorrectly
- Run with more aggressive grep patterns
- Manual verification
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?