Files
ycode/docs/协作/TodoWrite样式-REA核对-2026-10-21.md
T

68 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TodoWrite 任务列表:REA 核对
日期:2026-10-21。状态:只读调查,未修改产品代码;正式开发要求见 [B05-需求.md](B05-需求.md)。
## 结论
用户“编译并且发布”会话实际调用的是 TodoWrite。当前 YCode 的 TodoWriteView 与已取得的 WorkBuddy 原版实现不一致,包含节点结构、状态图标、完成态、显示数量、展开生命周期及原始返回文本泄漏。
订正前一轮初步判断:原版也使用可展开工具壳及灰色内容区域。不能把“改掉通用外壳”理解为删除原版的展开壳或灰色背景;需要恢复其专用头部和内部 PlanTask 结构。
## 原版证据与边界
- 历史运行取证版本:WorkBuddy 5.8.2 / Electron 37.10.3。脚本来自既有 REA 导出 `.tmp/rea-runtime-scripts.json`,Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`。本轮仅对 REA 导出副本做摘要校验和文本定位,没有直接读取安装目录中的脚本文本、连接自建 CDP、执行原版代码或手写 ASAR 提取器。
- 本轮 REA 核对当前安装包:ASAR SHA-256 `026a1d0805a2366d06390cef52e157a7277543cdd27dd308e6b1acb47ffffdc1`。库存分析父 Evidence `ev_08c2677882c4253ac1ad980cdd624a9ad24e7a71f6659b67ae3fcc85f92091a9`。
- REA 模块身份追踪:`ev_d3742a7961179eaeeadd0429433f7f7280e8c784fbcbd0f0332eec8b5c16e7c8`。确认当前包仍含 `renderer/assets/src-DbE1_mgM.js`,SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`,与历史导出逐字节摘要相同。因此可复用此脚本的静态结论;没有假定整个当前应用等于历史版本。
- 本轮选定脚本静态分析父 Evidence `ev_659d7bed5807c8796e0e934ef0d684999a3b85e41d62882bf7dcca1cdf4da8c4`。AST 已解析,语义图覆盖部分且有容量限制;不能把图中无匹配当作功能不存在。具体渲染判断来自上述已验摘要的 REA 导出文本。
- CSS:既有 REA 导出 `.tmp/rea-css-recovered/manifest.json`,Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。`src-CyXHA0IC.css` SHA-256 `a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe`,本轮复验导出文件摘要一致。尚未复核当前包 CSS 是否变化。
- 原版 9223 调试端点不可达,未做本轮运行截图、当前激活分支或像素对比。REA 全 ASAR 导出还受缺失的 darwin_arm64 koffi unpacked 文件阻断,未伪造该文件或绕过 REA。部分 native 文件库存摘要矛盾按 record-and-continue 明确保留,不以其证明目标脚本或整个包可信。
## 已确认的原版逻辑
下列偏移为 `src-DbE1_mgM.js` 的 UTF-16 文本偏移。
1. `convertTodoWrite`(1112397):读取 args / _rawInput 的 todos,规范化任务内容、activeForm、id、status;计算 completedCount、totalCount 和 merge。结果不以 SDK 成功提示作为列表正文。
2. `TodoWriteView`(1112868 附近):非空列表使用 `ToolExpandable`,头部类名 `cr-tool-head--todo-write`。普通标题“任务列表”;merge=true 时头部显示“进度 completed/total”。内部直接使用 PlanTask,没有第二个“任务列表”摘要。
3. `ToolExpandable`(988614):`expand=isLastContent`;初始由 defaultExpanded 或 expand=true 决定。后续 expand 从 true→false 收起,false→true 展开,允许局部手动开关。不是只在首次挂载读取 isLastContent。
4. `StatusGlyph`(1063565):completed 为 TaskCheckIcon,failed 为 FailedIcon,in_progress 为 LoaderIcon,pending 为边框圆点。
5. `windowTasks`(1064047)及 `PlanTask`(1064293):viewMode=true,maxDisplay 默认 5。超过 5 项时优先以第一个 in_progress 为中心截取窗口;若没有进行中任务,围绕最后一个 completed 项;连 completed 也没有时从开头显示。索引在首尾作边界约束。原代码的 `lastIndexOf(!0)` 等价于 `lastIndexOf(true)`,初稿将其写成“非 completed”有误,已订正。
6. 行结构为 `cr-tool-plan-task__row / __glyph / __text / __action`。进行中优先显示 activeForm;完成项使用 `__text--done`。传入 onTaskClick 时具有按钮角色、Tab、Enter/Space 和动作箭头,发出 `tool.todo.task.click`;此事件本身不证明项目待办已创建或具体打开哪个页面。
7. 错误态和空列表仅呈现对应头部,空列表运行中附“接收中”提示;不是添加一个空的通用结果卡。
CSS 静态契约:
- 标题和任务文字 15px;文字行高 1.75,单行省略。
- 列表纵向 gap 4px;每行 gap 8px,圆角 8px,padding `1px 4px 2px`。
- 状态槽宽 16px、最小高度 25px;图标 16×16px;待执行圆点 12×12px。
- 进行中文字 font-weight 600;spinner 2 秒线性循环。
- 已完成文字弱化并加删除线。
这里存在另一套旧的 `cb-plan-task-*` 实现,不能因为类名相似就混用;TodoWrite 注册到的现代分支使用上面的 `cr-tool-plan-task*`。
## 与 YCode 的差异
当前位置:`src/renderer/src/workbuddy/conversation/ToolCallRenderer.tsx` 的 TodoWriteView。
| 项目 | 原版已证 | YCode 当前 |
| --- | --- | --- |
| 头部和内容 | 专用头部 + ToolExpandable + PlanTask | CapturedToolCard 内再加 ToolSummary |
| 状态 | 勾选 / spinner / 圆点 / 失败图标 | OK / > / - / x |
| 任务行 | cr-tool-plan-task 专用结构 | 借用 cb-plan-task,不是对应原版分支 |
| 完成项 | 弱化及删除线 | 没有挂接相应完成态节点 |
| 显示数量 | 默认最多 5 项,按进行中位置选窗口 | tasks.map 显示全部 |
| 展开生命周期 | expand 跟随 isLastContent 的边沿变化 | 仅 defaultExpanded 初始值 |
| 工具返回 | 专用组件不追加 SDK 原始提示 | ToolOutput 直接追加英文 SDK 成功文本 |
| 点击与键盘 | 任务点击事件、按钮角色和键盘操作 | 当前行没有对应交互 |
用户这条会话已保存的两次列表分别为 6 项、7 项;按该原版分支,不应无条件把所有任务一次展开展示。不能把各次工具调用的历史快照直接认定为重复数据错误。
## 后续修复与验收建议
- 复用现有 SourceToolExpandable 及原版恢复的 SVG/CSS,补一个与原版 PlanTask 对应的共享组件;不要全局修改计划卡或其他工具。
- TodoWrite 的 SDK 提示保留在存储中,展示投影不直接追加到普通列表正文;真实错误按原版错误态处理。
- 用 0、1、5、6、7、长列表,首/中/尾进行中、无进行中、全部完成、failed、长文本验证显示窗口和状态。
- 验证 isLastContent true→false→true、局部手动开关、外层完成块收起再展开、切换会话,避免覆盖既有展开状态修复。
- 验证进行中的 activeForm、完成项删除线、图标、空/错误态和 merge 进度头部。
- 补键盘操作和事件归属;不得为行点击虚构项目任务或未经证实的跳转结果。
- 最终需要 YCode 真实 Electron 浅/深色、窄屏和长列表截图。原版运行端可用后再补同状态像素/动效验收。