Skip to main content

A static analysis tool for identifying dead code in a codebase. It provides Python API and CLI for use by agents.

Project description

graphlint

PyPI Python License

en zh

Dead code detection for AI-generated Python codebases.

AI agents generate code rapidly, leaving behind dead and redundant code that pollutes the LLM's context window and dilutes attention. Graphlint analyzes your Python codebase's dependency graph to identify entry points and detect dead code — components unreachable from any entry point — so agents can self-clean and keep the codebase lean.

Features

  • Dead code detection — finds components unreachable from any entry point via graph traversal
  • AST parsing — extracts classes, functions, methods, variables, and fields
  • Dependency graph — builds directed edges: read, write, call, inherit, decorate
  • Entry point detection — 10 built-in rules (main, FastAPI, Flask, Django, Click, Typer, Celery, pytest, plus package and test entries) and custom rules
  • Warning detection — 11 warning types including circular references, unused imports, write-only variables, and more
  • Python API + CLI — integrate into any Tool, CI pipeline, or let agents self-analyze and self-clean

Installation

pip install graphlint

Requirements: Python >= 3.9

Quick Start

Agent Integration

Graphlint provides a command to inject its usage prompt into your AI coding tools at the global level, so every project automatically has graphlint's guidance:

# Install graphlint prompt into agent tools (opencode, cursor, codex, cc)
graphlint install

# Copy the prompt to clipboard for manual paste into your agent
graphlint prompt

# Remove graphlint prompt from agent tools
graphlint uninstall

Run graphlint install and select the tools you use — the prompt (usage scenarios, essential commands, and parameters) will be added to their global configuration. For details, see Agent Integration.

CLI

# Find dead code in current directory
graphlint query --warn-types "dead_code"

# Full analysis with JSON output
graphlint query --json

# View a specific graph detail
graphlint query -g 1 --detail full

# Exit non-zero when dead code or circular refs found (for CI)
graphlint query --json --fail-on dead_code,circular_ref

# Rebuild index
graphlint build --force

# Configure
graphlint config show
graphlint config set --key lang --value en

Exit Codes

Code Meaning
0 Success — no warnings matched --fail-on
1 Error — invalid parameters, exception, or config error
2 Warnings found — --fail-on matched specified warning types

Use --fail-on with a comma-separated list of warning types to make graphlint query return exit code 2 when matching warnings are found. This enables CI pipeline integration without blocking on non-critical warnings.

Python API

from graphlint.api import query

# Find dead code components
result = query(warn_types="dead_code", json_output=True)

# Full dependency graph analysis
result = query(include_tests=True, json_output=True)

Warning Types

Warning Description
unused_import Imported module or name is never used
dynamic_import Dynamic import via importlib or __import__
circular_ref Circular dependency between functions/classes
syntax_error File contains a syntax error
write_only Variable is written but never read
deprecated_usage Usage of a deprecated function/class
dead_code Component unreachable from any entry point
type_mismatch Suspicious type annotations
unresolved_ref Reference to an undefined name
unused_variable Variable is defined but never used
file_too_large File exceeds the configured size limit

Development

# Clone the repository
git clone https://github.com/AngelosZou/graphlint.git
cd graphlint

# Create a virtual environment
python -m venv env
env/Scripts/activate  # Windows
source env/bin/activate  # Unix

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run with coverage
pytest --cov=graphlint

# Run type checking
mypy graphlint/

# Run linting
ruff check graphlint/ tests/

Configuration

Graphlint stores its configuration in .graphlint/config.json within the analyzed directory. Use graphlint config commands to manage settings, or edit the file directly.

See graphlint config show for the full default configuration.

Documentation

Full documentation is available in the docs/ directory:

Limitations

  • Static analysis only — graphlint performs static analysis and cannot detect runtime linkage such as getattr, importlib, or dynamic dispatch patterns, which may result in false positives. Mitigation: add custom entry rules matching your codebase's conventions. For example, graphlint's own codebase uses function_def:_detect_* and function_def:visit_* patterns to prevent functions discovered via getattr from being flagged as dead.
  • Large codebase build time — on a large codebase with 700+ .py files, 1,000+ classes, and 14,000+ functions, a full rebuild takes approximately 200 seconds (actual performance depends on hardware). Small projects (~60 files) complete in ~1 second. Best practice: run query before making changes to plan your work, and avoid invoking query during refactoring to prevent unnecessary index rebuilds.

License

MIT — see LICENSE for details.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

graphlint-0.1.12.tar.gz (149.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

graphlint-0.1.12-py3-none-any.whl (77.3 kB view details)

Uploaded Python 3

File details

Details for the file graphlint-0.1.12.tar.gz.

File metadata

  • Download URL: graphlint-0.1.12.tar.gz
  • Upload date:
  • Size: 149.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for graphlint-0.1.12.tar.gz
Algorithm Hash digest
SHA256 22702a274b42e64d83d7de1407c76e7812be98ae374ea064db4f0cde75048096
MD5 f0b4d1807bfd78f2fafe3719f45a795d
BLAKE2b-256 72c37c7fae95f0064f925f717bdda9a4754e0efa660b6c2e2d436ad030e99f05

See more details on using hashes here.

File details

Details for the file graphlint-0.1.12-py3-none-any.whl.

File metadata

  • Download URL: graphlint-0.1.12-py3-none-any.whl
  • Upload date:
  • Size: 77.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.14

File hashes

Hashes for graphlint-0.1.12-py3-none-any.whl
Algorithm Hash digest
SHA256 7f5f9cd6a8cbd5b2ca673733ed62f374357eece81ba3bac20153e6e4e067dc19
MD5 788dc9542fdd1db07d8a3074e4f07d22
BLAKE2b-256 8e16624361857b37be7cc6a631cf7272a8cf5743c41e538b0fa58d01dd9c2b65

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page