.PHONY: infra infra-down devnats demo e2e test test-go test-web test-py gateway dispatcher mcp-go mcp-py mcp-py-setup web admin desktop desktop-build tidy infra: ## 启动基础设施 (NATS / Postgres / Redis / Milvus / Neo4j) docker compose up -d infra-down: docker compose down devnats: ## 启动内嵌 JetStream NATS(无 Docker 本地联调) cd sundynix-shared && go run ./cmd/devnats demo: ## 一键演示 Gateway→NATS→Dispatcher 任务流(无需 Docker) bash scripts/demo.sh e2e: ## 跑共享 bus 的端到端测试(内嵌 NATS):任务流 / 工具调用 / Token 流 cd sundynix-shared && go test ./bus/ -run 'TestTaskRoundTrip|TestToolCallRoundTrip|TestTokenStreamRoundTrip' -v test: test-go test-web ## 跑全部测试(后端各模块 go test + 前端类型检查) test-go: ## 各 Go 模块单测(DB 集成测试无 MEMORY_TEST_DSN 自动跳过) cd sundynix-shared && go test ./... cd sundynix-gateway && go test ./... cd sundynix-dispatcher && go test ./... cd sundynix-mcp-go && go test ./... test-web: ## 前端 TypeScript 类型检查 cd sundynix-desktop/frontend && npx tsc --noEmit test-py: ## mcp-py 沙箱守卫测试(需 venv;缺 pytest 用内置 harness 兜底) cd sundynix-mcp-py && ( PYTHONPATH=src:tests .venv/bin/python -m pytest tests/ -q 2>/dev/null \ || PYTHONPATH=src:tests .venv/bin/python -c "import test_sandbox as t; \ fns=[getattr(t,n) for n in dir(t) if n.startswith('test_')]; \ [ (f(),print('PASS',f.__name__)) for f in fns ]; print(f'{len(fns)} passed')" ) gateway: cd sundynix-gateway && go run ./cmd/server dispatcher: cd sundynix-dispatcher && go run ./cmd/dispatcher mcp-go: cd sundynix-mcp-go && go run ./cmd/server mcp-py-setup: ## 创建 venv 并安装 mcp-py 依赖(首次运行 mcp-py 前执行) cd sundynix-mcp-py && python3 -m venv .venv && .venv/bin/pip install -q -e . mcp-py: ## 运行 Python 算法型 MCP 工具服务(缺 venv 则自动 setup) cd sundynix-mcp-py && [ -x .venv/bin/python ] || $(MAKE) mcp-py-setup cd sundynix-mcp-py && .venv/bin/python -m sundynix_mcp_py.main web: ## 桌面端前端 dev(Vite :5173,连本地 Gateway:8080) cd sundynix-desktop/frontend && npm install && npm run dev admin: ## 运维控制台 dev(Vite :5174,配置 LLM 模型等控制面) cd sundynix-admin && npm install && npm run dev desktop: ## 真实桌面端开发模式(Wails 原生窗口 + 热重载;需先 make infra + 后端 + 配模型) cd sundynix-desktop && GOWORK=off wails dev desktop-build: ## 打包桌面端为原生应用(产物在 sundynix-desktop/build/bin/) cd sundynix-desktop && GOWORK=off wails build tidy: cd sundynix-gateway && go mod tidy cd sundynix-dispatcher && go mod tidy cd sundynix-mcp-go && go mod tidy