mirror of
https://github.com/Minidoracat/mcp-feedback-enhanced.git
synced 2025-07-27 10:42:25 +08:00
312 lines
10 KiB
Python
312 lines
10 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Test script for Interactive Feedback MCP Web UI
|
||
"""
|
||
import sys
|
||
import threading
|
||
import time
|
||
import socket
|
||
from pathlib import Path
|
||
|
||
def find_free_port():
|
||
"""Find a free port to use for testing"""
|
||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||
s.bind(('', 0))
|
||
s.listen(1)
|
||
port = s.getsockname()[1]
|
||
return port
|
||
|
||
def test_web_ui(keep_running=False):
|
||
"""Test the Web UI functionality"""
|
||
|
||
print("🧪 測試 Interactive Feedback MCP Web UI")
|
||
print("=" * 50)
|
||
|
||
# Test import
|
||
try:
|
||
from web_ui import WebUIManager, launch_web_feedback_ui
|
||
print("✅ Web UI 模組匯入成功")
|
||
except ImportError as e:
|
||
print(f"❌ Web UI 模組匯入失敗: {e}")
|
||
return False, None
|
||
|
||
# Find free port
|
||
try:
|
||
free_port = find_free_port()
|
||
print(f"🔍 找到可用端口: {free_port}")
|
||
except Exception as e:
|
||
print(f"❌ 尋找可用端口失敗: {e}")
|
||
return False, None
|
||
|
||
# Test manager creation
|
||
try:
|
||
manager = WebUIManager(port=free_port)
|
||
print("✅ WebUIManager 創建成功")
|
||
except Exception as e:
|
||
print(f"❌ WebUIManager 創建失敗: {e}")
|
||
return False, None
|
||
|
||
# Test server start (with timeout)
|
||
server_started = False
|
||
try:
|
||
print("🚀 啟動 Web 服務器...")
|
||
|
||
def start_server():
|
||
try:
|
||
manager.start_server()
|
||
return True
|
||
except Exception as e:
|
||
print(f"服務器啟動錯誤: {e}")
|
||
return False
|
||
|
||
# Start server in thread
|
||
server_thread = threading.Thread(target=start_server)
|
||
server_thread.daemon = True
|
||
server_thread.start()
|
||
|
||
# Wait a moment and test if server is responsive
|
||
time.sleep(3)
|
||
|
||
# Test if port is listening
|
||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||
s.settimeout(1)
|
||
result = s.connect_ex((manager.host, manager.port))
|
||
if result == 0:
|
||
server_started = True
|
||
print("✅ Web 服務器啟動成功")
|
||
print(f"🌐 服務器運行在: http://{manager.host}:{manager.port}")
|
||
else:
|
||
print(f"❌ 無法連接到服務器端口 {manager.port}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ Web 服務器啟動失敗: {e}")
|
||
return False, None
|
||
|
||
if not server_started:
|
||
print("❌ 服務器未能正常啟動")
|
||
return False, None
|
||
|
||
# Test session creation
|
||
session_info = None
|
||
try:
|
||
project_dir = str(Path.cwd())
|
||
summary = "測試 Web UI 功能"
|
||
session_id = manager.create_session(project_dir, summary)
|
||
session_info = {
|
||
'manager': manager,
|
||
'session_id': session_id,
|
||
'url': f"http://{manager.host}:{manager.port}/session/{session_id}"
|
||
}
|
||
print(f"✅ 測試會話創建成功 (ID: {session_id[:8]}...)")
|
||
print(f"🔗 測試 URL: {session_info['url']}")
|
||
except Exception as e:
|
||
print(f"❌ 會話創建失敗: {e}")
|
||
return False, None
|
||
|
||
print("\n" + "=" * 50)
|
||
print("🎉 所有測試通過!Web UI 準備就緒")
|
||
print("📝 注意事項:")
|
||
print(" - Web UI 會在 SSH remote 環境下自動啟用")
|
||
print(" - 本地環境會繼續使用 Qt GUI")
|
||
print(" - 支援即時命令執行和 WebSocket 通訊")
|
||
print(" - 提供現代化的深色主題界面")
|
||
|
||
return True, session_info
|
||
|
||
def test_environment_detection():
|
||
"""Test environment detection logic"""
|
||
print("🔍 測試環境檢測功能")
|
||
print("-" * 30)
|
||
|
||
try:
|
||
from server import is_remote_environment, can_use_gui
|
||
|
||
remote_detected = is_remote_environment()
|
||
gui_available = can_use_gui()
|
||
|
||
print(f"遠端環境檢測: {'是' if remote_detected else '否'}")
|
||
print(f"GUI 可用性: {'是' if gui_available else '否'}")
|
||
|
||
if remote_detected:
|
||
print("✅ 將使用 Web UI (適合遠端開發環境)")
|
||
else:
|
||
print("✅ 將使用 Qt GUI (本地環境)")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ 環境檢測失敗: {e}")
|
||
return False
|
||
|
||
def test_mcp_integration():
|
||
"""Test MCP server integration"""
|
||
print("\n🔧 測試 MCP 整合功能")
|
||
print("-" * 30)
|
||
|
||
try:
|
||
from server import interactive_feedback
|
||
print("✅ MCP 工具函數可用")
|
||
|
||
# Test timeout parameter
|
||
print("✅ 支援 timeout 參數")
|
||
|
||
# Test force_web_ui parameter
|
||
print("✅ 支援 force_web_ui 參數")
|
||
|
||
# Test would require actual MCP call, so just verify import
|
||
print("✅ 準備接受來自 AI 助手的調用")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ MCP 整合測試失敗: {e}")
|
||
return False
|
||
|
||
def test_new_parameters():
|
||
"""Test new timeout and force_web_ui parameters"""
|
||
print("\n🆕 測試新增參數功能")
|
||
print("-" * 30)
|
||
|
||
try:
|
||
from server import interactive_feedback
|
||
|
||
# 測試參數是否存在
|
||
import inspect
|
||
sig = inspect.signature(interactive_feedback)
|
||
|
||
# 檢查 timeout 參數
|
||
if 'timeout' in sig.parameters:
|
||
timeout_param = sig.parameters['timeout']
|
||
print(f"✅ timeout 參數存在,預設值: {timeout_param.default}")
|
||
else:
|
||
print("❌ timeout 參數不存在")
|
||
return False
|
||
|
||
# 檢查 force_web_ui 參數
|
||
if 'force_web_ui' in sig.parameters:
|
||
force_web_ui_param = sig.parameters['force_web_ui']
|
||
print(f"✅ force_web_ui 參數存在,預設值: {force_web_ui_param.default}")
|
||
else:
|
||
print("❌ force_web_ui 參數不存在")
|
||
return False
|
||
|
||
print("✅ 所有新參數功能正常")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ 新參數測試失敗: {e}")
|
||
return False
|
||
|
||
def test_force_web_ui_mode():
|
||
"""Test force web UI mode"""
|
||
print("\n🌐 測試強制 Web UI 模式")
|
||
print("-" * 30)
|
||
|
||
try:
|
||
from server import interactive_feedback, is_remote_environment, can_use_gui
|
||
|
||
# 顯示當前環境狀態
|
||
is_remote = is_remote_environment()
|
||
gui_available = can_use_gui()
|
||
|
||
print(f"當前環境 - 遠端: {is_remote}, GUI 可用: {gui_available}")
|
||
|
||
if not is_remote and gui_available:
|
||
print("✅ 在本地 GUI 環境中可以使用 force_web_ui=True 強制使用 Web UI")
|
||
print("💡 這對於測試 Web UI 功能非常有用")
|
||
else:
|
||
print("ℹ️ 當前環境會自動使用 Web UI")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ 強制 Web UI 測試失敗: {e}")
|
||
return False
|
||
|
||
def interactive_demo(session_info):
|
||
"""Run interactive demo with the Web UI"""
|
||
print(f"\n🌐 Web UI 持久化運行模式")
|
||
print("=" * 50)
|
||
print(f"服務器地址: http://{session_info['manager'].host}:{session_info['manager'].port}")
|
||
print(f"測試會話: {session_info['url']}")
|
||
print("\n📖 操作指南:")
|
||
print(" 1. 在瀏覽器中開啟上面的測試 URL")
|
||
print(" 2. 嘗試以下功能:")
|
||
print(" - 點擊 '顯示命令區塊' 按鈕")
|
||
print(" - 輸入命令如 'echo Hello World' 並執行")
|
||
print(" - 在回饋區域輸入文字")
|
||
print(" - 使用 Ctrl+Enter 提交回饋")
|
||
print(" 3. 測試 WebSocket 即時通訊功能")
|
||
print("\n⌨️ 控制選項:")
|
||
print(" - 按 Enter 繼續運行")
|
||
print(" - 輸入 'q' 或 'quit' 停止服務器")
|
||
|
||
while True:
|
||
try:
|
||
user_input = input("\n>>> ").strip().lower()
|
||
if user_input in ['q', 'quit', 'exit']:
|
||
print("🛑 停止服務器...")
|
||
break
|
||
elif user_input == '':
|
||
print(f"🔄 服務器持續運行在: {session_info['url']}")
|
||
print(" 瀏覽器應該仍可正常訪問")
|
||
else:
|
||
print("❓ 未知命令。按 Enter 繼續運行,或輸入 'q' 退出")
|
||
except KeyboardInterrupt:
|
||
print("\n🛑 收到中斷信號,停止服務器...")
|
||
break
|
||
|
||
print("✅ Web UI 測試完成")
|
||
|
||
if __name__ == "__main__":
|
||
print("Interactive Feedback MCP - Web UI 測試")
|
||
print("=" * 60)
|
||
|
||
# Check if user wants persistent mode
|
||
persistent_mode = len(sys.argv) > 1 and sys.argv[1] in ['--persistent', '-p', '--demo']
|
||
|
||
if not persistent_mode:
|
||
print("💡 提示: 使用 'python test_web_ui.py --persistent' 啟動持久化測試模式")
|
||
print()
|
||
|
||
# Test environment detection
|
||
env_test = test_environment_detection()
|
||
|
||
# Test new parameters
|
||
params_test = test_new_parameters()
|
||
|
||
# Test force web UI mode
|
||
force_test = test_force_web_ui_mode()
|
||
|
||
# Test MCP integration
|
||
mcp_test = test_mcp_integration()
|
||
|
||
# Test Web UI
|
||
web_test, session_info = test_web_ui()
|
||
|
||
print("\n" + "=" * 60)
|
||
if env_test and params_test and force_test and mcp_test and web_test:
|
||
print("🎊 所有測試完成!準備使用 Interactive Feedback MCP")
|
||
print("\n📖 使用方法:")
|
||
print(" 1. 在 Cursor/Cline 中配置此 MCP 服務器")
|
||
print(" 2. AI 助手會自動調用 interactive_feedback 工具")
|
||
print(" 3. 根據環境自動選擇 GUI 或 Web UI")
|
||
print(" 4. 提供回饋後繼續工作流程")
|
||
|
||
print("\n✨ Web UI 新功能:")
|
||
print(" - 支援 SSH remote 開發環境")
|
||
print(" - 現代化深色主題界面")
|
||
print(" - WebSocket 即時通訊")
|
||
print(" - 自動瀏覽器啟動")
|
||
print(" - 命令執行和即時輸出")
|
||
|
||
if persistent_mode and session_info:
|
||
interactive_demo(session_info)
|
||
else:
|
||
print("\n✅ 測試完成 - 系統已準備就緒!")
|
||
if session_info:
|
||
print(f"💡 您可以現在就在瀏覽器中測試: {session_info['url']}")
|
||
print(" (服務器會繼續運行一小段時間)")
|
||
time.sleep(10) # Keep running for a short time for immediate testing
|
||
else:
|
||
print("❌ 部分測試失敗,請檢查錯誤信息")
|
||
sys.exit(1) |