[project] name = "hearthnet" version = "0.1.0" description = "Local-first community AI mesh — run a node, connect to peers, share AI capabilities." readme = "README.md" requires-python = ">=3.12" dependencies = [ "click>=8.1", "gradio>=6.16.0,<7.0", "spaces>=0.30.0", "accelerate>=0.30.0", "openai>=1.80.0", "safetensors>=0.4.3", "sentencepiece>=0.2.0", "torch>=2.3.0", "transformers>=4.45.0", "PyNaCl>=1.5.0", "blake3>=0.4.0", "qrcode[svg]>=7.4", ] [project.scripts] hearthnet = "hearthnet.cli:main" [tool.ruff] target-version = "py312" line-length = 100 exclude = [ ".git", ".mypy_cache", ".pytest_cache", ".ruff_cache", ".venv", "venv", ] [tool.ruff.lint] select = [ "A", "B", "C4", "E", "F", "I", "N", "PIE", "PT", "RET", "RUF", "SIM", "UP", "W", ] ignore = [ "E501", ] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = [ "S101", ] "hearthnet/types.py" = [ "A005", ] [tool.ruff.format] quote-style = "double" indent-style = "space" line-ending = "lf" [tool.bandit] exclude_dirs = [ ".git", ".venv", "venv", "tests", ] skips = [ "B101", ] [tool.pylint.main] py-version = "3.12" jobs = 0 ignore = [ ".git", ".venv", "venv", ] [tool.pylint.format] max-line-length = 100 [tool.pylint.messages_control] disable = [ "broad-exception-caught", "line-too-long", "missing-module-docstring", "missing-class-docstring", "missing-function-docstring", "no-member", "redefined-outer-name", "too-many-arguments", "too-many-instance-attributes", "too-many-locals", "too-few-public-methods", ] [tool.mypy] python_version = "3.12" warn_unused_configs = true warn_redundant_casts = true warn_unused_ignores = true no_implicit_optional = true check_untyped_defs = true disallow_untyped_defs = false ignore_missing_imports = true exclude = [ "\\.git/", "\\.venv/", "venv/", ] [tool.pytest.ini_options] minversion = "8.0" addopts = "-ra --strict-config --strict-markers" asyncio_mode = "strict" asyncio_default_fixture_loop_scope = "function" testpaths = [ "tests", ] python_files = [ "test_*.py", "*_test.py", ]