运行时可观测性:
- 新增 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 补充蓝图驱动开发规范
83 lines
3.7 KiB
Markdown
83 lines
3.7 KiB
Markdown
# 运行时可观测性
|
||
|
||
为炼境建立运行时诊断层。当 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.rs:inject/remove 成功/失败 → log_event("mcp_inject", "info"/"error", context 含 project_id + group_id)
|
||
- commands/groups.rs:add_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 而非 JSON,Claude 读取更自然,无需额外解析
|
||
- T4 只改 add_group_member,remove 失败影响较小(幂等清理),不做 UI 反馈
|
||
- 表上限 500 条:足够覆盖数天的操作记录,不会无限膨胀
|