dev-manager-tauri/.blueprint/modules/runtime-diagnostics.md
lanrtop eb346ae1fd feat: add runtime diagnostics, health center, and project mentor
运行时可观测性:
- 新增 runtime_logs SQLite 表,提供全局 log_event 写入函数(保留最近 500 条)
- mcp_server/mcp_inject/groups 关键路径接入结构化日志
- MCP 新增 get_diagnostics 工具,返回注入摘要与近期错误
- add_group_member 注入失败时前端显示黄色 toast 警告

健康中心:
- 新增 run_health_check 命令(6 项并行检查:MCP/Git 路径/项目路径/GitHub Token/编辑器/DB 延迟)
- 新增质量指标聚合(休眠项目/孤立项目/注入异常组/无路径项目)
- 侧边栏新增健康中心页面,支持手动刷新和诊断报告复制
- 设置页 MCP 状态改为真实 HTTP ping 检测

项目导师:
- 新增 get_mentor_context 后端命令,聚合健康状态/蓝图摘要/近期错误
- MCP 新增 get_project_mentor_context 工具(含产品组归属校验)
- 项目卡片底部新增 🎓 导师按钮,面板支持复制结构化 Markdown 报告
- 修复 WSL 项目路径识别:wsl_path 存 UNC 格式时自动提取 distro 和 Linux 路径,改用 wsl 命令检查路径存在性(规避 Path::exists() 对 \wsl.localhost\... 不可靠的问题)

AI 工作流:
- 新增 AI-WORKFLOW.md、.claude/skills/ 技能体系配置
- 更新 CLAUDE.md 补充蓝图驱动开发规范
2026-04-04 19:58:49 +09:00

83 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 运行时可观测性
为炼境建立运行时诊断层。当 Claude 需要排查功能状态时,可以通过 MCP 工具直接拿到结构化的真实数据,而不是靠读代码推断。
## 设计思路
```
运行时事件(启动/注入/调用/报错)
SQLite runtime_logs 表(持久化)
MCP get_diagnostics 工具Claude 可调用)
Claude 得到结构化诊断数据 → 精准定位问题
```
同时修复两个已知的 UI 盲点:
- 设置页 MCP 状态硬编码为"运行中",不反映真实端口状态
- 产品组成员注入失败时前端无感知toast 始终显示成功
## 任务卡
### ✅ T1 · SQLite runtime_logs 表
- status: done
- complexity: S
- files: src-tauri/src/db.rs, src-tauri/src/lib.rs
- acceptance:
- db.rs 新增 runtime_logs 表:`(id, ts TEXT, category TEXT, level TEXT, message TEXT, context TEXT)`
- 提供全局 `log_event(category, level, message, context_json)` 函数,内部 get pool 写入
- 表保留最近 500 条(写入时超出自动删除最旧的)
- db::init() 中建表IF NOT EXISTS
### ✅ T2 · 替换 eprintln! 为结构化日志
- status: done
- complexity: S
- files: src-tauri/src/mcp_server.rs, src-tauri/src/mcp_inject.rs, src-tauri/src/commands/groups.rs
- depends: T1
- acceptance:
- mcp_server.rs端口绑定成功/失败 → log_event("mcp_server", "info"/"error", ...)
- mcp_inject.rsinject/remove 成功/失败 → log_event("mcp_inject", "info"/"error", context 含 project_id + group_id)
- commands/groups.rsadd_group_member 注入失败 → log_event("mcp_inject", "warn", ...)
- 保留 eprintln! 作为备份输出log_event 写入失败时不 panic
### ✅ T3 · MCP Server 新增 get_diagnostics 工具
- status: done
- complexity: M
- files: src-tauri/src/mcp_server.rs
- depends: T1, T2
- acceptance:
- tools/list 新增 `get_diagnostics` 工具,无必填参数
- 返回结构:
- `server`:端口号、进程启动时间(从全局 OnceCell 记录)
- `inject_summary`:从 runtime_logs 聚合每个 project_id 最后一次注入的 level + message
- `recent_errors`:最近 20 条 level=error/warn 的日志ts + category + message
- 响应为 Markdown 格式文本Claude 可直接阅读
### ✅ T4 · 注入失败结果返回前端
- status: done
- complexity: S
- files: src-tauri/src/commands/groups.rs, src/components/manage/ManagePage.tsx
- depends: T2
- acceptance:
- add_group_member command 返回 `{ ok: bool, inject_warning: Option<String> }`
- 前端 AddMemberModal注入成功 → 绿色 toast "成员已添加MCP 已注入"inject_warning 有值 → 黄色 toast 显示警告内容
- 产品组成员卡片inject 最后一次为 error/warn → 橙色 `⚠ MCP` 徽标替代绿点hover 显示错误信息
### ✅ T5 · 设置页 MCP 真实健康检查
- status: done
- complexity: S
- files: src-tauri/src/commands/settings.rs, src/lib/commands.ts, src/components/settings/SettingsPage.tsx
- depends: T1
- acceptance:
- 新增 `check_mcp_health` Tauri command尝试 HTTP GET `http://localhost:{port}/health`,返回 `{ ok: bool, latency_ms: u64, error: Option<String> }`
- 设置页 MCP 区块:挂载时自动调用一次,显示真实状态(绿色"运行中 {latency}ms" / 红色"端口未响应: {error}"
- 端口保存后自动重新检查
## 决策记录
- runtime_logs 存 SQLite 而非内存,炼境重启后仍可查历史注入记录
- get_diagnostics 返回 Markdown 而非 JSONClaude 读取更自然,无需额外解析
- T4 只改 add_group_memberremove 失败影响较小(幂等清理),不做 UI 反馈
- 表上限 500 条:足够覆盖数天的操作记录,不会无限膨胀