PMFlow/mdproject/inbox-feed-list-refactor-ta...

5.7 KiB
Raw Blame History

消息台重构任务单(卡片改列表 Feed)

目标:把消息台从双列卡片重构为高密度列表 Feed,保证用户可读、可操作、可追溯。
范围:仅前端(不改后端接口)。
新增硬约束:信息流严格按时间倒序,最新在上。


0. 实施原则(先定边界)

  • 不改 backend 接口与字段,仅做前端映射/渲染重构。
  • 保持 buildInboxView 领域聚合能力不变,避免影响 TopBar 与其他入口。
  • 用户视角文案与技术字段解耦:技术字段可在行内展开区可见,默认隐藏。
  • 主列表排序规则统一:updated_at || created_at 降序(最新在上)。

1. 现状定位(SCOUT)

  • 定位页面入口:frontend/src/pages/InboxPage.tsx
  • 定位数据聚合:frontend/src/lib/inbox.ts
  • 定位类型定义:frontend/src/types/inbox.ts
  • 定位顶部铃铛预览依赖:frontend/src/components/layout/TopBar.tsx
  • 确认以下信息:
    • 列表数据来源接口(notifications + ai-pmo work-items)
    • 当前卡片组件边界(InboxCard)
    • Tab 分类逻辑位置(activeSection + display_kind)

2. 爆炸半径评估(TRACE)

  • 执行 FIND_USAGE buildInboxView
  • 执行 FIND_USAGE InboxDisplayKind
  • 执行 FIND_USAGE InboxSectionKey
  • 执行 FIND_USAGE getInboxSectionLabel
  • 评估结论记录:
    • InboxPage 改造是否会影响 TopBar 预览行为
    • 是否需要保持 action_required|auto_running|auto_done|info 内部枚举不变

说明:本次推荐保持内部枚举不变,仅在 UI 层映射为“待处理/进行中/已完成/全部”。


3. 组件与文件改造清单(SNIPER)

3.1 新增文件

  • frontend/src/components/inbox/InboxListItem.tsx
  • frontend/src/lib/inboxTextMap.ts
  • frontend/src/lib/formatInboxTime.ts

3.2 修改文件

  • frontend/src/pages/InboxPage.tsx
  • frontend/src/components/layout/TopBar.tsx(复用统一时间格式函数,可选;本次保持现状未改)
  • CLAUDE.md(目录结构变更同步)

4. 列表行设计规范

4.1 两种行高

  • 需要操作行:72px
    • 左:状态图标 + 标题 + 副标题
    • 右:项目名、时间、主操作、详情
  • 纯通知行:52px
    • 左:状态图标 + 标题 + 副标题
    • 右:项目名、时间、详情

4.2 行内交互

  • 点击行本体:展开/收起详情(inline,不跳页)
  • 点击主操作按钮:执行动作,不触发行展开
  • 点击详情按钮:仅展开详情(或打开详情弹窗,二选一,需统一)

4.3 详情展开区(默认折叠)

  • 显示技术字段:intent 原始值、typed actions、chat_id、完整时间戳、重复次数、撤销信息
  • 默认主行不出现技术字段

5. 文案映射策略(用户视角)

5.1 intent 映射(显示层)

  • signal_source.onboard → 信号源接入
  • signal.create → 新信号识别
  • project.create → 项目已创建
  • query.read_only → 信息查询
  • followup.confirm → 确认执行
  • followup.continue → 跟进处理
  • ignore → 系统忽略

5.2 状态映射(显示层)

  • action_required → 待处理
  • auto_running → 进行中
  • auto_done → 已完成
  • info → 通知

5.3 标题清洗规则

  • 优先使用 notification.title / work_item.title
  • 包含 给项目ID: 前缀时仅保留后半段
  • registry# 替换为 历史记录
  • 去除明显技术噪音字段展示(默认行)

6. Tab 重构(不改底层枚举)

用户 Tab(展示)

  • 待处理(映射 action_required)
  • 进行中(映射 auto_running)
  • 已完成(映射 auto_done)
  • 全部(映射 all)

计数规则

  • 每个 Tab 角标来自当前项目过滤后的实时集合
  • 全部 = 待处理 + 进行中 + 已完成 + 通知(若通知不单列则并入全部但不单独显示)

7. 时间与排序规则(强制)

7.1 时间显示

  • 1 分钟内:刚刚
  • 1 小时内:X 分钟前
  • 当天:HH:mm
  • 昨天:昨天 HH:mm
  • 更早:MM-DD HH:mm

7.2 排序(硬约束)

  • 主 Feed 严格按 updated_at || created_at 降序。
  • 最新消息永远在最上方。
  • Tab 切换、搜索、项目筛选后仍保持同一倒序规则。
  • 如时间缺失:降级到 created_at;仍缺失时排到分组末尾。

8. 首屏密度与布局调整

  • 折叠/压缩顶部指标区(避免占用过高首屏)
  • 列表单列展示(移动端与桌面统一 Feed 心智)
  • 状态筛选仅作为过滤器,不采用任何看板分栏布局
  • 验证 1080p 下首屏可见条数 >= 8

9. 验收标准(Definition of Done)

  • 一屏可见条数 >= 8
  • 主列表默认无技术字段暴露(展开区除外)
  • Tab 筛选准确:待处理/进行中/已完成/全部
  • 时间显示全部为相对/友好格式
  • 点击行可展开/收起详情
  • 主 Feed 严格“最新在上”
  • npm run build 通过
  • tsc --noEmit 零错误

10. 自检命令(前端)

cd frontend
npm run build
npx tsc --noEmit

技术词裸露扫描(渲染主行):

rg -n "typed actions|read_only|registry#|chat_id" frontend/src/pages frontend/src/components/inbox

期望:仅允许出现在“展开详情区”相关代码路径,不允许出现在默认主行渲染文本。


11. 交付物

  • 变更文件清单
  • 首屏可见条数描述(含测试分辨率)
  • 排序规则验证说明(最新在上)
  • 构建与类型检查结果