25 KiB
WorkBuddy 复刻 TODO(2026-10-17)
本清单记录用户最初提出的 20 项问题及后续追加项,作为后续逐项拆解、实现和验收的工作入口。原始编号保持不变,新增需求顺延编号。本清单的建立与追加仅记录需求,不代表已完成对应采集或实现。
执行约定
- 查看 WorkBuddy 的源码、CSS、资源、页面及交互行为一律使用 REA。
- 已有内容沿用 WorkBuddy 5.8.2 的有效 REA 证据;此前未覆盖的内容再采集,并注明实际版本、Evidence ID、观察范围及限制。
- 每项依次记录:证据整理 → 差异与方案 → 实现 → 功能验证 → 视觉/交互验收。实现或构建通过不等于完成 1:1 验收。
- 只有全部验收点通过才勾选完成;记录待拆解的模块保持未完成状态。
- 优先保留用户会话、草稿、空间、模型配置和已有产物。回退、归档、删除应分别建模,不混用同一操作。
- 消息时间沿用已确认规则:当天
HH:mm;本年非当天M月D日 HH:mm;非本年YYYY年M月D日 HH:mm。显示消息时间,不显示实时钟表时间。
对话与侧栏
01. 任务操作菜单
- 将侧栏对话条目后的直接删除按钮替换为原版任务操作入口。
- 通过 REA 对齐菜单的入口、位置、顺序、图标、文案、悬停、关闭、禁用和确认状态。
- 接入:置顶、取消置顶、重命名、独立窗口中打开、打开文件夹、归档、删除任务。
- 验收:置顶顺序和重命名持久化;独立窗口打开正确任务;文件夹指向正确工作目录;归档与删除行为独立;涉及运行中任务时有明确处理。
状态:主体已实现;运行中任务的处理与逐像素截图比对未完成。
原版证据:WorkBuddy 5.8.3,REA Evidence ev_f5e9d71a676c453daab40928acfb33aeabae68ba57ffda342380cead7f1a1fe2(任务菜单打开态),归档 .tmp/rea-css-evidence/ev_f5e9d71a….json。观察范围:任务列表首条任务的菜单容器、9 个条目、2 条分隔线、逐项 SVG 图标、几何与 computed style;未覆盖:菜单在窗口边缘翻转、运行中任务状态、分享/保存到工作空间/批量操作三类条目的行为。
原版菜单为 9 项:置顶(已置顶时为“取消置顶”)、重命名、分享任务、在独立窗口中打开、保存到工作空间、打开文件夹、批量操作、归档、删除任务。其中分享任务、保存到工作空间、批量操作依赖云端或尚未实现的能力,按“不渲染无效入口”的原则暂不列出,YCode 当前渲染 6 项。
原版实测数值:容器 170×352、left = 按钮 left − 17、top = 按钮 bottom + 4、padding 8、圆角 16、最小宽度 160;条目 32 高 / 14px / 22px 行高 / 圆角 8 / 图标 16×16;分隔线 1px、margin 6px 0;危险色 #b42c3f、普通文字 rgba(0,0,0,0.9);卡片内“更多”按钮 16×16 且默认 display:none,悬停时替换时间显示。
实现:Sidebar.tsx(行结构、置顶排序、行内重命名、菜单挂载)、task-menu.tsx(菜单容器与条目)、task-menu.css(原版规则与深浅色取值)、task-menu-icons.tsx(逐项 SVG 原样复刻)、stores/chat.ts(setPinned / setArchived / renameSession)、main/sessions.ts(pinnedAt / archivedAt 持久化与排序)、main/ipc.ts(pin / archive / openFolder / openWindow)、main/index.ts(任务独立窗口)、shared/types.ts+shared/ipc.ts+preload/index.ts(契约)。
验证:scripts/verify-task-menu.cjs 在真实隔离 Electron(真实 preload / IPC / 文件系统)中 33 项断言全部通过,覆盖菜单文案与顺序、两条分隔线、逐项几何与配色、锚点偏移、遮罩关闭、置顶与取消置顶持久化、行内重命名持久化、归档保留会话与消息、删除真正移除、打开文件夹指向真实 cwd、独立窗口创建且携带 window=task&taskId=…。报告与截图:.tmp/task-menu-Moulvm/。npm run typecheck、npm run test:conversation、npm run build 通过;npm run test:sessions 在干净 HEAD 上同样报 yaml 动态 require 失败,与本次改动无关。
遗留:未覆盖运行中任务的置顶/归档/删除副作用与提示;未做原版逐像素截图比对;置顶标识图标取自同批归档的成员图标,原版置顶行的独立截图证据未采集。
02. 表格“添加到对话”及引用结果
- 对齐表格上方“添加到对话”按钮的字体、图标、背景、边距、出现条件及交互。
- 对齐点击后输入区内引用表格的呈现,包括结构、预览、移除和与已有草稿的组合方式。
- 对齐发送后用户消息中的表格引用显示。
- 验收:引用正确表格内容,不丢失已有草稿;输入区、发送结果及历史重载三种状态一致。
状态:主体已实现并做了真实窗口回归;仍有两处原版证据缺口(见“遗留”)。
原版证据:
- 渲染器实现:WorkBuddy 5.8.3 渲染器(REA 回收
.tmp/wb-src-DbE1_mgM.js)中的TableMessageQuoteAction、createTableMessageQuoteSourceId、getTableMessageQuoteMessageId、MessageQuoteAddIcon、MessageQuoteTextIcon、ChipCloseIcon、QuoteReferenceCard、InputBannerRail、MessageQuotePhraseTag、convertUserFrame/ContextChipsRenderer。 - 菜单几何:REA Evidence
ev_38cca1ac66606ab07fb495035e3509f5c4d8ec3e5e2b74d0fdcfcfadb120da3b(layout.json中.cr-message-quote-table-menu116×38、按钮 106×28、top:8px right:8px、padding 4、圆角 8、条目 14px/22px/500、padding 3px 8px、gap 4、圆角 6、图标 16×16 两条 path、rgba(0,0,0,.08) 0 4px 16px阴影)。 - 样式:REA 回收样式表
src-CyXHA0IC.css(SHA-256a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe)40 条引用相关规则,含._tag_1krka_19及其 message-quote/:readOnly变体、._iconContainer_1krka_38、._icon_1krka_38、._text_1krka_66、.cr-message-quote-phrase-*、.cr-input-quote-card*、.cr-input-banner-rail、.cr-context-chips、.cr-user-content。 - 观察范围:桌面端浅色主题、单条助手消息中的 markdown 表格、输入区空白草稿。未覆盖:原版实际点击后输入区卡片与消息气泡标签的截图/几何(见遗留)。
实现:
shared/conversation.ts新增MessageQuote(id、kind、sourceId、messageId、markdown、title?、preview);ChatMessage.quotes、SendPayload.quotes、ComposerSendPayload.quotes贯通消息与 IPC。workbuddy/conversation/MessageQuoteIcons.tsx:MessageQuoteAddIcon、MessageQuoteTextIcon、ChipCloseIcon按回收 path 原样复刻。workbuddy/conversation/TableMessageQuoteAction.tsx:原版 DOM 结构(div.cr-message-quote-table-menu+data-message-quote-table-added+data-message-quote-source-id、按钮aria-label="添加到对话"),sourceId 用原版createTableMessageQuoteSourceId组合规则。workbuddy/conversation/message-quote-source.css:菜单/按钮、已加入描边、引用标签(含只读态)、引用卡片、短语标签与 tooltip 规则,均照搬回收声明。workbuddy/conversation/MessageQuoteCard.tsx、MessageQuoteTag.tsx:输入区卡片与消息只读标签。MarkdownContent/ReactMarkdown:renderTableAction改为输出原版组件,新增sourceId(${messageId}-text-${index})与quotedSourceIds。ComposerControls:输入框上方 rail 渲染引用卡片,支持移除与点击定位;发送载荷带quotes;只有引用时也可发送。ChatPane:草稿新增quotes;quoteTable改为挂引用而不是把 markdown 追加进正文;点击卡片回到来源表格并临时置data-message-quote-anchor-active;编辑/重发/重新生成沿用历史引用。MessageBubble:用户消息内新增只读引用标签(.cr-context-chips)。main/ipc.ts:引用快照写入userMessage.quotes,引用 markdown 随消息一并进入模型提示;空文本但有引用时允许发送。
验证:scripts/verify-quote-table.cjs 在真实隔离 Electron(真实 preload/IPC/渲染进程与文件系统)中 48 项断言全部通过,覆盖菜单/按钮几何与配色、:focus-within 显隐、已加入描边(#40d1b3)、输入区卡片(圆角 10 / padding 8 / gap 8 / 强调条 3px / 16×16 移除按钮 / rail 0 16px 8px 与 gap 6)、草稿不被覆盖、移除后按钮恢复、chat:send 真实 IPC 载荷(正文+引用 markdown+sourceId)、发送后只读标签(22 高 / 圆角 6 / padding 2px 6px / 13px/14px/500 / 只读底色 / data-content-block-meta-type=message-quote)、历史重载一致。报告与截图:.tmp/quote-table-SI0PNC/(另有 .tmp/quote-table-yiKDIs/)。npm run typecheck、npm run test:conversation、npm run build 通过。
遗留:
- 未取到原版“点击后输入区卡片”和“发送后消息标签”的实际截图与几何:探针在打开的会话里没有找到可引用的表格(
hover .cr-table-block返回 "Selected node is absent"),因此这两态是按渲染器源码与回收样式表实现,视觉未与原版逐像素比对。 - 原版
--cr-brand-secondary(以及--cr-bg-brand-subtle、--cr-border-brand-subtle)在回收样式表中只有使用、没有定义;同版本contexts-BkjwYSZT.css给出的兜底值是#40d1b3,YCode 暂按该兜底值定义并已在注释中标注,待取到原版运行时 token 后替换。 - 输入区引用卡片中的“来源标题”在原版由宿主(
message.quote.add处理端)生成,尚未采集;YCode 当前不显示标题,只显示内容摘要,不臆造文案。
03. 编辑已发送消息
- 拆解原版编辑入口、编辑容器、文本排版、按钮、焦点与键盘交互。
- 对齐进入编辑、修改、取消、提交及失败状态。
- 验收:编辑正确消息;取消恢复原内容;提交后的消息分支与产物处理符合已确认行为。
状态:主体已实现,并通过真实窗口回归与真实 IPC 回归;工具条淡入/提示出现时序未逐帧采集。
原版证据:
- 渲染器实现(REA 回收
.tmp/wb-src-DbE1_mgM.js):UserMessageEditProvider、UserMessageEditor/UserMessageEditorContent(校验规则empty/too-long,上限1e4;message.edit.submit;错误码映射userMessage.edit.error.retryLater;RenderNoHandlerError→sendFailed;外部 mousedown 关闭规则与豁免选择器)、ToolbarRenderer(cr-toolbar= 时间 + 复制 + 恢复此版本 + 编辑;编辑中或已丢弃时不渲染)、IconButton、RevertToBeforeIcon、LoadingSpinnerIcon、formatMessageTime。 - 样式:REA 回收样式表
src-CyXHA0IC.css(SHA-256a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe)中 21 条.cr-user-message-editor*/.cr-self-bubble--editing规则与 13 条.cr-toolbar*规则。 - 文案:REA Evidence
ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb中userMessage.edit.*、userMessage.action.*、markdown.copy/markdown.copied的 zh-CN 与 en-US。 - 运行时几何与样式:
ev_245ea1740cde21869500348e47cf9663a1ea72943ccfe79c163a6838a153bfd3(工具条 97.23×28、时间 33.23×20、复制/编辑按钮 24×24、图标 14×14;无产物会话不显示恢复按钮;编辑态气泡 535×110、编辑器 511×94、输入容器 50、页脚 44、提示 369×18、取消 62×32、发送 60×30)、ev_5dd78e06e75b3a29b656d328c2efc2a820ea197e8204a39840207188a6496a0f(编辑器保持打开)、ev_ee345b160e5f520ed866c1059b7c72e77b34e49bf1ce407cd266ea886aa86405(编辑态布局快照与计算样式:容器透明/无边框/无阴影/min-height:50px、宿主min-height:64px、可编辑区 15px/1.75、提示 13/18rgba(0,0,0,.5)、取消边框1px rgb(235,235,235)、发送rgb(26,26,26)/白字、InfoIcon path)、ev_308764954de03fa28e4a980d609d33eabf794c44ce6733bfe1b83cec36ef562a(取消关闭并恢复原气泡)。 - 观察范围:桌面浅色主题、单条用户消息;覆盖无产物写入会话(工具条无恢复入口)与含
write_file记录会话(出现恢复入口)。未覆盖:工具条淡入与 tooltip 出现的逐帧时序、未发送/被丢弃消息的“恢复到此版本”状态。
实现:
workbuddy/conversation/UserMessageEditor.tsx:就地编辑器,原版 DOM(cr-user-message-editor>cr-input-container-wrapper/cr-input-container/cr-input-editor-host+[data-slate-editor]可编辑区、__error、__footer/__hint/__hint-icon/__actions/__cancel/__send);空内容与 10000 字符校验、Enter 提交(Shift+Enter 换行)、提交中禁用按钮并显示 spinner 与aria-busy、失败文案按error.retryLater/sendFailed映射、外部 mousedown 仅在没有改动且未提交时取消。workbuddy/conversation/MessageEditorIcons.tsx:RevertToBeforeIcon、EditorInfoIcon、EditorSpinnerIcon按回收源码与运行时svg_nodes原样复刻。workbuddy/conversation/message-edit-source.css:补齐 18 条缺失回收规则(含编辑容器min-height:50px与:focus-within去阴影以覆盖宿主适配规则);.cr-self-bubble--editing与:has(.cr-user-message-editor)复用source-styles.css已有声明。workbuddy/message-actions/UserMessageToolbar.tsx:div.cr-toolbar[data-message-id][role=toolbar],时间按三档格式显示;复制按钮 2000ms 内切换“已复制”且 tooltip 不因点击隐藏;恢复此版本仅在存在可回退产物时渲染并透传禁用态;编辑按钮受会话忙状态约束;图标按钮为button.cr-icon-button[data-action][aria-label]+svg.cr-icon-button__icon。workbuddy/message-actions/message-copy.ts:抽出用户消息复制回退链,旧MessageActionToolbar复用同一实现。components/MessageBubble.tsx/components/ChatPane.tsx:新增editingMessageId与startEdit/cancelEdit/submitEdit;编辑态用编辑器替换气泡内容并卸载工具条;提交走send(..., { fromMessageId, action:'edit' });移除底部输入框“编辑消息”横幅与用户消息的“重新发送”入口。main/workspace-revert.ts新增rollbackEditedArtifacts;main/ipc.ts的chat:send在action==='edit'时先回退产物(无写入记录则跳过;记录不完整则拒绝提交),原生分支失败时撤销文件回退。
验证:node scripts/verify-user-message-edit.cjs 在真实隔离 Electron(真实 preload/IPC/渲染进程,chat:send 桩记录载荷)中 50 项断言全部通过,覆盖工具条几何/配色/时间格式/按钮集合与图标(copy/revert/edit、14×14、viewBox 16/14)、悬停显隐、进入编辑、编辑器几何与排版(容器 50/宿主 64/可编辑 15px·1.75/提示与按钮尺寸)、取消恢复原内容、有改动时外部 mousedown 不关闭、空内容校验阻断提交、提交中禁用 + spinner + aria-busy、action:'edit' + fromMessageId 真实 IPC 载荷、Enter 提交、无渲染器报错;报告与截图:.tmp/edit-O1kT3A/(早期 .tmp/edit-2MoqPF/、.tmp/edit-624Sw3/)。npm run test:conversation-ipc 新增 testEditArtifactRollback,覆盖真实主进程语义:产物回退到消息前版本、历史前缀保留并追加替换消息、原生分支失败时撤销文件回退且会话不变、无产物改动可直接编辑、含不可回滚工具时拒绝编辑且文件与会话不变。npm run typecheck、npm run test:conversation、npm run test:recovered、npm run test:chat、npm run build 均通过。
遗留:
- 工具条淡入(
opacity .2s,hover 后transition-delay:0s)与 tooltip 出现时序未逐帧采集,当前按回收 CSS 声明实现,未做像素级时序比对。 - 原版提交失败的错误码集合(
resend-settle-timeout、cancel-barrier、send-in-progress等)仅有映射表证据;YCode 目前只区分“上一轮未结束”和“其它失败”两类文案。 - 原版
userMessage.edit.resume(恢复到此版本)依赖未发送/被丢弃消息状态,YCode 暂无对应状态,未渲染该按钮(DOM 结构与 CSS 规则已保留)。 - 原版
formatMessageTime含“昨天 HH:mm”分支,与此前用户确认的三档格式不同;当前沿用用户确认的三档规则,差异待确认。
04. 用户消息悬停时间
- 为已发送用户消息补齐悬停显示时间。
- 对齐出现位置、间距、字体、颜色和与操作图标的关系。
- 复用三档时间格式;验证当天、同年异日、跨年、历史重载。
状态:待 REA 对照;时间格式已确定。
05. 用户消息回退操作与图标
- 移除已发送用户消息上的“重新发送”按钮。
- 替换为“将对话及产物回退到此消息前”操作,图标、提示及交互通过 REA 对照。
- 明确回退边界:该消息之前,而非该消息之后;对话记录与对应产物修改一起处理。
- 验收:多轮对话、文件创建/修改、无产物、运行中禁用、取消确认、回退失败和重启后状态;不得只删除可见消息而保留应回退的文件修改。
状态:待 REA 对照与现有回退链路审查。
06. 对话区域滚动条
- 对齐宽度、颜色、轨道、圆角、悬停显隐、与内容边缘的间距。
- 检查滚动条占位、长内容、流式跟随底部及用户手动上滚的行为。
- 验收:浅色、深色、短对话、长对话、流式输出与不同窗口尺寸。
状态:待 REA 对照。
07. 侧栏最下一行
- 移除最下方不应存在的“收起菜单”入口。
- 对齐最下一行的布局、高度、内边距、字体、头像、当前图标与悬停状态。
- 验收:普通/窄侧栏、浅色/深色下均无残留入口或空白占位。
状态:待 REA 对照。
08. 新建任务发送后的立即切页与占位
- 盘点发送到创建会话、准备环境、接收首个事件之间的阻塞位置。
- 对照原版发送后的页面切换时机与等待状态。
- 发送后立即进入消息页面并显示用户消息;启动较慢时显示合适的助手占位/准备状态。
- 验收:慢启动、正常启动、发送失败、停止、切换任务;不等到模型输出后才切页,不重复创建会话或丢失草稿。
状态:待 REA 对照与发送状态链路排查。
09. 账户菜单与页面
- 通过 REA 对齐点击当前登录账户后的入口、弹层位置、布局、交互及页面风格。
- 内容按用户指定范围:头像与名称、套餐、余额、升级套餐、购买积分、设置、外观、记忆与进化、检查更新、退出登录。
- 逐项盘点现有数据和功能,区分可直接接入、待实现与依赖服务端;不以虚构余额、套餐或成功提示代替真实能力。
- 验收:已接功能实际生效,弹层关闭与导航返回正常,浅色/深色一致;内容不要求逐项照搬原版账户菜单。
状态:待 REA 拆解;菜单内容范围已确定。
设置
10. 通用
- 拆解原版通用设置页面的布局、控件和交互。
- 将 YCode 当前已经支持的内容接入对应控件,记录暂未支持的差异。
- 验收:控件反映真实配置;修改即时生效或明确提示生效时机,重启后持久化正确。
状态:待 REA 拆解与能力盘点。
11. 外观与浅色/深色主题
- 对齐原版外观页面及主题切换交互;当前只保留浅色、深色两种选择。
- 梳理原版主题切换会改变的 token、样式、资源和组件状态。
- 统一主窗口、设置窗口、独立任务窗口、弹层、输入区、对话、代码/表格/工具结果和右侧栏的主题响应。
- 验收:即时切换、跨窗口同步、重启持久化;所有已接页面无浅深混色和不可读内容。
状态:待 REA 对照与主题覆盖审计。
12. 快捷键页面与真实功能
- 拆解页面布局、分组、按键显示、编辑/恢复默认等实际存在的交互。
- 建立快捷键 → 命令 → 实际动作映射,按 REA 证据确认支持范围。
- 验收:展示按键与实际绑定一致;输入框、编辑器、弹层、独立窗口中的作用域和冲突处理正确;可修改项持久化。
状态:待 REA 拆解与命令绑定盘点。
13. 个性化页面与真实功能
- 拆解原版页面、字段、说明、保存/启停等交互。
- 将支持的个性化配置接入实际运行链路,确认在哪些新建/既有会话中生效。
- 验收:修改与持久化有效;界面显示与实际行为一致;未接能力明确记录,不用占位控件宣称完成。
状态:待 REA 拆解。
14. 记忆与进化
- 记录待拆解:入口、页面、数据、读写机制、会话生效方式及生命周期。
状态:待拆解,本轮不自动展开实施。
15. 智能体页面:团队管理
- 拆解原版智能体设置页面,本轮仅对接“智能体团队管理”。
- 根据 REA 证据梳理团队列表、详情及管理操作,将需要的真实存储/配置链路接入。
- 验收:仅展示已确定范围;管理操作实际生效、重启后可恢复;团队管理与真实子代理调度的完成度分别记录。
状态:待 REA 拆解;范围限定为团队管理。
16. 移除助理与设备连接
- 移除设置中的“助理”“设备连接”导航和页面入口。
- 清理默认选中、内部导航、深链接/旧配置回退中的无效目标。
- 验收:设置中不再出现这两项,旧导航目标不会导致空白页。
状态:待实施;范围仅为用户指定的设置入口,不据此删除其他模块功能。
17. 移除数据管理与应用管理
- 移除设置中的“数据管理”“应用管理”导航和页面入口。
- 清理相关无效导航与页面占位。
- 验收:入口完全移除且其余设置导航正常;不删除已有用户数据或已安装内容。
状态:待实施。
18. 安装中心
- 记录待拆解:入口、页面结构、安装来源、安装/更新/卸载流程及与其他能力中心的关系。
状态:待拆解,本轮不自动展开实施。
19. 关于与获取帮助
- 通过 REA 复刻“关于”“获取帮助”的布局、字体、图标、间距和交互外观。
- 不复制原版跳转链接;逐项标注 YCode 自有入口或尚未配置的跳转。
- 验收:本应用版本等信息真实;没有误跳 WorkBuddy 官方账户、帮助或其他服务地址。
状态:待 REA 对照;布局纳入范围,原版链接排除。
后续模块
20. 定时任务、资料库、更多中的项目
- 定时任务:待拆解入口、页面、任务配置、触发/执行记录及生命周期。
- 资料库:待拆解入口、资料组织、添加/读取/检索及会话引用方式。
- 更多 → 项目:待拆解入口、项目组织、工作区/任务关系及管理操作。
状态:三个模块均待拆解,本轮不自动展开实施。
追加需求
21. 对话框 Git 分支检测与会话上下文信息
- 通过 REA 拆解 WorkBuddy 对话框中 Git 分支和会话上下文信息的显示位置、图标、字体、间距、提示及交互。
- 根据当前任务绑定的工作目录检测 Git 仓库和实际分支;核对原版对非 Git 目录、未产生首次提交、detached HEAD、检测失败等状态的处理。
- 明确原版“上下文信息”的实际字段、数据来源、更新时机和展示方式,再接入 YCode 的真实会话数据;上下文用量等字段如存在,必须区分真实统计与估算。
- 验收:新建任务、已有会话、切换空间/任务、外部切换 Git 分支后的信息归属与刷新正确;无仓库时不显示虚构分支;浅色/深色及窄窗口布局与原版对齐。
状态:待 REA 拆解与现有能力盘点;本项仅加入 TODO,尚未实施。
推进顺序
- 对话与侧栏:01 → 02 → 03 → 04 → 05 → 06 → 07 → 08 → 09 → 21。
- 设置:先落实 16、17 的入口范围,再依次推进 10 → 11 → 12 → 13 → 15 → 19。
- 14、18、20 保留为待拆解,后续单独展开。
每项交付记录模板
- 当前状态:待拆解 / 证据已齐 / 方案已明确 / 实现中 / 已实现未验收 / 已验收 / 有阻碍。
- 原版证据:版本、REA Evidence ID、观察范围、未覆盖状态。
- YCode 差异与方案:具体问题、涉及模块、数据与交互边界。
- 实现:修改文件、真实功能、占位或未接部分。
- 验证:功能回归、实际窗口交互、浅色/深色、相关截图/几何/像素结果及限制。
- 遗留:尚未解决的差异与下一步所需证据。