2025-05-09 12:49:13 +01:00
[ project ]
2025-05-31 03:40:10 +08:00
name = "mcp-feedback-enhanced"
2025-06-15 11:24:45 +00:00
version = "2.5.2"
2025-06-15 18:17:45 +08:00
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."
2025-05-09 12:49:13 +01:00
readme = "README.md"
requires-python = ">=3.11"
2025-05-31 03:40:10 +08:00
authors = [
{ name = "Minidoracat" , email = "minidora0702@gmail.com" }
]
2025-06-15 18:17:45 +08:00
keywords = [ "mcp" , "ai" , "feedback" , "web-ui" , "desktop-app" , "interactive" , "development" , "cross-platform" , "tauri" , "dual-interface" ]
2025-05-31 03:40:10 +08:00
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" ,
2025-06-15 18:17:45 +08:00
"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" ,
2025-05-31 03:40:10 +08:00
]
2025-05-09 12:49:13 +01:00
dependencies = [
"fastmcp>=2.0.0" ,
"psutil>=7.0.0" ,
2025-05-29 12:34:38 +08:00
"fastapi>=0.115.0" ,
"uvicorn>=0.30.0" ,
"jinja2>=3.1.0" ,
"websockets>=13.0.0" ,
2025-06-06 16:44:24 +08:00
"aiohttp>=3.8.0" ,
2025-06-10 05:43:49 +08:00
"mcp>=1.9.3" ,
2025-05-09 12:49:13 +01:00
]
2025-05-31 03:40:10 +08:00
[ 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 ]
2025-06-15 11:34:34 +08:00
requires = [
"hatchling" ,
"maturin>=1.8.7" ,
"setuptools-rust>=1.11.1"
]
2025-05-31 03:40:10 +08:00
build-backend = "hatchling.build"
[ tool . hatch . build . targets . wheel ]
packages = [ "src/mcp_feedback_enhanced" ]
2025-06-15 19:01:11 +08:00
# 桌面應用程式二進制檔案會在發佈流程中動態添加到 src/mcp_feedback_enhanced/desktop_release
# 如果目錄不存在,構建過程會自動跳過
2025-06-15 11:34:34 +08:00
2025-05-31 03:40:10 +08:00
[ tool . uv ]
dev-dependencies = [
2025-05-31 03:48:10 +08:00
"bump2version>=1.0.1" ,
2025-05-31 03:40:10 +08:00
"pytest>=7.0.0" ,
"pytest-asyncio>=0.21.0" ,
2025-06-10 08:40:47 +08:00
"pytest-timeout>=2.1.0" ,
2025-05-31 03:40:10 +08:00
"twine>=6.1.0" ,
2025-06-11 03:15:24 +08:00
"ruff>=0.11.0" ,
"mypy>=1.16.0" ,
"pre-commit>=4.0.0" ,
2025-06-15 11:34:34 +08:00
"maturin>=1.8.7" ,
"setuptools-rust>=1.11.1" ,
"pillow>=11.2.1" ,
2025-05-31 03:40:10 +08:00
]
2025-06-11 03:15:24 +08:00
# ===== 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" ,
2025-06-12 04:24:38 +08:00
2025-06-11 03:15:24 +08:00
"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
]
2025-06-11 06:11:29 +08:00
# 忽略的規則 - 2024-12-19 更新:經過三階段程式碼品質改善
2025-06-11 03:15:24 +08:00
ignore = [
2025-06-11 06:11:29 +08:00
# === 格式化和工具衝突 ===
2025-06-11 03:15:24 +08:00
"E501" , # 行長度由 formatter 處理
"COM812" , # 避免與 formatter 衝突
"COM819" , # 避免與 formatter 衝突
2025-06-11 06:11:29 +08:00
# === 測試和調試 ===
"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" , # 遮蔽內建函數名稱(領域特定命名)
2025-06-11 03:15:24 +08:00
]
# 每個檔案的最大複雜度
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
2025-06-11 06:11:29 +08:00
"S602" , # 腳本中允許 shell 調用(腳本環境相對安全)
"S603" , # 腳本中允許 subprocess 調用
"S607" , # 腳本中允許部分路徑執行
]
# Web 模組的特殊規則(需要更嚴格的安全檢查)
"src/mcp_feedback_enhanced/web/**/*.py" = [
"S104" , # 允許綁定 127.0.0.1(本地開發安全)
2025-06-11 03:15:24 +08:00
]
[ 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"
2025-06-11 06:11:29 +08:00
# 基本設定 - 2024-12-19 更新: 經過三階段改善, 74% 錯誤已修復
2025-06-11 03:15:24 +08:00
warn_return_any = true
warn_unused_configs = true
2025-06-11 06:11:29 +08:00
# 漸進式啟用: 核心模組已達到類型安全標準, 剩餘26個錯誤主要為第三方庫問題
disallow_untyped_defs = false # 目標:下個版本啟用
disallow_incomplete_defs = false # 目標:下個版本啟用
2025-06-11 03:15:24 +08:00
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
2025-06-11 06:11:29 +08:00
# 包含和排除 - 使用最佳實踐配置
2025-06-11 03:15:24 +08:00
files = [ "src" , "tests" ]
exclude = [
"build/" ,
"dist/" ,
".venv/" ,
"venv/" ,
".trunk/" ,
2025-06-12 04:24:38 +08:00
2025-06-11 06:11:29 +08:00
".mypy_cache/" ,
2025-06-11 03:15:24 +08:00
]
2025-06-11 06:11:29 +08:00
# 最佳實踐:明確指定包基礎路徑
explicit_package_bases = true
# 設置 mypy 路徑,確保正確的模組解析
mypy_path = [ "src" ]
# 忽略已安裝的包,只檢查源代碼
no_site_packages = true
2025-06-11 03:15:24 +08:00
# 第三方庫配置
[ [ tool . mypy . overrides ] ]
module = [
"fastmcp.*" ,
"mcp.*" ,
"psutil.*" ,
"uvicorn.*" ,
"websockets.*" ,
"aiohttp.*" ,
2025-06-11 06:11:29 +08:00
"fastapi.*" ,
"pydantic.*" ,
"pytest.*" ,
2025-06-11 03:15:24 +08:00
]
ignore_missing_imports = true
# 測試檔案的寬鬆配置
[ [ tool . mypy . overrides ] ]
module = "tests.*"
disallow_untyped_defs = false
disallow_incomplete_defs = false
disallow_untyped_decorators = false