Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括: - 配置文件中的项目名称 - 代码注释和文档引用 - 环境变量和路径 - 类型定义和接口名称 - 测试用例和模拟数据 同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
4.4 KiB
4.4 KiB
Hands 集成经验总结
完成日期: 2026-03-14 任务: 将 ZCLAW Hands 功能集成到 ZClaw 桌面客户端
一、任务概述
1.1 目标
将 ZCLAW 的 Hands(自主能力包)功能深度集成到 ZClaw 桌面客户端,提供与 ZCLAW Web 界面对等的用户体验。
1.2 完成内容
-
布局重构:
- 左侧 Sidebar 的 Hands 标签显示自主能力包列表
- 中间区域显示选中 Hand 的任务清单和执行结果
- 右侧面板移除 Hands 相关内容
-
中文化:
- 所有 UI 文本改为中文
- 状态标签、按钮、提示信息全部本地化
-
新增组件:
HandList.tsx- 左侧导航的 Hands 列表HandTaskPanel.tsx- Hand 任务和结果面板
二、关键技术决策
2.1 组件拆分策略
决策: 将 Hands 功能拆分为列表展示和详情展示两个独立组件
理由:
- 符合单一职责原则
- 便于独立维护和测试
- 与现有布局结构匹配
代码结构:
desktop/src/components/
├── HandList.tsx # 左侧列表组件
├── HandTaskPanel.tsx # 中间详情面板
├── Sidebar.tsx # 集成 HandList
└── App.tsx # 路由和状态管理
2.2 状态管理
决策: 使用 App.tsx 中的 selectedHandId 状态管理选中项
实现:
// App.tsx
const [selectedHandId, setSelectedHandId] = useState<string | undefined>(undefined);
// 传递给 Sidebar
<Sidebar
selectedHandId={selectedHandId}
onSelectHand={setSelectedHandId}
/>
// 中间区域根据状态显示不同内容
{mainContentView === 'hands' && selectedHandId ? (
<HandTaskPanel handId={selectedHandId} onBack={() => setSelectedHandId(undefined)} />
) : ...}
2.3 类型定义
决策: 扩展 gatewayStore 中的 Hand 类型以支持新 UI
关键字段:
interface Hand {
id: string;
name: string;
description: string;
status: 'idle' | 'running' | 'needs_approval' | 'error' | 'unavailable' | 'setup_needed';
icon?: string;
toolCount?: number;
// ... 其他字段
}
三、遇到的问题与解决方案
3.1 未使用导入错误
问题: 创建组件时引入了未使用的依赖
解决: 及时清理未使用的导入
// 移除未使用的 useState
// 移除未使用的类型 HandRun, RefreshCw
3.2 布局一致性
问题: 新组件需要与现有 UI 风格保持一致
解决:
- 使用 Tailwind CSS 类保持样式一致
- 参考 ChatArea.tsx 等现有组件的结构
- 使用 lucide-react 图标库保持图标一致
3.3 状态同步
问题: 选中 Hand 后需要同时更新左侧高亮和中间内容
解决:
- 通过 props 传递 selectedHandId
- 在 Sidebar 中处理点击事件并通知父组件
- 使用回调函数
onSelectHand实现状态提升
四、最佳实践
4.1 组件设计
- 保持组件精简: 每个组件不超过 300 行
- 使用 TypeScript 接口: 明确定义 Props 类型
- 添加文档注释: 说明组件用途和关键参数
4.2 状态管理
- 状态提升: 共享状态放在最近的共同父组件
- 单向数据流: 通过 props 传递,通过回调更新
- 使用 Zustand: 全局状态通过 store 管理
4.3 UI 开发
- 中文化优先: 所有用户可见文本使用中文
- 状态反馈: 加载中、错误、空状态都要有明确提示
- 可访问性: 添加 title 属性,使用语义化标签
五、后续工作
5.1 待完成功能
根据 plans/fancy-sprouting-teacup.md 计划:
-
Phase 1: HandsPanel 增强
- 详情弹窗 (Details Modal)
- Requirements 状态可视化
- 工具和指标列表展示
-
Phase 2: WorkflowList 增强
- 创建/编辑 Workflow
- 执行历史查看
-
Phase 3: SchedulerPanel
- 定时任务管理
- 事件触发器
-
Phase 4: ApprovalsPanel
- 独立审批页面
- 筛选功能
5.2 技术债务
- 添加单元测试覆盖新组件
- 处理 gatewayStore.ts 中的预存 TypeScript 错误
- 实现真实的 API 调用(目前使用模拟数据)
六、参考资料
文档创建: 2026-03-14