[project]
name = "mcp-feedback-enhanced"
version = "2.6.0"
description = "Enhanced MCP server for interactive user feedback and command execution in AI-assisted development, featuring dual interface support (Web UI and Desktop Application) with intelligent environment detection and cross-platform compatibility."
readme = "README.md"
requires-python = ">=3.11"
authors = [
    { name = "Minidoracat", email = "minidora0702@gmail.com" }
]
keywords = ["mcp", "ai", "feedback", "web-ui", "desktop-app", "interactive", "development", "cross-platform", "tauri", "dual-interface"]
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Software Development :: User Interfaces",
    "Topic :: Desktop Environment",
    "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
    "Operating System :: OS Independent",
    "Environment :: Web Environment",
    "Environment :: X11 Applications",
    "Environment :: Win32 (MS Windows)",
    "Environment :: MacOS X",
]
dependencies = [
    "fastmcp>=2.0.0",
    "psutil>=7.0.0",
    "fastapi>=0.115.0",
    "uvicorn>=0.30.0",
    "jinja2>=3.1.0",
    "websockets>=13.0.0",
    "aiohttp>=3.8.0",
    "mcp>=1.9.3",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0.0",
    "pytest-asyncio>=0.21.0",
]

[project.urls]
Homepage = "https://github.com/Minidoracat/mcp-feedback-enhanced"
Repository = "https://github.com/Minidoracat/mcp-feedback-enhanced"
Issues = "https://github.com/Minidoracat/mcp-feedback-enhanced/issues"

[project.scripts]
mcp-feedback-enhanced = "mcp_feedback_enhanced.__main__:main"
interactive-feedback-mcp = "mcp_feedback_enhanced.__main__:main"

[build-system]
requires = [
    "hatchling",
    "maturin>=1.8.7",
    "setuptools-rust>=1.11.1"
]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src/mcp_feedback_enhanced"]

# 桌面應用程式二進制檔案現在直接存儲在 Git 中
# 由 build-desktop.yml 工作流程自動構建並提交

[tool.uv]
dev-dependencies = [
    "bump2version>=1.0.1",
    "pytest>=7.0.0",
    "pytest-asyncio>=0.21.0",
    "pytest-timeout>=2.1.0",
    "twine>=6.1.0",
    "ruff>=0.11.0",
    "mypy>=1.16.0",
    "pre-commit>=4.0.0",
    "maturin>=1.8.7",
    "setuptools-rust>=1.11.1",
    "pillow>=11.2.1",
]

# ===== Ruff 配置 =====
[tool.ruff]
# 目標 Python 版本
target-version = "py311"

# 程式碼行長度
line-length = 88

# 包含的檔案模式
include = ["*.py", "*.pyi", "**/pyproject.toml"]

# 排除的檔案和目錄
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".hg",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",

    "venv",
    "*.egg-info",
    ".trunk",
]

[tool.ruff.lint]
# 啟用的規則集
select = [
    "E",      # pycodestyle errors
    "W",      # pycodestyle warnings
    "F",      # Pyflakes
    "I",      # isort
    "B",      # flake8-bugbear
    "C4",     # flake8-comprehensions
    "UP",     # pyupgrade
    "ARG",    # flake8-unused-arguments
    "C90",    # mccabe
    "T20",    # flake8-print
    "TID",    # flake8-tidy-imports
    "ICN",    # flake8-import-conventions
    "RET",    # flake8-return
    "SIM",    # flake8-simplify
    "S",      # bandit (安全檢查)
    "A",      # flake8-builtins
    "COM",    # flake8-commas
    "PL",     # Pylint
    "RUF",    # Ruff-specific rules
]

# 忽略的規則 - 2024-12-19 更新：經過三階段程式碼品質改善
ignore = [
    # === 格式化和工具衝突 ===
    "E501",   # 行長度由 formatter 處理
    "COM812",  # 避免與 formatter 衝突
    "COM819",  # 避免與 formatter 衝突

    # === 測試和調試 ===
    "S101",   # 允許使用 assert（測試中必要）
    "T201",    # 允許 print 語句（調試和腳本中使用）

    # === 安全相關（已針對性處理）===
    "S603",   # 允許 subprocess 調用（已安全處理，僅限必要場景）
    "S607",   # 允許部分路徑執行（已安全處理，僅限必要場景）
    "S108",    # 允許臨時文件路徑（resource_manager 中安全使用）

    # === 中文項目特殊需求 ===
    "RUF001",  # 允許全角字符（中文項目必要）
    "RUF002",  # 允許全角字符（中文項目必要）
    "RUF003",  # 允許全角字符（中文項目必要）

    # === 複雜度控制（合理範圍內）===
    "PLR0913", # 允許多參數函數（API 設計需要）
    "PLR0912", # 允許多分支（狀態機等複雜邏輯）
    "PLR0911", # 允許多返回語句（早期返回模式）
    "PLR0915", # 允許函數語句過多（複雜業務邏輯）
    "PLR2004", # 允許魔術數字（配置值等）
    "C901",    # 允許複雜函數（核心業務邏輯）

    # === 待重構項目（下個版本處理）===
    "E402",    # 模組級導入不在頂部（1個錯誤，需要重構導入順序）
    "E722",    # 裸露 except（18個錯誤，需要指定異常類型）
    "ARG001",  # 未使用函數參數（4個錯誤，需要重構接口）
    "ARG002",  # 未使用方法參數（4個錯誤，需要重構接口）
    "SIM105",  # try-except-pass（6個錯誤，可用 contextlib.suppress）
    "RUF006",  # 未儲存 asyncio.create_task 返回值（3個錯誤）

    # === 架構設計相關（長期保留）===
    "TID252",  # 相對導入（模組架構設計）
    "B007",    # 未使用循環變數（某些算法中正常）
    "SIM102",  # 嵌套 if（可讀性優於簡潔性）
    "SIM103",  # 複雜條件（業務邏輯清晰性）
    "SIM108",  # if-else vs 三元運算子（可讀性選擇）
    "SIM110",  # for 迴圈 vs any()（性能和可讀性平衡）
    "SIM117",  # 嵌套 with（資源管理模式）
    "RET504",  # 不必要賦值（調試和可讀性）
    "RUF005",  # 列表連接（性能不敏感場景）
    "RUF012",  # 可變類別屬性（設計模式需要）
    "RUF013",  # 隱式 Optional（漸進式類型註解）
    "S110",    # try-except-pass（錯誤恢復模式）
    "E712",    # 布林比較（明確性優於簡潔性）
    "PLW0603", # global 語句（單例模式等）
    "A002",    # 遮蔽內建函數名稱（領域特定命名）
]

# 每個檔案的最大複雜度
mccabe.max-complexity = 10

[tool.ruff.lint.per-file-ignores]
# 測試檔案的特殊規則
"tests/**/*.py" = [
    "S101",    # 測試中允許 assert
    "ARG",     # 測試中允許未使用參數
    "FBT",     # 測試中允許布林參數
    "PLR2004", # 測試中允許魔術數字
    "S311",    # 測試中允許偽隨機生成器
]

# __init__.py 檔案的特殊規則
"__init__.py" = [
    "F401",    # 允許未使用的導入
]

# 腳本檔案的特殊規則
"scripts/**/*.py" = [
    "T201",    # 腳本中允許 print
    "S602",    # 腳本中允許 shell 調用（腳本環境相對安全）
    "S603",    # 腳本中允許 subprocess 調用
    "S607",    # 腳本中允許部分路徑執行
]

# Web 模組的特殊規則（需要更嚴格的安全檢查）
"src/mcp_feedback_enhanced/web/**/*.py" = [
    "S104",    # 允許綁定 127.0.0.1（本地開發安全）
]

[tool.ruff.format]
# 使用雙引號
quote-style = "double"

# 縮排樣式
indent-style = "space"

# 跳過魔術逗號
skip-magic-trailing-comma = false

# 行結尾
line-ending = "auto"

[tool.ruff.lint.isort]
# import 排序配置
known-first-party = ["mcp_feedback_enhanced"]
force-single-line = false
lines-after-imports = 2

# ===== mypy 配置 =====
[tool.mypy]
# Python 版本
python_version = "3.11"

# 基本設定 - 2024-12-19 更新：經過三階段改善，74% 錯誤已修復
warn_return_any = true
warn_unused_configs = true
# 漸進式啟用：核心模組已達到類型安全標準，剩餘26個錯誤主要為第三方庫問題
disallow_untyped_defs = false  # 目標：下個版本啟用
disallow_incomplete_defs = false  # 目標：下個版本啟用
check_untyped_defs = true
disallow_untyped_decorators = false  # 漸進式啟用

# 嚴格模式（漸進式啟用）
strict_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true

# 錯誤格式
show_error_codes = true
show_column_numbers = true
pretty = true

# 包含和排除 - 使用最佳實踐配置
files = ["src", "tests"]
exclude = [
    "build/",
    "dist/",
    ".venv/",
    "venv/",
    ".trunk/",

    ".mypy_cache/",
]

# 最佳實踐：明確指定包基礎路徑
explicit_package_bases = true
# 設置 mypy 路徑，確保正確的模組解析
mypy_path = ["src"]
# 忽略已安裝的包，只檢查源代碼
no_site_packages = true

# 第三方庫配置
[[tool.mypy.overrides]]
module = [
    "fastmcp.*",
    "mcp.*",
    "psutil.*",
    "uvicorn.*",
    "websockets.*",
    "aiohttp.*",
    "fastapi.*",
    "pydantic.*",
    "pytest.*",
]
ignore_missing_imports = true

# 測試檔案的寬鬆配置
[[tool.mypy.overrides]]
module = "tests.*"
disallow_untyped_defs = false
disallow_incomplete_defs = false
disallow_untyped_decorators = false
