[project]
name = "boring-aicoding"
version = "15.2.0"
description = "Boring: An AI-powered development support tool for autonomous reasoning, planning, and verification. Optimized for uv and agentic workflows."
authors = [
{ name = "Boring206", email = "C112156246@nkust.edu.tw" }
]
readme = "PYPI.md"
requires-python = ">=3.10"
keywords = ["gemini", "ai", "autonomous-agent", "devops"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Topic :: Software Development :: Build Tools",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
"Framework :: Pytest",
]
dependencies = [
"typer[all]>=0.9.0",
"rich>=13.0.0",
"python-dotenv",
"google-genai>=1.0.0",
"python-dateutil",
"gitpython",
"pydantic-settings>=2.0.0",
"structlog>=24.0.0",
"tenacity>=8.0.0",
"duckduckgo-search>=5.0.0",
"requests",
"watchdog>=3.0.0",
"toml>=0.10.0",
"tomlkit>=0.12.0",
]
[project.optional-dependencies]
gui = [
"streamlit>=1.30.0",
"pyarrow",
]
dev = [
"pytest>=7.0.0",
"pytest-asyncio>=0.21.0",
"pytest-mock>=3.0.0",
"pytest-cov>=4.0.0",
"ruff>=0.1.0",
"mypy>=1.0.0",
"types-python-dateutil",
"types-requests",
"radon>=6.0.0",
"interrogate>=1.5.0",
"bandit>=1.7.0",
"pip-audit>=2.7.0",
"mkdocs>=1.5.0",
"mkdocs-material>=9.5.0",
"mkdocstrings[python]>=0.24.0",
"psutil>=5.9.0",
"numpy>=1.26.0",
]
vector = [
"chromadb>=0.4.0",
"faiss-cpu>=1.7.4",
"sentence-transformers>=2.2.0",
"tree-sitter-languages==1.10.2",
"tree-sitter==0.25.2",
]
# MCP server without heavy vector search (for Smithery deployment)
mcp-lite = [
"fastmcp>=2.0.0",
"mcp>=1.15.0",
"smithery>=0.4.2",
"uvicorn>=0.30.0",
"starlette>=0.37.0",
"bandit>=1.7.0",
"pip-audit>=2.7.0",
]
# MCP server with full RAG capabilities (local use)
mcp = [
"boring-aicoding[mcp-lite]",
"chromadb>=0.4.0",
"faiss-cpu>=1.7.4",
"sentence-transformers>=2.2.0",
"win10toast>=0.9; platform_system=='Windows'",
]
# V13.2: Local LLM support for offline operation
local = [
"llama-cpp-python>=0.2.50",
"onnxruntime>=1.16.0",
]
all = [
"boring-aicoding[gui,dev,vector,mcp,local]",
]
[project.scripts]
boring = "boring.main:app"
boring-monitor = "boring.services.monitor:app"
boring-setup = "boring.cli.setup:setup_app"
boring-import = "boring.cli.setup:import_app"
boring-mcp = "boring.mcp.server:run_server"
boring-dashboard = "boring.cli.dashboard:run_app"
boring-route = "boring.mcp.tool_router:cli_route"
[project.urls]
Homepage = "https://github.com/Boring206/boring-gemini"
Repository = "https://github.com/Boring206/boring-gemini"
Documentation = "https://github.com/Boring206/boring-gemini#readme"
"Bug Tracker" = "https://github.com/Boring206/boring-gemini/issues"
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[tool.setuptools.packages.find]
where = ["src"]
include = ["boring*"]
[tool.setuptools.package-data]
boring = ["py.typed", "templates/**/*", "templates/workflows/*", "templates/specs/*"]
# Ruff linter configuration
[tool.ruff]
line-length = 100
target-version = "py310"
lint.select = [
"E", # pycodestyle errors
"F", # pyflakes
"W", # pycodestyle warnings
"I", # isort
"UP", # pyupgrade
"B", # flake8-bugbear
"C4", # flake8-comprehensions
]
lint.ignore = [
"E501", # Line too long (handled by formatter)
"E402", # Module level import not at top of file
"B904", # Within an `except` clause, raise exceptions with `raise ... from err`
"E722", # Do not use bare `except`
"E741", # Ambiguous variable name
"B027", # Empty method in an abstract base class
"B008", # Do not perform function call in argument defaults (common in Typer)
]
# Formatter configuration
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
docstring-code-format = true
[tool.ruff.lint.per-file-ignores]
"tests/*" = ["B011", "E402"] # Allow assert and late imports in tests
# Mypy type checker configuration
[tool.mypy]
python_version = "3.10"
# Strictness flags
strict = true
warn_return_any = true
warn_unused_configs = true
warn_unused_ignores = true
warn_redundant_casts = true
warn_unreachable = true
disallow_untyped_defs = true
disallow_any_unimported = false
disallow_incomplete_defs = true
check_untyped_defs = true
no_implicit_optional = true
strict_equality = true
strict_concatenate = true
# Error output
show_error_context = true
show_column_numbers = true
show_error_codes = true
pretty = true
color_output = true
# Import discovery
namespace_packages = true
explicit_package_bases = true
# Plugins
plugins = ["pydantic.mypy"]
# Per-module options
[[tool.mypy.overrides]]
module = "tests.*"
disallow_untyped_defs = false
[[tool.mypy.overrides]]
module = [
"chromadb.*",
"sentence_transformers.*",
"tree_sitter_languages.*",
"duckduckgo_search.*",
"streamlit.*",
"google.genai.*",
"requests.*",
"win10toast.*",
"plyer.*",
"sklearn.*",
"boring.intelligence.*",
"boring.judge.*",
"boring.loop.*",
"boring.rag.*",
"boring.storage.*",
"boring.config.*",
"boring.security.*",
"boring.context_sync.*",
"boring.trust_rules.*",
]
ignore_missing_imports = true
# Pytest configuration
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
asyncio_mode = "auto"
addopts = [
"-v",
"--tb=short",
# Coverage options moved to CI workflow - not needed globally
# This allows integration tests to run without coverage requirements
]
pythonpath = ["src"]
filterwarnings = [
# Ignore dateutil utcfromtimestamp deprecation (third-party issue)
"ignore:datetime.datetime.utcfromtimestamp:DeprecationWarning:dateutil.tz.tz",
# Ignore pydantic deprecations from third-party libraries if any remain
"ignore::DeprecationWarning:pydantic.*",
]
# Coverage configuration
[tool.coverage.run]
source = ["src/boring"]
branch = true
omit = [
"*/tests/*",
"*/__pycache__/*",
]
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"raise NotImplementedError",
]
# Smithery Configuration for version: 15.1.0 MCP Server
[tool.smithery]
server = "boring.mcp.server:create_server"
[dependency-groups]
dev = [
"psutil>=7.2.1",
]
[tool.bandit]
skips = ["B110", "B112", "B404", "B603", "B607"]
exclude = ["tests"]