dead-code-detector

Find and remove unused code across Python, TypeScript, and Rust codebases.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "dead-code-detector" with this command: npx skills add terrylica/cc-skills/terrylica-cc-skills-dead-code-detector

Dead Code Detector

Find and remove unused code across Python, TypeScript, and Rust codebases.

Tools by Language

Language Tool Detects

Python vulture v2.14+ Unused imports, functions, classes, variables

TypeScript knip v5.0+ Unused exports, dependencies, files

Rust cargo clippy

  • rustc lints Unused functions, imports, dead_code warnings

Why these tools?

  • vulture: AST-based, confidence scoring (60-100%), whitelist support

  • knip: Successor to ts-prune (maintenance mode), monorepo-aware, auto-fix

  • cargo clippy: Built-in to Rust toolchain, zero additional deps

When to Use This Skill

Use this skill when:

  • Cleaning up a codebase before release

  • Refactoring to reduce maintenance burden

  • Investigating bundle size / compile time issues

  • Onboarding to understand what code is actually used

NOT for: Code duplication (use quality-tools:code-clone-assistant )

Quick Start Workflow

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

Confidence and False Positives

Python (vulture)

Confidence Meaning Action

100% Guaranteed unused in analyzed files Safe to remove

80-99% Very likely unused Review before removing

60-79% Possibly unused (dynamic calls, frameworks) Add to whitelist if intentional

Common false positives (framework-invoked code):

  • Route handlers / controller methods (invoked by web frameworks)

  • Test fixtures and setup utilities (invoked by test runners)

  • Public API surface exports (re-exported for consumers)

  • Background job handlers (invoked by task queues / schedulers)

  • Event listeners / hooks (invoked by event systems)

  • Serialization callbacks (invoked during encode/decode)

TypeScript (knip)

Knip uses TypeScript's type system for accuracy. Configure in knip.json :

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

Rust

Suppress false positives with attributes:

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

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

Integration with 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"

Reference Documentation

For detailed information, see:

  • Python Workflow - vulture advanced usage

  • TypeScript Workflow - knip configuration

  • Rust Workflow - clippy lint categories

Troubleshooting

Issue Cause Solution

Reports framework-invoked code Framework magic / callbacks Add to whitelist or exclusion config

Misses dynamically loaded code Not in static entry points Configure entry points to include plugin/extension directories

Warns about test-only helpers Test code compiled separately Use conditional compilation or test-specific exclusions

Too many false positives Threshold too low Increase confidence threshold or configure ignore patterns

Missing type-only references Compile-time only usage Most modern tools handle this; check tool version

Multi-Perspective Validation (Critical)

IMPORTANT: Before removing any detected "dead code", spawn parallel subagents to validate findings from multiple perspectives. Dead code may actually be unimplemented features or incomplete integrations.

Classification Matrix

Finding Type True Dead Code Unimplemented Feature Incomplete Integration

Unused callable No callers, no tests, no docs Has TODO/FIXME, referenced in specs Partial call chain exists

Unused export/public Not imported anywhere In public API, documented Used in sibling module

Unused import/include Typo, refactored away Needed for side effects Type-only or compile-time

Unused binding Assigned but never read Placeholder for future Debug/instrumentation removed

Validation Workflow

After running detection tools, spawn these parallel subagents:

┌─────────────────────────────────────────────────────────────────┐ │ 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 │ └─────────────────────────────────────────────────────────────────┘

Agent Prompts

Intent Agent (searches for planned usage):

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?

Integration Agent (traces execution paths):

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?

History Agent (investigates provenance):

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?

Example: Validating Findings

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)

Sample finding: unused function 'calculate_metrics' (src/analytics.py:45)

Multi-agent investigation results:

  • Intent Agent: "Found TODO in src/dashboard.py:12 - 'integrate calculate_metrics here'"

  • Integration Agent: "Function is imported in tests/test_analytics.py but test is marked skip/pending"

  • History Agent: "Added in MR #234 'Add analytics foundation' - dashboard integration deferred"

Conclusion: NOT dead code - it's an unimplemented feature. Create tracking issue.

User Confirmation Flow

After agent analysis, use AskUserQuestion with multiSelect: true :

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", }, ], }, ], });

Risk Classification

Risk Level Criteria Action

Low 100% confidence, no references anywhere, >6 months old Auto-remove with VCS commit

Medium 80-99% confidence, some indirect references Validate with agents first

High <80% confidence, recent code, has test coverage Manual review required

Critical Public API surface, documented, has external dependents NEVER auto-remove

Sources

  • vulture GitHub

  • knip documentation

  • Effective TypeScript: Use knip

  • Rust dead_code lint

  • DCE-LLM research paper (emerging LLM-based approach)

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

python-logging-best-practices

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

clickhouse-architect

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

mlflow-python

No summary provided by upstream source.

Repository SourceNeeds Review