# 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. 任务操作菜单 - [x] 将侧栏对话条目后的直接删除按钮替换为原版任务操作入口。 - [x] 通过 REA 对齐菜单的入口、位置、顺序、图标、文案、悬停、关闭、禁用和确认状态。 - [x] 接入:置顶、取消置顶、重命名、独立窗口中打开、打开文件夹、归档、删除任务。 - [ ] 验收:置顶顺序和重命名持久化;独立窗口打开正确任务;文件夹指向正确工作目录;归档与删除行为独立;涉及运行中任务时有明确处理。 状态:主体已实现;运行中任务的处理与逐像素截图比对未完成。 原版证据: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. 表格“添加到对话”及引用结果 - [x] 对齐表格上方“添加到对话”按钮的字体、图标、背景、边距、出现条件及交互。 - [x] 对齐点击后输入区内引用表格的呈现,包括结构、预览、移除和与已有草稿的组合方式。 - [x] 对齐发送后用户消息中的表格引用显示。 - [x] 验收:引用正确表格内容,不丢失已有草稿;输入区、发送结果及历史重载三种状态一致。 状态:主体已实现并做了真实窗口回归;仍有两处原版证据缺口(见“遗留”)。 原版证据: - 渲染器实现: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-menu` 116×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-256 `a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe`)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` 通过。 遗留: 1. 未取到原版“点击后输入区卡片”和“发送后消息标签”的实际截图与几何:探针在打开的会话里没有找到可引用的表格(`hover .cr-table-block` 返回 "Selected node is absent"),因此这两态是按渲染器源码与回收样式表实现,视觉未与原版逐像素比对。 2. 原版 `--cr-brand-secondary`(以及 `--cr-bg-brand-subtle`、`--cr-border-brand-subtle`)在回收样式表中只有使用、没有定义;同版本 `contexts-BkjwYSZT.css` 给出的兜底值是 `#40d1b3`,YCode 暂按该兜底值定义并已在注释中标注,待取到原版运行时 token 后替换。 3. 输入区引用卡片中的“来源标题”在原版由宿主(`message.quote.add` 处理端)生成,尚未采集;YCode 当前不显示标题,只显示内容摘要,不臆造文案。 ### 03. 编辑已发送消息 - [ ] 拆解原版编辑入口、编辑容器、文本排版、按钮、焦点与键盘交互。 - [ ] 对齐进入编辑、修改、取消、提交及失败状态。 - [ ] 验收:编辑正确消息;取消恢复原内容;提交后的消息分支与产物处理符合已确认行为。 状态:待 REA 对照。 ### 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,尚未实施。 ## 推进顺序 1. 对话与侧栏:01 → 02 → 03 → 04 → 05 → 06 → 07 → 08 → 09 → 21。 2. 设置:先落实 16、17 的入口范围,再依次推进 10 → 11 → 12 → 13 → 15 → 19。 3. 14、18、20 保留为待拆解,后续单独展开。 ## 每项交付记录模板 - 当前状态:待拆解 / 证据已齐 / 方案已明确 / 实现中 / 已实现未验收 / 已验收 / 有阻碍。 - 原版证据:版本、REA Evidence ID、观察范围、未覆盖状态。 - YCode 差异与方案:具体问题、涉及模块、数据与交互边界。 - 实现:修改文件、真实功能、占位或未接部分。 - 验证:功能回归、实际窗口交互、浅色/深色、相关截图/几何/像素结果及限制。 - 遗留:尚未解决的差异与下一步所需证据。