Ghostbuster
Find and bust the ghosts haunting your codebase.
Unused dependencies, dead functions, orphan files, and phantom environment variables lurk in codebases - slowing down repos, confusing new contributors, and wasting CI minutes.
Ghostbuster finds them all in one command.
Quick Start
# Install
pip install ghostbuster-cli
# Scan your project
ghostbuster scan
# No config needed.
What It Finds
Ghostbuster detects 4 categories in your codebase:
| Category | Identifier | What It Detects |
|---|---|---|
| Dead Import | dead-import |
Dependencies in requirements.txt / pyproject.toml that are never imported |
| Orphan File | orphan-file |
node_modules/, venv/, .pyc, large files that should be in .gitignore |
| Zombie Code | zombie-code |
Functions and classes that are defined but never called from anywhere |
| Phantom Env | phantom-env |
os.environ["KEY"] / os.getenv("KEY") where KEY is never set |
Ghost Score
Every scan produces a Ghost Score (0-100) - the higher the score, the more technical debt in your codebase:
+----------------------- Ghost Score ------------------------+
| |
| 47 / 100 |
| |
| #########################-------------------------- |
| |
| Noticeable technical debt detected. |
| |
+------------------------------------------------------------+
Auto-Fix
Ghostbuster can also fix detected issues:
# Preview what would be fixed (safe, default)
ghostbuster bust
# Actually apply fixes
ghostbuster bust --confirm
Currently auto-fixes:
- Removes unused import statements from Python files
- Appends missing orphan files and directories to
.gitignore - Appends missing environment variable stubs (
KEY=) to.env.example
Usage
Basic Scan
# Scan current directory
ghostbuster scan
# Scan a specific path
ghostbuster scan ./my-project
# Verbose mode (show locations and fix suggestions)
ghostbuster scan -v
Filtered Scan
# Only check for dead imports
ghostbuster scan --category dead-import
# Only check for zombie code
ghostbuster scan -c zombie-code
Output Formats
# Default: formatted terminal output
ghostbuster scan
# JSON (for CI pipelines and scripting)
ghostbuster scan --format json
# Markdown (for pasting into issues/PRs)
ghostbuster scan --format markdown
Pre-commit Hook Integration
Add Ghostbuster to your .pre-commit-config.yaml:
repos:
- repo: https://github.com/adewanggar/ghostbuster-cli
rev: v0.2.0
hooks:
- id: ghostbuster-scan
CI Integration
# .github/workflows/ghostbuster.yml
name: Ghost Check
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install ghostbuster-cli
- run: ghostbuster scan --format json
Note:
ghostbuster scanexits with code 1 if issues are found - ideal for CI gates.
Configuration
Ghostbuster works with zero config, but you can customize it:
pyproject.toml
[tool.ghostbuster]
exclude_dirs = ["migrations", "generated"]
ignore_packages = ["my-internal-lib"]
ignore_env_vars = ["CI", "GITHUB_ACTIONS"]
ignore_names = ["deprecated_helper"]
large_file_threshold = 5242880 # 5MB
.ghostbuster.toml
exclude_dirs = ["vendor", "third_party"]
categories = ["dead-import", "phantom-env"] # Only run these scanners
How It Works
Ghostbuster uses pure AST analysis - no runtime imports, no code execution, no external services:
- Dead Imports: Parses
requirements.txt/pyproject.tomlfor declared dependencies, walks AST for imports, cross-references with a package-to-import mapping table. - Orphan Files: Walks the file tree checking for known ignorable patterns (
node_modules/,venv/,__pycache__/, large binary files) and verifies they are covered by.gitignore. - Zombie Code: Collects all function/class definitions and references across the codebase, identifying definitions with zero references (skipping
__init__,test_*, and decorated functions). - Phantom Env: Detects
os.environ["KEY"],os.environ.get("KEY"),os.getenv("KEY")patterns via AST and checks against.envfiles and system environment.
Alternatives
| Tool | Scope | Ghostbuster Advantage |
|---|---|---|
| Vulture | Dead code only | Ghostbuster also covers dependencies, files, and env vars |
| deptry | Unused deps only | Ghostbuster is a superset with unified output |
| deadcode | Dead code only | Ghostbuster adds auto-fix and unified scoring |
| git-sizer | Repo size | Ghostbuster checks .gitignore coverage |
Roadmap
Node.js / TypeScript support (scan
package.json, dead exports)- Pre-commit hook integration
- GitHub Actions reporter (comment Ghost Score on PRs)
- Config inheritance for monorepos
- Ghost Score history tracking & trend chart
Contributing
Contributions are welcome. See CONTRIBUTING.md for guidelines.
git clone https://github.com/adewanggar/ghostbuster-cli.git
cd ghostbuster-cli
pip install -e .
pip install pytest ruff mypy
pytest tests/ -v
License
MIT (c) Ghostbuster Contributors
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ghostbuster_cli-0.2.1.tar.gz.
File metadata
- Download URL: ghostbuster_cli-0.2.1.tar.gz
- Upload date:
- Size: 2.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33750dd0f9cfb7441519c1389389c1eb768fd9bdeb61d5c40d3fc520ccbfb278
|
|
| MD5 |
54b000b9acb260d9f5527aad09eb5bde
|
|
| BLAKE2b-256 |
3834b01745f8e05683959fb80ef0e4c9f5539d82661c1ae0c2635743f44ace93
|
File details
Details for the file ghostbuster_cli-0.2.1-py3-none-any.whl.
File metadata
- Download URL: ghostbuster_cli-0.2.1-py3-none-any.whl
- Upload date:
- Size: 34.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
932b41d11b51dfc4226edaeeef524938594be9b3c145fa3c92b04097d1119b3d
|
|
| MD5 |
77e5517243e86e819eb4c59bcdf81e05
|
|
| BLAKE2b-256 |
156cc2208b284467b24acd47685833130d38ddcfa884fe3fcbcf2b9d8112641b
|