[project] name = "bub" dynamic = ["version"] description = "A common shape for agents that live alongside people." authors = [ { name = "Chojan Shang", email = "psiace@apache.org" }, { name = "Frost Ming", email = "me@frostming.com" }, { name = "Yihong", email = "zouzou0208@gmail.com" }, ] readme = "README.md" requires-python = ">=3.12,<4.0" license = { text = "Apache-2.0" } classifiers = [ "Intended Audience :: Developers", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Libraries :: Python Modules", ] dependencies = [ "pydantic>=2.0.0", "pydantic-settings>=2.0.0", "pyyaml>=6.0.0", "pluggy>=1.6.0", "inquirer-textual>=0.5.1", "typer>=0.9.0", "authlib>=1.7.2", "any-llm-sdk[anthropic]", "rich>=13.0.0", "prompt-toolkit>=3.0.0", "python-telegram-bot>=21.0", "loguru>=0.7.2", "rapidfuzz>=3.14.3", "aiohttp>=3.13.3", "httpx[socks]>=0.28.1", "typing-extensions>=4.13.0", ] [project.urls] Homepage = "https://bub.build" Repository = "https://github.com/bubbuild/bub" Documentation = "https://bub.build" [project.scripts] bub = "bub.__main__:app" [project.optional-dependencies] logfire = [ "logfire>=4.31.0", ] [dependency-groups] dev = [ "pytest>=7.2.0", "tox-uv>=1.11.3", "types-PyYAML>=6.0.12", "mypy>=0.991", "ruff>=0.11.5", "prek>=0.3.1", "pytest-asyncio>=1.3.0", ] [build-system] requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" [tool.hatch.version] source = "vcs" fallback-version = "0.3.0" [tool.hatch.build.hooks.vcs] version-file = "src/bub/_version.py" [tool.hatch.build.targets.sdist] only-include = ["src/bub", "src/skills", "tests"] [tool.hatch.build.targets.wheel] sources = ["src"] only-include = ["src/bub", "src/skills"] [tool.vulture] ignore_names = ["test_*", "Test*"] paths = ["src"] [tool.mypy] files = ["src"] disallow_untyped_defs = false disallow_any_unimported = false no_implicit_optional = true check_untyped_defs = true warn_return_any = true warn_unused_ignores = true show_error_codes = true ignore_missing_imports = true exclude = [ "src/skills/.*/scripts/.*", ] [tool.pytest.ini_options] testpaths = ["tests"] [tool.ruff] target-version = "py312" line-length = 120 fix = true extend-exclude = [ "src/skills/**/scripts/*" ] [tool.ruff.lint] select = [ # flake8-2020 "YTT", # flake8-bandit "S", # flake8-bugbear "B", # flake8-builtins "A", # flake8-comprehensions "C4", # flake8-debugger "T10", # flake8-simplify "SIM", # isort "I", # mccabe "C90", # pycodestyle "E", "W", # pyflakes "F", # pygrep-hooks "PGH", # pyupgrade "UP", # ruff "RUF", # tryceratops "TRY", ] ignore = [ # LineTooLong "E501", # DoNotAssignLambda "E731", # Avoid noisy exception-message rule for CLI/tool errors "TRY003", "S603", ] [tool.ruff.lint.per-file-ignores] "tests/*" = ["S101"] [tool.ruff.format] preview = true