fischer-agentkit/docs/plans/2026-06-13-001-refactor-gui...

418 lines
18 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.

---
title: "refactor: Agent-First GUI Redesign"
status: completed
created: 2026-06-13
origin: docs/brainstorms/2026-06-13-gui-redesign-requirements.md
---
# Plan: Agent-First GUI Redesign
## Summary
将 Fischer AgentKit GUI 从 SideNav 多页面布局重构为 Agent-First 四象限全屏布局,建立统一 Design Token 体系,采用浅色极简视觉风格。分 3 个迭代渐进式完成,每个迭代可独立部署。
## Problem Frame
当前 GUI 处于"功能可用但视觉粗糙"状态300 处硬编码颜色、无设计系统、SideNav 多页面布局无法同时展示 Agent 活动、无响应式支持。竞品Devin/Cursor/v0.dev已普遍采用 Agent-First 全屏布局 + 统一设计系统。
## Requirements Trace
| R-ID | Requirement | Priority |
|------|-------------|----------|
| R1 | Design Token 体系 | P0 |
| R2 | Agent-First 全屏布局 | P0 |
| R3 | 对话面板重构 | P1 |
| R4 | 代码/预览面板 | P1 |
| R5 | 终端面板重构 | P1 |
| R6 | 状态/监控面板(进化精简) | P1 |
| R7 | 工作流单页化 | P2 |
| R8 | 设置分组化 | P2 |
| R9 | 过渡动画与微交互 | P2 |
| R10 | 响应式断点 | P2 |
## Key Technical Decisions
### KTD1: Design Token 双轨制 — CSS 变量 + Ant Design Theme Token
**决策:** 同时建立 CSS 自定义属性(`var(--color-primary)`)和 Ant Design Vue ConfigProvider theme token两者通过映射表保持同步。
**理由:** Ant Design Vue 4.x 的 CSS-in-JS 架构通过 `theme.token` 控制组件内部样式,但自定义组件和 ECharts 无法读取 antd token。CSS 变量作为通用层antd token 作为组件层,映射表桥接两者。
### KTD2: 四象限布局实现 — CSS Grid + 可拖拽分隔线
**决策:** 使用 CSS Grid 实现四象限基础布局,自定义 `SplitPane` 组件实现可拖拽分隔线,比例持久化到 localStorage。
**理由:** CSS Grid 天然支持二维布局和 `fr` 单位,比 Flexbox 更适合四象限。自定义 SplitPane 比引入第三方库(如 splitpanes更轻量且可精确控制样式。
### KTD3: 路由策略 — 保留 Vue Router页面切换变为象限内容切换
**决策:** 保留 Vue Router 但重构路由结构。顶级路由改为象限内容路由(`/chat`、`/code`、`/terminal`、`/monitor`),通过路由参数控制各象限显示内容。旧路由(`/workflow`、`/knowledge`、`/skills`、`/evolution`、`/settings`)重定向到新的象限路由。
**理由:** 保留路由可维持 URL 可访问性、浏览器前进/后退、深层链接。象限内容切换比整页跳转更流畅。
### KTD4: 视觉风格 — 浅色极简 + Vercel 式紫黑渐变
**决策:** 主背景白色/极浅灰,强调色使用紫黑渐变(`#7c3aed` → `#1e1b4b`),代码/终端区域使用深色背景One Dark Pro 配色)。
**理由:** 用户选择浅色极简风格。Vercel/v0.dev 的紫黑渐变是成熟的浅色极简强调色方案,与白色背景形成强对比。
## Scope Boundaries
### In Scope
- Design Token 体系建立
- 四象限全屏布局重构
- 所有现有功能迁移
- 浅色极简视觉风格
- 过渡动画和微交互
- 1280px+ 响应式断点
### Deferred to Follow-Up Work
- 暗色模式(需 Design Token 暗色变体)
- 移动端适配
- Computer Use 功能实现
- Cmd+K 内联编辑
- @-mention 上下文引用
- 代码 Diff Accept/Reject 实际回滚
### Outside This Product's Identity
- 多用户协作/实时协同编辑
- 插件市场
- 代码编辑器(只读预览)
---
## Implementation Units
### U1. Design Token 体系 + 主题配置
**Goal:** 建立统一的设计令牌系统,消除所有硬编码颜色/间距/圆角值。
**Requirements:** R1
**Dependencies:**
**Files:**
- Create: `src/agentkit/server/frontend/src/styles/tokens.css`
- Create: `src/agentkit/server/frontend/src/styles/theme.ts`
- Create: `src/agentkit/server/frontend/src/styles/index.ts`
- Modify: `src/agentkit/server/frontend/src/App.vue`
- Modify: `src/agentkit/server/frontend/src/main.ts`
**Approach:**
1. 创建 `tokens.css`,定义 CSS 自定义属性颜色primary/secondary/success/error/warning/灰阶/背景/边框、间距4/8/12/16/24/32px、圆角4/6/8/12px、字体12/13/14/16/20/24px、阴影sm/md/lg
2. 创建 `theme.ts`,定义 Ant Design Vue theme token 映射(将 CSS 变量值映射到 antd token
3.`App.vue` 的 ConfigProvider 中注入 theme 配置
4.`main.ts` 中引入 `tokens.css`
5. 统一主色为 `#7c3aed`(紫黑渐变起始色),消除 `#1677ff`/`#1890ff` 混用
**Patterns to follow:** Ant Design Vue 4.x theme customization API (ConfigProvider theme prop)
**Test scenarios:**
- 验证 CSS 变量在浏览器中正确计算(`getComputedStyle(document.documentElement).getPropertyValue('--color-primary')` 返回 `#7c3aed`
- 验证 Ant Design 组件使用新主题色Button primary 颜色为 `#7c3aed`
- 验证自定义组件可通过 `var(--color-primary)` 引用主题色
**Verification:** 所有 CSS 变量可计算Ant Design 组件使用新主题色,无硬编码 `#1677ff`/`#1890ff`。
---
### U2. 四象限全屏布局 + 顶部导航
**Goal:** 将 SideNav 多页面布局重构为四象限全屏布局,顶部极简导航栏。
**Requirements:** R2
**Dependencies:** U1
**Files:**
- Create: `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue`
- Create: `src/agentkit/server/frontend/src/components/layout/SplitPane.vue`
- Create: `src/agentkit/server/frontend/src/components/layout/TopNav.vue`
- Create: `src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue`
- Modify: `src/agentkit/server/frontend/src/App.vue`
- Modify: `src/agentkit/server/frontend/src/router/index.ts`
- Preserve: `src/agentkit/server/frontend/src/components/layout/AppLayout.vue`(旧布局保留,路由切换)
**Approach:**
1. 创建 `AgentLayout.vue`CSS Grid 四象限布局,每个象限是一个 `<QuadrantPanel>`,支持折叠/展开
2. 创建 `SplitPane.vue`:可拖拽分隔线组件,支持水平/垂直方向,比例持久化到 localStorage
3. 创建 `TopNav.vue`48px 高度顶部导航栏,包含 Logo、任务选择器、Agent 状态指示、模式切换、设置入口
4. 创建 `QuadrantPanel.vue`象限容器组件支持标题栏、折叠按钮、Tab 切换
5. 修改路由:新增 `/agent` 路由使用 AgentLayout旧路由保留 AppLayout 作为兼容
6. 默认路由 `/` 重定向到 `/agent`
**Patterns to follow:** Devin 四象限布局模式CSS Grid `grid-template-rows/columns` + `fr` 单位
**Test scenarios:**
- 四象限正确渲染,各象限可独立折叠/展开
- 分隔线可拖拽调整比例,刷新后比例保持
- 顶部导航栏正确显示 Logo、状态指示、设置入口
- 1280px 以下右下象限自动折叠
**Verification:** 四象限布局可交互,分隔线可拖拽,比例持久化,响应式断点生效。
---
### U3. 对话面板重构(左上象限)
**Goal:** 将 ChatView 重构为对话面板,支持 Markdown 渲染和工具调用指示器。
**Requirements:** R3
**Dependencies:** U1, U2
**Files:**
- Modify: `src/agentkit/server/frontend/src/views/ChatView.vue`
- Modify: `src/agentkit/server/frontend/src/components/chat/ChatMessage.vue`
- Modify: `src/agentkit/server/frontend/src/components/chat/ChatInput.vue`
- Modify: `src/agentkit/server/frontend/src/components/chat/ChatSidebar.vue`
- Create: `src/agentkit/server/frontend/src/components/chat/ToolCallIndicator.vue`
- Create: `src/agentkit/server/frontend/src/components/chat/ContextPill.vue`
**Approach:**
1. ChatMessage替换 `v-html` 为 Markdown 渲染(使用 `markdown-it``marked`),添加工具调用指示器(`[Read]`/`[Edit]`/`[Bash]` 彩色标签)
2. ChatInput添加上下文胶囊Context Pills显示当前关联的文件/技能
3. ChatSidebar改为可折叠侧栏默认折叠
4. 流式输出添加打字机效果
5. 所有硬编码颜色替换为 Design Token 引用
**Patterns to follow:** Claude Code 的 Tool Use IndicatorsTrae 的 Context Pills
**Test scenarios:**
- Markdown 正确渲染(标题、代码块、列表、链接)
- 工具调用指示器正确显示类型和颜色
- 上下文胶囊显示关联文件名
- 流式输出打字机效果平滑
**Verification:** 对话面板功能完整Markdown 渲染正确,工具调用可视化,无 `v-html`
---
### U4. 代码/预览面板(右上象限)
**Goal:** 新增代码 Diff 查看和文件预览能力,集成工作流画布和知识库管理。
**Requirements:** R4, R7
**Dependencies:** U1, U2
**Files:**
- Create: `src/agentkit/server/frontend/src/components/code/CodeDiffViewer.vue`
- Create: `src/agentkit/server/frontend/src/components/code/FileTree.vue`
- Modify: `src/agentkit/server/frontend/src/views/WorkflowView.vue`(单页化)
- Modify: `src/agentkit/server/frontend/src/views/KnowledgeBaseView.vue`
- Modify: `src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue`
- Modify: `src/agentkit/server/frontend/src/components/workflow/NodePalette.vue`
- Modify: `src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue`
**Approach:**
1. 创建 `CodeDiffViewer.vue`:只读代码 Diff 展示,支持逐行高亮(红/绿),语法高亮
2. 创建 `FileTree.vue`:文件树浏览器,展示 Agent 修改的文件列表
3. 工作流单页化:列表和编辑在同一象限内通过 Tab 切换
4. 知识库管理集成为此象限的一个 Tab
5. 象限 Tab 切换:代码 / 工作流 / 知识库
6. 所有硬编码颜色替换为 Design Token
**Patterns to follow:** Cursor Composer 的 Diff 展示v0.dev 的 Tab 切换
**Test scenarios:**
- 代码 Diff 正确高亮删除/新增行
- 文件树正确展示文件结构
- 工作流列表/编辑 Tab 切换流畅
- 知识库 Tab 正常工作
- 象限 Tab 切换无闪烁
**Verification:** 右上象限支持三种内容切换,代码 Diff 可视化,工作流单页化完成。
---
### U5. 终端面板重构(左下象限)
**Goal:** 将 TerminalView 重构为终端面板,使用 Ant Design 组件替代原生 HTML。
**Requirements:** R5
**Dependencies:** U1, U2
**Files:**
- Modify: `src/agentkit/server/frontend/src/views/TerminalView.vue`
- Modify: `src/agentkit/server/frontend/src/components/terminal/TerminalEmulator.vue`
- Modify: `src/agentkit/server/frontend/src/components/terminal/CommandHistory.vue`
**Approach:**
1. 终端背景改为 One Dark Pro 配色(深色背景 + 语法高亮色)
2. 命令确认弹窗从原生 HTML 改为 Ant Design Modal
3. 命令历史侧栏改为可折叠
4. 输入框从原生 `<input>` 改为 Ant Design Input
5. 所有硬编码颜色替换为 Design Token
**Patterns to follow:** One Dark Pro 终端配色Ant Design Modal 组件
**Test scenarios:**
- 终端输出 ANSI 颜色正确渲染
- 命令确认弹窗使用 Ant Design Modal 样式
- 命令历史可折叠展开
- WebSocket 连接/断开正常
**Verification:** 终端面板视觉统一,无原生 HTML 弹窗One Dark Pro 配色生效。
---
### U6. 状态/监控面板(右下象限)+ 进化精简
**Goal:** 将 EvolutionView 精简后集成为右下象限,集成技能和设置。
**Requirements:** R6, R8
**Dependencies:** U1, U2
**Files:**
- Modify: `src/agentkit/server/frontend/src/views/EvolutionView.vue`
- Modify: `src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue`
- Modify: `src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue`
- Modify: `src/agentkit/server/frontend/src/components/evolution/UsagePanel.vue`
- Modify: `src/agentkit/server/frontend/src/views/SkillsView.vue`
- Modify: `src/agentkit/server/frontend/src/views/SettingsView.vue`
- Delete: `src/agentkit/server/frontend/src/components/evolution/PitfallRoutePanel.vue`
- Delete: `src/agentkit/server/frontend/src/components/evolution/OptimizationPanel.vue`
- Delete: `src/agentkit/server/frontend/src/components/evolution/MetricsPanel.vue`
- Delete: `src/agentkit/server/frontend/src/components/evolution/ExperiencePanel.vue`
**Approach:**
1. 进化面板精简6 个子面板合并为 3 个 Tab — 概览+指标、经验+坑点、用量
2. DashboardOverview4 列统计卡片改为 2 列,增加趋势迷你图
3. 设置分组化4 个 TabLLM/技能/知识库/系统),每组独立保存
4. 象限 Tab 切换:监控 / 技能 / 设置
5. 删除不再需要的包装组件PitfallRoutePanel/OptimizationPanel/MetricsPanel/ExperiencePanel
6. 所有硬编码颜色替换为 Design Token
**Patterns to follow:** Devin 的 Action TimelineAnt Design Tabs 分组
**Test scenarios:**
- 进化概览+指标 Tab 正确展示
- 经验+坑点 Tab 合并后功能完整
- 设置分组 Tab 切换正常,每组独立保存
- 技能 Tab 正常展示和安装
**Verification:** 右下象限支持三种内容切换,进化面板精简完成,设置分组化完成。
---
### U7. 过渡动画 + 微交互 + 响应式
**Goal:** 为所有交互添加过渡动画,实现 1280px+ 响应式断点。
**Requirements:** R9, R10
**Dependencies:** U1, U2, U3, U4, U5, U6
**Files:**
- Create: `src/agentkit/server/frontend/src/styles/transitions.css`
- Create: `src/agentkit/server/frontend/src/styles/responsive.css`
- Modify: `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue`
- Modify: all view and component files (transition additions)
**Approach:**
1. 创建 `transitions.css`:定义 Vue transition 类fade/slide/collapse/stagger统一时长150ms/200ms/300ms
2. 象限折叠/展开:平滑过渡 200ms ease
3. Tab 切换:淡入淡出 150ms
4. 列表项加载:交错渐入 stagger 50ms
5. 空状态:品牌化插图 + 引导文案(替代 `<a-empty>`
6. 加载态:骨架屏替代 `<a-spin>`
7. 创建 `responsive.css`定义断点≥1440px 四象限完整1280-1440px 右下折叠,<1280px 提示
8. 象限比例记忆localStorage 保存用户调整的比例
**Patterns to follow:** Vue `<Transition>` 组件CSS `@media` 断点
**Test scenarios:**
- 象限折叠/展开动画平滑无卡顿
- Tab 切换淡入淡出效果正确
- 列表项交错渐入效果
- 1440px+ 四象限完整展示
- 1280-1440px 右下象限自动折叠
- <1280px 显示提示信息
- 刷新后象限比例保持
**Verification:** 所有过渡动画生效响应式断点正确比例持久化
---
## High-Level Technical Design
### 四象限布局架构
```
┌─────────────────────────────────────────────────────────┐
│ TopNav (48px) │
│ [Logo] [TaskSelector] [AgentStatus] [ModeToggle] [⚙] │
├──────────────────────────┬──────────────────────────────┤
│ │ │
│ QuadrantPanel │ QuadrantPanel │
│ position="top-left" │ position="top-right" │
│ ┌─ Tabs ────────────┐ │ ┌─ Tabs ────────────────┐ │
│ │ Chat (default) │ │ │ Code/Diff (default) │ │
│ │ Agent Log │ │ │ Workflow │ │
│ └────────────────────┘ │ │ Knowledge Base │ │
│ │ └────────────────────────┘ │
│ ← SplitPane (vertical) →│ │
├──────────────────────────┼──────────────────────────────┤
│ │ │
│ QuadrantPanel │ QuadrantPanel │
│ position="bottom-left" │ position="bottom-right" │
│ ┌─ Tabs ────────────┐ │ ┌─ Tabs ────────────────┐ │
│ │ Terminal (default) │ │ │ Monitor (default) │ │
│ │ Command History │ │ │ Skills │ │
│ └────────────────────┘ │ │ Settings │ │
│ │ └────────────────────────┘ │
└──────────────────────────┴──────────────────────────────┘
```
### Design Token 映射架构
```
tokens.css (CSS Custom Properties)
├─→ 自定义组件 (via var(--xxx))
└─→ theme.ts (Ant Design Theme Token Mapping)
└─→ ConfigProvider :theme
└─→ Ant Design 组件 (via CSS-in-JS)
```
### 路由重构
```
/ → /agent (AgentLayout)
/agent/chat → 左上象限显示 Chat
/agent/code → 右上象限显示 Code/Diff
/agent/terminal → 左下象限显示 Terminal
/agent/monitor → 右下象限显示 Monitor
旧路由兼容:
/workflow → /agent/code?tab=workflow
/knowledge → /agent/code?tab=knowledge
/skills → /agent/monitor?tab=skills
/evolution → /agent/monitor?tab=monitor
/settings → /agent/monitor?tab=settings
/terminal → /agent/terminal
```
---
## Risks & Mitigations
| Risk | Impact | Mitigation |
|------|--------|------------|
| 300 处硬编码颜色迁移遗漏 | 视觉不一致 | U1 完成后全局搜索 `#[0-9a-fA-F]{3,6}` 验证零残留 |
| Vue Flow 在象限内 resize 问题 | 画布渲染异常 | SplitPane 拖拽结束时触发 window resize 事件 |
| ECharts 颜色需单独处理 | 图表颜色不跟随主题 | ECharts 初始化时从 CSS 变量读取颜色 |
| 大型组件迁移引入回归 | 功能损坏 | 每个单元完成后运行现有测试 + 手动验证 |
| 四象限布局在小屏幕下体验差 | 不可用 | R10 响应式断点确保 1280px+ 可用 |
## Open Questions
- Code Diff Viewer 是否需要引入第三方库 diff2html还是手写简单 diff 展示?→ 建议先用简单行级高亮后续迭代引入 diff2html
- 骨架屏组件是自建还是使用 Ant Design Vue Skeleton?→ 建议使用 antd Skeleton减少维护成本