Skip to content

Dependency Analyzer

Map both internal and external dependencies for a project across multiple languages. Answers: "What does this depend on?" and "What depends on what internally?"

Focuses on external/third-party dependency enumeration, internal import graphs, and identifying most-imported/importing modules.

Usage

CLI

python dependency_analyzer.py <project_path>
python dependency_analyzer.py <project_path> --output deps.json
python dependency_analyzer.py <project_path> --markdown
python dependency_analyzer.py <project_path> --json

MCP

drydock_dependencies(project_path: str) -> str

Returns dependency analysis as JSON.

Example Output

Python Project

{
  "languages": ["python"],
  "summary": {
    "total_modules": 24,
    "third_party_deps": 18,
    "stdlib_deps": 14,
    "internal_imports": 87
  },
  "python": {
    "third_party": {
      "fastapi": {"count": 3, "imported_by": ["src/api/handler.py", "src/api/router.py", "src/main.py"]},
      "pydantic": {"count": 5, "imported_by": ["src/models", "src/config.py"]},
      "sqlalchemy": {"count": 4, "imported_by": ["src/db/models.py", "src/db/schema.py"]},
      "pytest": {"count": 2, "imported_by": ["tests/test_api.py"]},
      "anthropic": {"count": 2, "imported_by": ["src/ai/client.py"]}
    },
    "stdlib": {
      "typing": {"count": 8, "imported_by": ["src/models", "src/api/handler.py"]},
      "dataclasses": {"count": 3, "imported_by": ["src/config.py"]},
      "asyncio": {"count": 2, "imported_by": ["src/main.py"]},
      "json": {"count": 3, "imported_by": ["src/api/router.py"]},
      "pathlib": {"count": 2, "imported_by": ["src/utils.py"]}
    },
    "internal": {
      "src.core": {
        "imports": ["src.api", "src.db"],
        "imported_by": ["src.api", "src.main"],
        "import_count": 12
      },
      "src.api": {
        "imports": ["src.core", "src.auth"],
        "imported_by": ["src.main"],
        "import_count": 8
      },
      "src.db": {
        "imports": ["src.models"],
        "imported_by": ["src.core"],
        "import_count": 6
      }
    },
    "most_imported": [
      {"module": "src.core", "import_count": 12},
      {"module": "src.api", "import_count": 8},
      {"module": "src.models", "import_count": 7}
    ],
    "most_importing": [
      {"module": "src.main", "import_count": 6},
      {"module": "src.api.handler", "import_count": 4},
      {"module": "src.core.engine", "import_count": 4}
    ]
  }
}

JavaScript/TypeScript Project

{
  "languages": ["javascript", "typescript"],
  "summary": {
    "total_files": 45,
    "declared_dependencies": 28,
    "used_dependencies": 22,
    "unused_declared": 6,
    "missing_dependencies": 0
  },
  "javascript": {
    "declared": {
      "react": {"version": "^18.2.0", "in_devDeps": false},
      "next": {"version": "^14.0.0", "in_devDeps": false},
      "typescript": {"version": "^5.2.0", "in_devDeps": true},
      "jest": {"version": "^29.0.0", "in_devDeps": true},
      "tailwindcss": {"version": "^3.3.0", "in_devDeps": false}
    },
    "used": {
      "react": {"count": 12, "files": ["src/components", "src/pages"]},
      "next": {"count": 5, "files": ["src/pages", "src/app.tsx"]},
      "react-router": {"count": 8, "files": ["src/navigation"]},
      "axios": {"count": 4, "files": ["src/api"]},
      "lodash": {"count": 6, "files": ["src/utils"]}
    },
    "unused_declared": [
      "underscore",
      "moment",
      "debug",
      "winston"
    ],
    "missing_dependencies": [
      {
        "module": "react-router",
        "imported_by": ["src/navigation", "src/pages"],
        "declared": false
      }
    ]
  }
}

Supported Languages

  • Python: Third-party, stdlib, and internal module analysis
  • JavaScript/TypeScript: Declared vs. used analysis, devDependencies tracking
  • Rust: External crates and internal modules
  • Go: External packages and local imports

Options

Flag Type Default Description
project_path positional required Path to project root
--output, -o string stdout Output file path
--markdown, -m flag false Output as Markdown instead of JSON
--json flag false Force JSON output