85 lines
3.1 KiB
Markdown
85 lines
3.1 KiB
Markdown
实现 Kanban 增强(P0-4)。后端 API + 前端五列看板页面。
|
||
|
||
核心定位: Kanban 是蜂群任务的电子沙盘——观察全貌、发现异常。不做批量 dispatch/创建任务/goal_mode 配置(这些走 Hermes CLI)。
|
||
|
||
## 后端: Kanban API
|
||
|
||
创建 backend/app/api/kanban.py,全部 require_auth
|
||
|
||
### 1. GET /api/v1/kanban/tasks
|
||
跨 Profile 五列任务聚合:
|
||
- 数据来源: hermes CLI `hermes kanban list` 解析
|
||
- 支持 ?worker=xxx&board=xxx&anomaly=blocked_timeout|unclaimed|retry_failure
|
||
- 返回五列数据: {todo: [...], ready: [...], running: [...], blocked: [...], done: [...]}
|
||
- 概览条: total_tasks, profile_count, running_count, blocked_count
|
||
- 暂用 Mock 数据(TODO: CLI integration)
|
||
|
||
### 2. GET /api/v1/kanban/tasks/{id}
|
||
任务详情:
|
||
- Meta: board, worker_profile, worker_type, priority, created_at, updated_at, goal_mode, retries/failures
|
||
- Body: 任务描述(Markdown)
|
||
- 关联: 依赖任务, 被依赖任务
|
||
- 活动: 最近操作时间线
|
||
|
||
### 3. PATCH /api/v1/kanban/tasks/{id}/move
|
||
拖拽移动:
|
||
- body: {column: "ready"|"running"|"blocked"|"done", block_reason?: "阻塞原因(≥10字)"}
|
||
- 拖入 BLOCKED 需填写阻塞原因
|
||
- 拖入 DONE 二次确认(前端)
|
||
|
||
### 4. 异常检测(内置逻辑)
|
||
服务端计算任务异常标记:
|
||
- blocked_timeout: BLOCKED 列超 24h → 标红
|
||
- unclaimed: TODO 列超 3 天 → 标黄
|
||
- retry_failure: 失败重试≥3 次 → 标红
|
||
|
||
## 前端: Kanban 页面
|
||
|
||
修改 frontend/src/pages/KanbanPage.tsx:
|
||
|
||
### 顶部概览条
|
||
- "当前 N 个任务 · M 个 Profile · K 个 RUNNING · B 个阻塞"
|
||
- RUNNING 蓝色, 阻塞橙色
|
||
- 右侧筛选下拉: Worker / 看板 / 异常状态
|
||
|
||
### 五列看板
|
||
- TODO / READY / RUNNING / BLOCKED / DONE
|
||
- 每列头: 列名(彩色) + 任务计数
|
||
- BLOCKED 列橙色边框 + 左边框
|
||
- 列宽 min 240px, 五列一屏可见
|
||
- 列内容纵向滚动, 列头 sticky
|
||
|
||
### 任务卡片
|
||
- 标题(粗体, 最多两行) + Worker Profile 名 + 蜂型图标
|
||
- 状态标记: 🎯 goal_mode, ⚡ 高优先级
|
||
- 创建时间(相对时间 "2h ago")
|
||
- BLOCKED 列卡片显示阻塞原因(一行截断)
|
||
- 卡片左侧色条: P0=红, goal_mode=金, blocked=橙
|
||
- 卡片 hover 边框变 honey
|
||
- 异常卡片: 阻塞超时红色, 长期无主黄色, 失败重试红色
|
||
- 点击卡片 → 打开详情抽屉
|
||
- 卡片 Checkbox (hover 显示)
|
||
|
||
### 拖拽
|
||
- 桌面端支持拖拽卡片到任意列
|
||
- 拖入 BLOCKED 弹出阻塞原因输入框(必填 ≥10字)
|
||
- 拖入 DONE 二次确认
|
||
- 移动端禁用拖拽
|
||
|
||
### 任务详情抽屉 (Drawer 组件, 480px)
|
||
- Header: 状态 Badge + 标题(可编辑) + ✕
|
||
- Meta: 看板, Worker, 类型, 优先级, 创建/更新时间, goal_mode, 重试次数
|
||
- Body: Markdown 描述, goal_mode 验收标准 checklist(可勾选), 阻塞原因
|
||
- 关联: 依赖/被依赖任务链接(点击跳转)
|
||
- 活动: 时间线(操作人+时间)
|
||
- Footer: [编辑] [标记阻塞] [标记完成] [删除]
|
||
|
||
### 批量操作栏(底部浮现)
|
||
- 勾选≥1 张卡片后底部浮现操作栏
|
||
- [标记完成] [标记阻塞] [清除选择]
|
||
- 不做 Dispatch(走 CLI)
|
||
|
||
### 四态覆盖 + 乐观更新(拖拽后即时更新 UI,失败回滚)
|
||
|
||
注册路由, 完成后提交。
|