qwen-code/docs/design/qwen-code-electron-desktop/codex-alignment-implementation-plan.md
2026-04-25 23:44:53 +08:00

291 lines
13 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.

# Qwen Code Desktop Codex Alignment Implementation Plan
> 目标:把 `codex-alignment-gap-analysis.md` 中的差异结论转成可执行的桌面端优化路线。
> 本文关注工作拆分、依赖顺序、验收标准和测试覆盖,不替代具体 PR 的技术设计。
## Product North Star
Qwen Code Desktop 的主体验应从“功能并列的调试工作台”转向“对话驱动的本地编码
代理工作台”。用户打开项目后,默认路径应该是:
```text
Open project -> type request -> agent works -> review changed files -> commit or continue
```
这个路径里Conversation 是主舞台Review、Terminal、Settings、Project browser
都是辅助面板。界面应该持续回答五个问题:
- 当前任务在哪个项目和分支上运行?
- 当前 agent 用什么模型和权限?
- agent 正在做什么、等我做什么?
- 它读了哪些文件、改了哪些文件?
- 我如何继续、审查、撤销或提交?
## Non-Goals
- 不复制 Codex 品牌、图标、文案和精确视觉样式。
- 不在第一轮引入完整插件市场、自动化调度、worktree 并行任务或浏览器预览。
- 不把所有 CLI 能力一次性做成设置页。
- 不把高风险 Git/文件操作做成无确认的一键动作。
## Milestone Plan
### M1: Workbench Skeleton and Navigation
目标:先让整体产品形态从 dashboard 变成 coding agent workspace。
主要改动:
- 重构 `WorkspacePage` 的布局模型conversation 默认常驻review 和 terminal
成为可折叠辅助区域。
- 重构 `ProjectSidebar`:增加 app-level entries压缩 project/thread rows隐藏完整
path增加相对时间和 overflow menu 的预留位。
- 重构 `TopBar`:分离 title、workspace status 和 action cluster。
- 引入 icon button 组件和 tooltip 基础组件。
- 为当前 layout 增加稳定 `data-testid`,用于 CDP/E2E 验证。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/WorkspacePage.tsx`
- `packages/desktop/src/renderer/components/layout/ProjectSidebar.tsx`
- `packages/desktop/src/renderer/components/layout/TopBar.tsx`
- `packages/desktop/src/renderer/styles.css`
验收标准:
- 1240x820 默认窗口下conversation 面板是视觉主区域。
- 左侧线程列表不再展示完整长 prompt 和重复 path。
- Topbar 没有被截断到难以理解的 `Conn...``zth/feat-d...` 状态。
- Settings 不再作为和 Chat/Changes 同级的主工作 tab。
### M2: Composer and Session Creation
目标:用户打开项目后可以直接输入请求,不必先理解 session 状态。
主要改动:
- 未选中 session 但已选中 project 时composer 可输入。
- 首次 send 时自动创建 session并把输入作为首条 prompt。
- Composer 底部控制条加入 permission mode、model selector、project/branch context、
attach button 和 send/stop。
- Send disabled 时展示明确原因。
- 保留 keyboard path`Enter` 发送、`Shift+Enter` 换行。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/ChatThread.tsx`
- `packages/desktop/src/renderer/components/layout/WorkspacePage.tsx`
- `packages/desktop/src/renderer/stores/chatStore.ts`
- `packages/desktop/src/renderer/stores/sessionStore.ts`
- `packages/desktop/src/renderer/stores/modelStore.ts`
验收标准:
- 打开项目后不选线程,输入并发送消息会创建新线程。
- Composer 能在同一处看到权限、模型、项目和分支。
- 没有项目时 composer 仍禁用,但明确提示 “Open a project to start”。
- 发送中 send 变 stop完成后恢复 send。
### M3: Message System and Agent Activity
目标:让对话区呈现任务进展,而不只是 user/assistant 文本框。
主要改动:
- 隐藏 ACP/session UUID 等内部诊断信息。
- 建立 message primitivesuser message、assistant message、tool call、command
approval、file card、diff summary、error/retry。
- Assistant 消息底部增加 actionscopy、feedback、retry、open changed files。
- 文件引用统一渲染成 chips/cards支持 open/reveal/copy path。
- Agent 正在运行时显示 compact activity row而不是只靠 topbar READY/idle。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/ChatThread.tsx`
- `packages/desktop/src/renderer/components/layout/formatters.ts`
- `packages/desktop/src/renderer/stores/chatStore.ts`
- `packages/desktop/src/renderer/api/websocket.ts`
验收标准:
- 历史 session 不再在聊天中显示 `Connected to <uuid>`
- 有工具调用或权限请求时,用户能在消息流中看到清晰 card。
- 代码变更完成后conversation 中出现 changed-files summary。
- Copy/retry/open actions 有可访问名称和 hover/focus 状态。
### M4: Review Drawer and Commit Flow
目标:把 Changes 从“整页 diff 工具”改为任务上下文里的审查抽屉。
主要改动:
- `ReviewPanel` 改成右侧 drawer可打开/关闭,不替换 conversation。
- Drawer 内保留 Files、Diff、Summary、Commit 局部 tab。
- Conversation changed-files summary 点击后打开 drawer。
- 统一术语Stage、Unstage、Discard、Commit避免 `Accept``Revert` 混用。
- `Discard All``Discard File` 等高风险动作移到 overflow并要求确认。
- Commit disabled 时解释原因。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/ReviewPanel.tsx`
- `packages/desktop/src/renderer/components/layout/WorkspacePage.tsx`
- `packages/desktop/src/renderer/components/layout/TopBar.tsx`
- `packages/desktop/src/renderer/api/client.ts`
验收标准:
- 用户可以边看 conversation 边打开 review drawer。
- 点击 changed-files summary 能定位到对应文件。
- 没有 staged changes 时 commit 区解释为什么不能提交。
- 任意 discard all/file/hunk 动作都有确认,不会一键误删本地改动。
### M5: Terminal Drawer
目标:保留终端能力,但不要让它长期占用主视图高度。
主要改动:
- Terminal 默认折叠为底部 status strip需要时展开。
- 输出块展示 command、exit code、duration、cwd。
- Send to AI 改为 attach/send to composer 的模式,避免意外触发新任务。
- Copy、Clear、Kill、Attach 使用 icon buttonsKill/clear 有更弱视觉权重。
- Terminal 展开状态按 project/session 记忆。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/TerminalDrawer.tsx`
- `packages/desktop/src/renderer/stores/terminalStore.ts`
- `packages/desktop/src/renderer/components/layout/WorkspacePage.tsx`
验收标准:
- 没有终端输出时主界面不浪费大块空白。
- 执行 `pwd` 后能看到 cwd、exit code 和输出。
- 输出可附加到 composer用户确认后再发送。
- 运行中命令有明确 stop/kill 状态。
### M6: Settings Information Architecture
目标:把设置页从 runtime debug 面板整理成用户可理解的产品设置。
主要改动:
- Settings 独立为页面或 modal不作为 workbench 主 tab。
- 一级分组Account、Model Providers、Permissions、Tools & MCP、Terminal、
Appearance、Advanced。
- Runtime/server/Node/ACP/health 进入 Advanced Diagnostics。
- API key/OAuth 状态可读missing、configured、invalid、saved。
- 常用模型和权限控制同步显示在 composer/topbar。
建议文件范围:
- `packages/desktop/src/renderer/components/layout/SettingsPage.tsx`
- `packages/desktop/src/renderer/stores/settingsStore.ts`
- `packages/desktop/src/renderer/stores/modelStore.ts`
- `packages/desktop/src/renderer/components/layout/TopBar.tsx`
验收标准:
- 默认 Settings 首页不直接显示 server URL、Node version、ACP status。
- 用户能在 2 次点击内找到模型/API key/权限设置。
- Advanced Diagnostics 仍保留完整工程诊断信息。
## Cross-Cutting Design System Work
这些改动应该贯穿 M1-M6而不是最后补
- 建立 `IconButton``SegmentedControl``Pill``Tooltip``Drawer``InlineCard`
等基础组件。
- 引入或确定图标方案。若可新增依赖,建议使用 `lucide-react`;若暂不新增依赖,
先封装本地 minimal icon set避免每处手写 SVG。
- 统一 type scalesidebar row、topbar、message body、code/diff、small label。
- 降低全局重边框和大面积渐变;保留 Qwen 品牌色作为 accent而不是背景主色。
- 所有 icon-only controls 必须有 `aria-label` 和 tooltip。
- 所有 destructive controls 使用 danger token并避免放在 primary action 位置。
## Data and API Requirements
现有 UI 有些问题来自数据形态不够产品化。建议补齐这些字段或前端派生逻辑:
| Need | Source | Notes |
| --------------------------- | --------------------------------------------- | ------------------------------------------------- |
| Thread display title | session summary or derived first user message | 长 prompt 需要生成短标题,失败时 fallback 到首句 |
| Thread updated time | session summary | 用于 sidebar relative time 和排序 |
| Project display name | project path basename | 完整 path 仅放 details/tooltip |
| Project dirty summary | git service | 绑定 diff/submit 入口 |
| Permission mode | session/model/settings state | Composer 必须常驻展示 |
| Active model | model store/session state | Composer 和 settings 双向同步 |
| Changed files summary | review/git service | Conversation inline summary 和 review drawer 共用 |
| Terminal last command state | terminal store | 用于 collapsed terminal strip |
## Testing Plan
### Unit and Component Tests
- Sidebar row formatting长 prompt 截断、path 隐藏、relative time 显示。
- Composer state machineno project、project/no session、sending、running、error。
- Review terminologystage/unstage/discard/commit disabled reason。
- Settings groupingdiagnostics 默认不出现在首页。
运行方式保持包内执行:
```bash
cd packages/desktop
npx vitest run src/renderer/components/layout/WorkspacePage.test.tsx
```
### Electron E2E
扩展 `packages/desktop/scripts/e2e-cdp-smoke.mjs`,至少覆盖:
- 启动 app 后确认 conversation 是主视图。
- 打开项目后未选 sessioncomposer 可输入并 lazy-create session。
- fake ACP 返回 changed-files summary 后,点击打开 review drawer。
- 执行终端命令,展开/折叠 terminal drawer。
- 打开 Settings确认 diagnostics 在 Advanced 下。
- 触发 discard all确认出现确认 UI取消后本地文件未变化。
### Visual Regression Checklist
人工或截图检查至少覆盖:
- 1240x820 默认桌面窗口。
- 960x640 最小窗口。
- 长线程标题、长路径、长分支名。
- 无项目、空项目、有脏 Git 状态、有运行中任务。
- 深色主题下 focus ring、hover、disabled、danger 状态。
## Suggested PR Breakdown
1. `desktop: introduce workbench primitives`
- 增加基础组件和 CSS tokens不改主要行为。
2. `desktop: restructure sidebar and topbar`
- app rail、compact rows、action cluster。
3. `desktop: make composer create sessions`
- lazy-create session、composer controls、disabled reasons。
4. `desktop: add rich message cards`
- hide internal UUID、tool/file/diff summary cards。
5. `desktop: convert changes to review drawer`
- right drawer、terminology、discard confirmations。
6. `desktop: collapse terminal into drawer`
- status strip、attach output to composer。
7. `desktop: reorganize settings`
- product settings IA、advanced diagnostics。
8. `desktop: expand CDP smoke for aligned workflow`
- real Electron assertions for the new product path。
每个 PR 都应包含对应的 focused tests涉及 renderer 布局的 PR 必须跑真实 Electron
路径,不只跑 unit tests。
## Open Questions
- Qwen 是否要保留与 Codex 相似的左侧 app-level entriesPlugins、Automations
如果 P0 不实现功能,建议先放 disabled/empty state 还是完全隐藏?
- `Accept` 当前真实语义是什么stage 到 index、接受 AI patch还是标记 review
accepted需要先统一数据模型和文案。
- Composer 中权限模式的默认值应跟 CLI approval mode 完全一致,还是为桌面端做更
产品化的三档映射?
- 是否允许新增 `lucide-react` 依赖?如果不允许,需要定义本地图标维护策略。
- Settings 是否采用 full page、modal还是左侧二级导航页从当前规模看 full page
最稳。