[project]
name = "local-deepwiki"
version = "0.1.0"
description = "Local DeepWiki-style MCP server for private repository documentation"
readme = "README.md"
license = "MIT"
authors = [{ name = "UrbanDiver" }]
keywords = ["mcp", "deepwiki", "documentation", "rag", "code-analysis"]
classifiers = [
"Development Status :: 4 - Beta",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Software Development :: Documentation",
]
requires-python = ">=3.11"
dependencies = [
"mcp>=1.2.0,<2.0.0", # Pinned: API stability
"rapidfuzz>=3.0,<4.0.0", # Pinned: Security-critical string matching
"tree-sitter>=0.23", # Not pinned: version inconsistencies across Python versions
"tree-sitter-python>=0.23",
"tree-sitter-javascript>=0.23",
"tree-sitter-typescript>=0.23",
"tree-sitter-go>=0.23",
"tree-sitter-rust>=0.23",
"tree-sitter-java>=0.23",
"tree-sitter-c>=0.23",
"tree-sitter-cpp>=0.23",
"tree-sitter-swift>=0.0.1",
"tree-sitter-ruby>=0.23",
"tree-sitter-php>=0.23",
"tree-sitter-kotlin>=0.23",
"tree-sitter-c-sharp>=0.23",
"lancedb>=0.15,<1.0.0", # Pinned: Vector store API stability
"sentence-transformers>=3.0,<4.0.0", # Pinned: Embedding model compatibility
"openai>=1.0,<2.0.0", # Pinned: Critical for API provider
"anthropic>=0.40,<1.0.0", # Pinned: Critical for API provider
"ollama>=0.4,<1.0.0", # Pinned: Local LLM provider
"pydantic>=2.0,<3.0.0", # Pinned: Core validation library
"pyyaml>=6.0,<7.0.0", # Pinned: Config parsing with safety
"rich>=13.0,<14.0.0", # Pinned: CLI output formatting
"pandas>=2.0,<3.0.0", # Pinned: Data processing
"flask>=3.0,<4.0.0", # Pinned: Web server
"markdown>=3.0,<4.0.0", # Pinned: Markdown parsing
"nh3>=0.2.14,<1.0.0", # Pinned: HTML sanitization (Rust-based)
"watchdog>=4.0,<5.0.0", # Pinned: File system monitoring
"weasyprint>=68.0,<69.0.0", # Pinned: PDF generation
"psutil>=5.0,<6.0.0", # Pinned: System utilities
]
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"pytest-asyncio>=0.24,<1.0.0",
"pre-commit>=3.0",
"black>=24.0",
"isort>=5.0",
"mypy>=1.0",
"types-PyYAML>=6.0",
"types-Markdown>=3.0",
"pypdf>=6.6.1",
"pip-audit>=2.0",
]
[project.scripts]
local-deepwiki = "local_deepwiki.server:main"
deepwiki-serve = "local_deepwiki.web.app:main"
deepwiki-watch = "local_deepwiki.watcher:main"
deepwiki-export = "local_deepwiki.export.html:main"
deepwiki-export-pdf = "local_deepwiki.export.pdf:main"
deepwiki-config = "local_deepwiki.cli.config_cli:main"
deepwiki-search = "local_deepwiki.cli.interactive_search:main"
deepwiki = "local_deepwiki.cli.main:main"
[project.urls]
Homepage = "https://github.com/UrbanDiver/local-deepwiki-mcp"
Repository = "https://github.com/UrbanDiver/local-deepwiki-mcp"
Issues = "https://github.com/UrbanDiver/local-deepwiki-mcp/issues"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/local_deepwiki"]
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
pythonpath = ["tests"]
markers = [
"slow: marks tests with timing-sensitive assertions (deselect with '-m \"not slow\"')",
]
filterwarnings = []
[tool.coverage.run]
source = ["src/local_deepwiki"]
omit = ["*/tests/*", "*/__pycache__/*"]
[tool.coverage.report]
fail_under = 80
show_missing = true
exclude_lines = [
"pragma: no cover",
"raise NotImplementedError",
"if TYPE_CHECKING:",
"if __name__ == .__main__.",
"@overload",
]
[tool.black]
line-length = 100
target-version = ["py311"]
include = '\.pyi?$'
extend-exclude = '''
/(
\.git
| \.venv
| __pycache__
| \.deepwiki
)/
'''
[tool.isort]
profile = "black"
line_length = 100
skip_gitignore = true
skip = [".git", ".venv", "__pycache__", ".deepwiki"]
[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true
warn_redundant_casts = true
warn_unused_ignores = true
# ignore_missing_imports: Required for tree-sitter and other packages without stubs
ignore_missing_imports = true
disallow_untyped_defs = true
check_untyped_defs = true
disable_error_code = [
"no-any-return",
"prop-decorator",
"no-redef",
]
exclude = [
"^\\.venv/",
"^__pycache__/",
"^\\.deepwiki/",
]
[[tool.mypy.overrides]]
module = [
"local_deepwiki.core.deep_research.reasoning",
"local_deepwiki.core.deep_research.steps",
]
disable_error_code = ["attr-defined"]
# Rich library type stubs produce false positives in CLI display code
[[tool.mypy.overrides]]
module = [
"local_deepwiki.cli_progress",
"local_deepwiki.cli.config_cli",
"local_deepwiki.cli.interactive_search",
]
disable_error_code = ["arg-type", "assignment"]
# Dynamic code generation and plugin dispatch patterns
[[tool.mypy.overrides]]
module = [
"local_deepwiki.generators.codemap",
"local_deepwiki.generators.wiki_postprocessing",
"local_deepwiki.generators.wiki_plugin_runner",
]
disable_error_code = ["misc", "operator", "assignment", "arg-type"]
[dependency-groups]
dev = [
"pytest-cov>=7.0.0",
]