# v2.8+ 变更记录

> 日期：2026-05-20
> 作者：庞统

## 项目下拉改造

### 项目发现
- 自动扫描 `~/.openclaw/sanguo_projects/sanguo_*` 目录（`discover_sanguo_projects()`）
- 启动时扫描 + 注册到 registry（`source: sanguo_projects_scan`）
- 下拉菜单：📋全部任务 / 📝一般任务（`_general`）/ 正式项目 / ➕新建

### 项目 CRUD
| 操作 | API | 说明 |
|------|-----|------|
| 自动发现 | 启动时自动 | 扫描 sanguo_projects 目录 |
| 手动创建 | `POST /api/projects` | 填写 id + name |
| 归档 | `POST /api/projects/{id}/archive` | status→archived，不显示 |
| 删除 | `DELETE /api/projects/{id}` | status→deleted（逻辑删除，不物理删） |
| 修改 | `PATCH /api/projects/{id}` | 更新 name/description |
| 移动任务 | `POST /api/projects/{id}/tasks/{tid}/move` | 跨项目移动任务 |

### 项目状态
- `active` → 正常显示
- `archived` → 不显示（归档）
- `deleted` → 不显示（逻辑删除）
- 两个状态独立，不重叠

### 特殊项目
| ID | 用途 | 显示 |
|----|------|------|
| `_general` | 一般任务（无归属） | 下拉菜单 + 看板 |
| `_mail` | 邮件系统 | 独立 Tab |

## 轮询 → SSE 改造

### 改造前（轮询）
- 每 5-30 秒 `loadAll()` → `loadLive()` + `loadProjects()` + `loadV2Tasks()`
- 全量替换 `v2tasks` 数组 → 卡片全部重渲染 → 闪屏 + 输入失焦

### 改造后（SSE + 轻量轮询）
- **轮询**：只刷 `loadLive()`（ticker 数据），10-30 秒间隔
- **SSE**：监听 `/api/events`，收到 `task_updated`/`task_completed`/`task_failed` 时只更新单个任务
- **任务列表**：首次加载 / 切项目 / 手动刷新时才全量拉
- **输入保护**：有输入焦点时跳过轮询，blur 2s 后补刷

## 铃铛通知中心

### 对接设计文档（topic7-9）
- 按推送级别分组（🔴🟡🟢🔵）
- 每条通知：时间 + 级别图标 + 内容摘要 + 关联任务链接
- 展开操作按钮（查看任务 / 标记已读）
- 全部已读
- 数据来源：未读邮件 + SSE 实时事件

## TaskModal 项目归属选择器

- 任务详情页显示当前所属项目
- 下拉选择可移动任务到其他项目（调用 move API）
