68 lines
7.0 KiB
Markdown
68 lines
7.0 KiB
Markdown
# 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 浅/深色、窄屏和长列表截图。原版运行端可用后再补同状态像素/动效验收。
|