DevDoctor 🩺
Deterministic developer machine & project diagnostic doctor.
Scan your machine/project → Run diagnostic checks → Identify problems → Explain WHY → Give a safe FIX → Generate reports.
DevDoctor is a CLI-first, deterministic Python tool that inspects your development environment, detects misconfigurations, explains the root cause with evidence, and provides safe, actionable remediations. No AI chatbot guesswork, no hallucinations—purely deterministic diagnostics.
🚀 Quick Start
Installation
# Install via pip
pip install devdoctor
# Or install locally in editable mode
git clone https://github.com/your-org/devdoctor.git
cd devdoctor
pip install -e .
Run DevDoctor
# Scan current directory / project
devdoctor
# Or explicitly
devdoctor scan
📺 Example Output
$ devdoctor scan
DevDoctor 0.1.1
Project: Django + PostgreSQL + Docker
────────────────────────────
✓ Python 3.12.10
✓ pip 25.0.1
✓ Git 2.55.0
❌ Virtual environment
Current shell is not using a virtual environment.
Active interpreter is global: C:\Program Files\Python312\python.exe
Fix:
Windows:
.venv\Scripts\activate
⚠ Port 8000
Port is already occupied.
Process: python.exe
PID: 18420
Fix:
devdoctor port free 8000
❌ Environment variable
DATABASE_URL is required but missing.
Found in:
settings.py (line 24)
Fix:
Add DATABASE_URL to .env
Score: 72/100
3 problems found.
🧠 Diagnostic Structure
Every single DevDoctor diagnostic follows a strict, high-signal structure:
PROBLEM
↓
WHY IT HAPPENED
↓
EVIDENCE
↓
SAFE FIX
↓
COMMAND
Run with --verbose to view the comprehensive breakdown:
$ devdoctor scan --verbose
DevDoctor 0.1.1 (Detailed Diagnostic Report)
────────────────────────────────────────────────────────
PROBLEM:
Incompatible version of pydantic-core installed for Python runtime.
WHY:
Your Python version is 3.13 and requires a compatible wheel.
EVIDENCE:
pydantic-core does not have a compatible wheel for your current environment.
SAFE FIX:
Use Python 3.12 for this project.
COMMAND:
py -3.12 -m venv .venv
Confidence: HIGH
🛠️ The First 10 Diagnostic Checks
| # | Check | Description |
|---|---|---|
| 1 | Python Version | Validates active interpreter against pyproject.toml (requires-python), .python-version, or runtime.txt. |
| 2 | pip Availability | Validates pip installation, version, and bootstrap status. |
| 3 | Virtual Environment | Confirms whether shell is operating inside an active venv; provides exact platform activation command. |
| 4 | Git Availability | Verifies Git CLI is installed and in PATH. |
| 5 | Git Configuration | Checks user.name and user.email; audits .gitignore to ensure .env and sensitive files are not committed. |
| 6 | Required Environment Variables | Uses Python AST to detect unfulfilled os.environ[...] lookups without defaults. |
| 7 | .env vs .env.example | Diffs template keys against your .env to prevent runtime configuration crashes. |
| 8 | Port Conflicts | Scans web dev ports (8000, 3000, 5000, 5173, etc.); maps occupied ports to process name & PID. |
| 9 | Broken Python Imports | Scans Python code using AST and flags uninstalled third-party packages in site-packages. |
| 10 | Dependency Conflicts | Runs deterministic graph checks and pip check to detect version conflicts (e.g., fastapi vs pydantic<3). |
🔍 Project Understanding (Phase 3)
DevDoctor inspects your repository and automatically determines its stack without requiring AI:
- Detects
manage.py→ Django - Detects
fastapiin dependencies or code → FastAPI - Detects
flaskin dependencies or code → Flask - Detects
Dockerfile/docker-compose.yml→ Docker - Detects PostgreSQL connection strings / psycopg → PostgreSQL
- Detects Redis configuration / compose service → Redis
- Detects
package.json→ Node.js
$ devdoctor project
Project Profile: my-web-app
──────────────────────────────────────────
Detected Type: Django
Stack Summary: Django + PostgreSQL + Redis + Docker
Technologies: Python, Django, PostgreSQL, Redis, Docker
Frameworks: Django
Config Files: pyproject.toml, docker-compose.yml, .env
Dependencies: 24 declared
⚡ Framework-Specific Diagnostics (Phase 4)
DevDoctor includes dedicated diagnostic suites for major frameworks:
# Django diagnostics: DEBUG mode, insecure SECRET_KEY, empty ALLOWED_HOSTS, unapplied migrations
devdoctor django
# FastAPI diagnostics: Uvicorn status, default port 8000, reload flag, CORS wildcard check
devdoctor fastapi
# Docker diagnostics: daemon accessibility, exited container error codes, compose port collisions
devdoctor docker
# PostgreSQL diagnostics: port 5432 status, connection string format
devdoctor postgres
# Redis diagnostics: port 6379 status, RESP PING response test
devdoctor redis
🧰 The Killer Feature: devdoctor fix (Phase 5)
Never blindly modify a developer's machine. DevDoctor clearly separates Safe automatic fixes from Action-required fixes.
Interactive Fix Prompt
$ devdoctor fix
Found 3 problem(s) with available fixes:
1. [SAFE] Add .env to .gitignore
Command: echo .env >> .gitignore
2. [SAFE] Copy .env.example to .env
Command: copy .env.example .env
3. [ACTION] Kill process python.exe (PID: 18420) on port 8000
Command: devdoctor port free 8000
Apply fixes? [Y/n]: Y
Applying fixes...
✓ Fixed: Add .env to .gitignore
✓ Fixed: Copy .env.example to .env
✓ Fixed: Kill process python.exe (PID: 18420) on port 8000
Completed: 3 applied, 0 failed.
Safe-Only Automation (CI / Scripts)
Apply only safe, non-destructive fixes without touching running processes or external installations:
devdoctor fix --safe
Dry Run
Preview all proposed remediations without executing anything:
devdoctor fix --dry-run
Standalone Port Free Utility
Easily free up an occupied port with PID and process name resolution:
devdoctor port free 8000 --yes
🔌 Extensible Plugin Engine (Phase 6)
DevDoctor can be extended with custom checks via the @check decorator or Python entry points (devdoctor.checks).
Writing a Custom Check
Create a Python file in your project under .devdoctor/checks/my_check.py or inside an installable package:
from devdoctor import check, Diagnostic, ScanContext, Severity
@check(name="internal_api", title="Internal API Gateway", category="network")
def check_internal_api(context: ScanContext) -> Diagnostic | None:
api_url = context.env_vars.get("INTERNAL_API_URL")
if not api_url:
return Diagnostic(
title="Internal API Gateway",
severity=Severity.ERROR,
message="INTERNAL_API_URL is missing in environment.",
why="Microservices require INTERNAL_API_URL to reach the auth cluster.",
fix="Add INTERNAL_API_URL=https://api.internal to .env",
command="echo INTERNAL_API_URL=https://api.internal >> .env",
)
return Diagnostic(
title="Internal API Gateway",
severity=Severity.OK,
message=f"Configured: {api_url}",
)
DevDoctor will automatically discover and execute your custom check!
🐍 Python API
Integrate DevDoctor diagnostics directly into your Python scripts, pytest test suites, or tooling:
from devdoctor import DevDoctor
doctor = DevDoctor(project_path=".")
# Run scan
report = doctor.scan()
print(f"Health Score: {report.score}/100")
print(f"Total Problems: {report.total_problems}")
for problem in report.problems:
print(f"[{problem.severity.value}] {problem.title}: {problem.message}")
# Apply safe fixes automatically
if not report.is_healthy:
doctor.fix(safe_only=True)
🤖 CI/CD Integration & Reporting
Export machine-readable JSON or GitHub-flavored Markdown for CI/CD checks:
# Output JSON for pipeline evaluation
devdoctor scan --json
# Fail build if errors or warnings exist
devdoctor scan --strict
# Export Markdown report for PR comment
devdoctor report --format markdown -o report.md
📋 CLI Reference
devdoctor [scan] [PATH] Scan machine and project (default command)
--json Output report in JSON format
--markdown Output report in Markdown format
-v, --verbose Show detailed WHY/EVIDENCE/FIX/COMMAND breakdown
-o, --output FILE Save report to file
--strict Exit with code 1 on warnings or errors
--checks-dir DIR Load custom check plugins from directory
devdoctor fix [PATH] Apply fixes for identified issues
--safe Apply only safe non-destructive fixes
--dry-run Show planned fixes without applying changes
-y, --yes Confirm all fixes non-interactively
devdoctor dependencies [PATH] Check dependency conflicts and broken imports
devdoctor port free <PORT> [-y] Kill process listening on specified port
devdoctor project [PATH] Inspect detected project profile and tech stack
devdoctor report [PATH] Export diagnostic report (terminal/markdown/json)
devdoctor django [PATH] Run Django-specific diagnostics
devdoctor fastapi [PATH] Run FastAPI-specific diagnostics
devdoctor docker [PATH] Run Docker-specific diagnostics
devdoctor postgres [PATH] Run PostgreSQL-specific diagnostics
devdoctor redis [PATH] Run Redis-specific diagnostics
📄 License
MIT License. See LICENSE for details.
Metadata
Release files for devdoctor-cli 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| devdoctor_cli-0.1.1.tar.gz | 50.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| devdoctor_cli-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 104.4 kB
Release files / devdoctor_cli-0.1.1.tar.gz
| Download URL | devdoctor_cli-0.1.1.tar.gz |
|---|---|
| Size | 50.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
94fa796e64ed88c46af40820271bc77db7b6f8473286aa284dba00ca2da8a3f6
|
|
BLAKE2b-256 checksum How to use checksums |
cb64662a43588e46e799a0013d35fc59bf0c3e5e6a76f9bfb8f213278a9df151
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / devdoctor_cli-0.1.1-py3-none-any.whl
| Download URL | devdoctor_cli-0.1.1-py3-none-any.whl |
|---|---|
| Size | 53.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
54a4b0c485b6d86a2670db176349fcf5a0c6ddad28cbc1f6e87b86bc4bc7d154
|
|
BLAKE2b-256 checksum How to use checksums |
1de8dccf3285e1374f67378e603d07409eabd160190c54fcc41499df184af9e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|