[build-system] build-backend = "hatchling.build" requires = [ "hatchling" ] [project] name = "serena" version = "0.1.0" description = "" authors = [ {name = "Oraios AI", email = "info@oraios-ai.de"} ] readme = "README.md" requires-python = ">=3.11, <3.12" classifiers = [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11" ] dependencies = [ "requests>=2.32.3,<3", "pyright>=1.1.396,<2", "overrides>=7.7.0,<8", "python-dotenv>=1.0.0, <2", "mcp>=1.5.0", "fastmcp>=0.4.1", "sensai-utils>=1.4.0", "pydantic>=2.10.6", "types-pyyaml>=6.0.12.20241230", "pyyaml>=6.0.2", "jinja2>=3.1.6", "dotenv>=0.9.9", "pathspec>=0.12.1", "psutil>=7.0.0", ] [project.scripts] serena-mcp-server = "serena.mcp:start_mcp_server" serena-list-tools = "serena.agent:print_tool_overview" [project.license] text = "GPL-2.0" [project.optional-dependencies] dev = [ "black[jupyter]>=23.7.0", "jinja2", # In version 1.0.4 we get a NoneType error related to some config conversion (yml_analytics is None and should be a list) "mypy>=1.4.1", "poethepoet>=0.20.0", "pytest>=8.0.2", "pytest-cov", "ruff>=0.0.285", "toml-sort>=0.24.2", "types-pyyaml>=6.0.12.20241230", ] agno = [ "agno>=1.2.6", "fastapi>=0.115.12", "sqlalchemy>=2.0.40", ] anthropic = [ "anthropic>=0.49.0", ] google = [ "google-genai>=1.8.0", ] [project.urls] Homepage = "https://github.com/oraios/serena" [tool.black] line-length = 140 target-version = [ "py311" ] [tool.doc8] max-line-length = 1000 [tool.mypy] allow_redefinition = true check_untyped_defs = true disallow_incomplete_defs = true disallow_untyped_defs = true ignore_missing_imports = true no_implicit_optional = true pretty = true show_error_codes = true show_error_context = true show_traceback = true strict_equality = true strict_optional = true warn_no_return = true warn_redundant_casts = true warn_unreachable = true warn_unused_configs = true warn_unused_ignores = true exclude = "^build/|^docs/" [tool.poe.env] PYDEVD_DISABLE_FILE_VALIDATION = "1" [tool.poe.tasks] test = "pytest test --cov=serena --cov-report=xml --cov-report=term-missing --durations=0 -v --color=yes" _black_check = "black --check --exclude src/multilspy/ src scripts test" _ruff_check = "ruff check --exclude .venv/ --exclude src/multilspy/ src scripts test" _black_format = "black --exclude .venv/|src/multilspy/ src scripts test" _ruff_format = "ruff check --exclude src/multilspy/ --fix src scripts test" lint = [ "_black_check", "_ruff_check", ] clean-nbs = "python docs/nbstripout.py" format = [ "_ruff_format", "_black_format" ] _autogen_rst = "python docs/autogen_rst.py" _sphinx_build = "sphinx-build -W -b html docs docs/_build" _jb_generate_toc = "python docs/create_toc.py" _jb_generate_config = "jupyter-book config sphinx docs/" doc-clean = "rm -rf docs/_build" doc-generate-files = [ "_autogen_rst", "_jb_generate_toc", "_jb_generate_config" ] doc-spellcheck = "sphinx-build -W -b spelling docs docs/_build" doc-build = [ "doc-generate-files", "doc-spellcheck", "_sphinx_build" ] _mypy = "mypy src/serena" type-check = [ "_mypy", ] [tool.ruff] target-version = "py311" line-length = 140 [tool.ruff.format] quote-style = "double" indent-style = "space" line-ending = "auto" skip-magic-trailing-comma = false docstring-code-format = true [tool.ruff.lint] select = [ "ASYNC", "B", "C4", "C90", "COM", "D", "DTZ", "E", "F", "FLY", "G", "I", "ISC", "PIE", "PLC", "PLE", "PLW", "RET", "RUF", "RSE", "SIM", "TID", "UP", "W", "YTT" ] ignore = [ "RUF002", "RUF005", "SIM118", "SIM108", "E501", "E741", "B008", "B011", "B028", "D100", "D101", "D102", "D103", "D104", "D105", "D107", "D200", "D203", "D213", "D401", "D402", "DTZ005", "E402", "E501", "E701", "E731", "C408", "E203", "G004", "RET505", "D106", "D205", "D212", "PLW2901", "B027", "D404", "D407", "D408", "D409", "D400", "D415", "COM812", "RET503", "RET504", "UP038", "F403", "F405", "C401", "C901", "ASYNC230", "ISC003", "B024", "B007", "SIM102", "W291", "W293", "B009", "SIM103", # forbids multiple returns "SIM110", # requires use of any(...) instead of for-loop "G001", # forbids str.format in log statements "E722", # forbids unspecific except clause ] unfixable = [ "F841", "F601", "F602", "B018" ] extend-fixable = [ "F401", "B905", "W291" ] [tool.ruff.lint.mccabe] max-complexity = 20 [tool.ruff.lint.per-file-ignores] "tests/**" = [ "D103" ] "docs/**" = [ "D103" ] "examples/**" = [ "D103" ] "scripts/**" = [ "D103" ]