3.1 KiB
3.1 KiB
实现 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,失败回滚)
注册路由, 完成后提交。