feat: 新增技能相关功能
This commit is contained in:
291
Skills-implementation-referrnce.md
Normal file
291
Skills-implementation-referrnce.md
Normal file
@@ -0,0 +1,291 @@
|
||||
# Skills 功能实现分析报告
|
||||
|
||||
## 1. 功能概述
|
||||
|
||||
Skills(技能)功能是AI助手应用的核心模块,用于管理AI技能/插件。该功能允许用户:
|
||||
- 浏览已安装的技能(内置、用户安装)
|
||||
- 搜索和安装新的技能从市场(ClawHub)
|
||||
- 启用/禁用技能
|
||||
- 配置技能的API密钥和环境变量
|
||||
- 批量操作(启用/禁用所有可见技能)
|
||||
- 查看技能详情和配置
|
||||
- 打开技能目录和编辑器
|
||||
|
||||
## 2. 核心功能特性
|
||||
|
||||
### 2.1 技能管理
|
||||
- **技能列表展示**:分类显示内置技能、用户安装技能
|
||||
- **技能筛选**:按来源(全部、内置、市场)和搜索关键词过滤
|
||||
- **技能状态**:显示启用/禁用状态,支持快速切换
|
||||
- **批量操作**:一键启用/禁用所有可见非核心技能
|
||||
|
||||
### 2.2 技能详情与配置
|
||||
- **详情面板**:显示技能名称、描述、版本、图标、来源等信息
|
||||
- **API密钥配置**:为技能配置API密钥(密码输入框)
|
||||
- **环境变量管理**:动态添加/编辑/删除环境变量
|
||||
- **路径操作**:复制技能路径、打开技能目录
|
||||
- **外部链接**:跳转到ClawHub技能页面、打开技能手册
|
||||
|
||||
### 2.3 技能市场
|
||||
- **搜索功能**:实时搜索技能市场
|
||||
- **安装/卸载**:安装新技能、卸载用户安装的技能
|
||||
- **状态显示**:显示已安装状态、安装进度
|
||||
|
||||
### 2.4 系统集成
|
||||
- **网关状态检测**:显示网关运行状态警告
|
||||
- **文件系统集成**:打开技能文件夹、编辑器
|
||||
- **国际化**:完整的多语言支持
|
||||
- **错误处理**:网络超时、频率限制等错误处理
|
||||
|
||||
## 3. 技术架构分析
|
||||
|
||||
### 3.1 前端架构(ClawX - React)
|
||||
```
|
||||
src/pages/Skills/index.tsx # 主页面组件
|
||||
src/stores/skills.ts # Zustand状态管理
|
||||
src/types/skill.ts # 类型定义
|
||||
src/lib/host-api.ts # API客户端
|
||||
src/components/ui/ # UI组件库(Shadcn/ui)
|
||||
```
|
||||
|
||||
### 3.2 后端架构(ClawX - Electron)
|
||||
```
|
||||
electron/api/routes/skills.ts # 技能API路由
|
||||
electron/utils/skill-config.ts # 技能配置管理
|
||||
electron/services/ # 服务层(ClawHub服务等)
|
||||
```
|
||||
|
||||
### 3.3 数据流
|
||||
```
|
||||
前端组件 → Zustand Store → Host API → 后端路由 → 服务层 → 文件系统/网关
|
||||
```
|
||||
|
||||
## 4. 关键组件分析
|
||||
|
||||
### 4.1 状态管理(stores/skills.ts)
|
||||
**核心状态**:
|
||||
```typescript
|
||||
interface SkillsState {
|
||||
skills: Skill[]; // 技能列表
|
||||
searchResults: MarketplaceSkill[]; // 市场搜索结果
|
||||
loading: boolean; // 加载状态
|
||||
searching: boolean; // 搜索中状态
|
||||
searchError: string | null; // 搜索错误
|
||||
installing: Record<string, boolean>;// 安装状态(slug -> 是否安装中)
|
||||
error: string | null; // 通用错误
|
||||
}
|
||||
```
|
||||
|
||||
**核心方法**:
|
||||
- `fetchSkills()`: 从网关和ClawHub获取技能列表
|
||||
- `searchSkills(query)`: 搜索技能市场
|
||||
- `installSkill(slug)`: 安装技能
|
||||
- `uninstallSkill(slug)`: 卸载技能
|
||||
- `enableSkill(skillId)`: 启用技能
|
||||
- `disableSkill(skillId)`: 禁用技能
|
||||
|
||||
### 4.2 页面组件(Skills/index.tsx)
|
||||
**主要UI结构**:
|
||||
1. **头部区域**:标题、副标题、打开文件夹按钮
|
||||
2. **网关状态警告**:网关未运行时的警告提示
|
||||
3. **导航与筛选**:搜索框、来源筛选(全部/内置/市场)
|
||||
4. **批量操作按钮**:启用/禁用所有可见技能、安装技能按钮、刷新按钮
|
||||
5. **技能列表**:技能卡片列表,包含图标、名称、描述、状态开关
|
||||
6. **安装弹窗**:搜索和安装新技能的市场界面
|
||||
7. **详情弹窗**:技能详情和配置面板
|
||||
|
||||
**交互细节**:
|
||||
- 实时搜索防抖(300ms延迟)
|
||||
- 批量操作时的进度反馈
|
||||
- 技能切换时的即时状态更新
|
||||
- 错误处理的用户友好提示
|
||||
|
||||
### 4.3 详情弹窗组件(SkillDetailDialog)
|
||||
**配置部分**:
|
||||
- API密钥配置(密码输入框)
|
||||
- 环境变量管理(动态表单)
|
||||
- 路径操作(复制、打开)
|
||||
- 外部链接(ClawHub、手册)
|
||||
|
||||
**保存机制**:
|
||||
- 配置保存到本地文件
|
||||
- 成功后刷新技能列表
|
||||
- 错误处理的toast通知
|
||||
|
||||
## 5. API接口分析
|
||||
|
||||
### 5.1 后端API路由(/api/skills/*)
|
||||
```
|
||||
GET /api/skills/configs # 获取所有技能配置
|
||||
PUT /api/skills/config # 更新技能配置
|
||||
POST /api/clawhub/search # 搜索技能市场
|
||||
POST /api/clawhub/install # 安装技能
|
||||
POST /api/clawhub/uninstall # 卸载技能
|
||||
GET /api/clawhub/list # 列出已安装技能
|
||||
POST /api/clawhub/open-readme # 打开技能手册
|
||||
POST /api/clawhub/open-path # 打开技能目录
|
||||
```
|
||||
|
||||
### 5.2 前端API调用
|
||||
通过`hostApiFetch`封装调用后端API,支持:
|
||||
- JSON请求/响应处理
|
||||
- 错误规范化
|
||||
- 超时和频率限制处理
|
||||
|
||||
## 6. 数据类型定义
|
||||
|
||||
### 6.1 技能类型(Skill)
|
||||
```typescript
|
||||
interface Skill {
|
||||
id: string; // 技能标识
|
||||
slug?: string; // 技能slug(市场标识)
|
||||
name: string; // 技能名称
|
||||
description: string; // 技能描述
|
||||
enabled: boolean; // 是否启用
|
||||
icon?: string; // 技能图标(emoji或URL)
|
||||
version?: string; // 版本号
|
||||
author?: string; // 作者
|
||||
configurable?: boolean; // 是否可配置
|
||||
config?: Record<string, unknown>; // 配置数据
|
||||
isCore?: boolean; // 是否核心技能(不可禁用)
|
||||
isBundled?: boolean; // 是否内置技能
|
||||
source?: string; // 来源(openclaw-bundled等)
|
||||
baseDir?: string; // 基础目录
|
||||
filePath?: string; // 文件路径
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 市场技能类型(MarketplaceSkill)
|
||||
```typescript
|
||||
interface MarketplaceSkill {
|
||||
slug: string; // 市场slug
|
||||
name: string; // 技能名称
|
||||
description: string; // 技能描述
|
||||
version: string; // 版本号
|
||||
author?: string; // 作者
|
||||
downloads?: number; // 下载量
|
||||
stars?: number; // 星标数
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 错误处理机制
|
||||
|
||||
### 7.1 错误类型
|
||||
- **超时错误**:`fetchTimeoutError`、`searchTimeoutError`、`installTimeoutError`
|
||||
- **频率限制错误**:`fetchRateLimitError`、`searchRateLimitError`、`installRateLimitError`
|
||||
- **网关错误**:网关未运行时的友好提示
|
||||
- **文件系统错误**:目录不存在、权限问题等
|
||||
|
||||
### 7.2 错误处理策略
|
||||
- 错误代码到用户友好消息的映射
|
||||
- 网络错误时的重试机制
|
||||
- 部分失败时的批量操作反馈
|
||||
- Toast通知的用户界面反馈
|
||||
|
||||
## 8. 国际化支持
|
||||
|
||||
### 8.1 翻译键示例
|
||||
- `skills.title`: "Skills"
|
||||
- `skills.subtitle`: "Browse and manage AI skills"
|
||||
- `skills.search`: "Search skills..."
|
||||
- `skills.filter.all`: "All ({count})"
|
||||
- `skills.filter.builtIn`: "Built-in ({count})"
|
||||
- `skills.filter.marketplace`: "Marketplace ({count})"
|
||||
- `skills.actions.enableVisible`: "Enable visible"
|
||||
- `skills.actions.disableVisible`: "Disable visible"
|
||||
- `skills.actions.installSkill`: "Install skill"
|
||||
|
||||
### 8.2 动态内容翻译
|
||||
- 技能来源标签的本地化
|
||||
- 错误消息的本地化
|
||||
- 操作成功/失败的Toast消息
|
||||
|
||||
## 9. UI/UX设计分析
|
||||
|
||||
### 9.1 视觉风格
|
||||
- 卡片式列表布局
|
||||
- 右侧滑出式详情面板
|
||||
- 现代化的输入和按钮样式
|
||||
- 深色/浅色主题支持
|
||||
|
||||
### 9.2 交互设计
|
||||
- 点击技能卡片打开详情
|
||||
- 悬停效果和状态反馈
|
||||
- 批量操作的确认反馈
|
||||
- 安装过程的进度指示
|
||||
|
||||
### 9.3 响应式设计
|
||||
- 桌面优化的布局
|
||||
- 弹窗的自适应宽度
|
||||
- 移动端友好的触摸目标
|
||||
|
||||
## 10. 与zn-ai项目的技术栈映射
|
||||
|
||||
### 10.1 技术栈差异
|
||||
| 组件 | ClawX (源) | zn-ai (目标) |
|
||||
|------|------------|--------------|
|
||||
| 前端框架 | React 18 | Vue 3 |
|
||||
| 状态管理 | Zustand | Pinia |
|
||||
| UI组件库 | Shadcn/ui (基于Radix) | Element Plus + Tailwind CSS |
|
||||
| 构建工具 | Vite | Vite |
|
||||
| 类型系统 | TypeScript | TypeScript |
|
||||
|
||||
### 10.2 适配策略
|
||||
1. **组件迁移**:React组件 → Vue 3组件(Composition API)
|
||||
2. **状态管理**:Zustand Store → Pinia Store
|
||||
3. **UI组件**:Shadcn/ui → Element Plus + 自定义样式
|
||||
4. **API层**:保留相同的API接口,适配Vue调用方式
|
||||
5. **类型系统**:直接复用TypeScript类型定义
|
||||
|
||||
### 10.3 关键挑战
|
||||
1. **UI一致性**:在Element Plus基础上实现类似Shadcn/ui的视觉效果
|
||||
2. **状态管理模式**:从Zustand的函数式风格到Pinia的类Vuex风格
|
||||
3. **组件交互**:Vue的事件系统与React的props/callback差异
|
||||
4. **响应式系统**:Vue的响应式与React的状态更新机制差异
|
||||
|
||||
## 11. 实现优先级建议
|
||||
|
||||
### 高优先级(核心功能)
|
||||
1. 技能列表展示和基本筛选
|
||||
2. 技能启用/禁用切换
|
||||
3. 技能详情查看
|
||||
4. 基本的API密钥配置
|
||||
|
||||
### 中优先级(增强功能)
|
||||
1. 环境变量管理
|
||||
2. 技能市场搜索和安装
|
||||
3. 批量操作功能
|
||||
4. 文件夹和路径操作
|
||||
|
||||
### 低优先级(优化功能)
|
||||
1. 高级错误处理和重试
|
||||
2. 性能优化(虚拟滚动等)
|
||||
3. 离线模式支持
|
||||
4. 技能导入/导出
|
||||
|
||||
## 12. 风险评估
|
||||
|
||||
### 技术风险
|
||||
- **网关集成**:zn-ai可能没有相同的网关架构
|
||||
- **文件系统操作**:跨平台文件路径处理的兼容性
|
||||
- **技能市场依赖**:ClawHub服务的可用性和API稳定性
|
||||
|
||||
### 兼容性风险
|
||||
- **技能格式兼容**:技能包格式和配置schema的兼容性
|
||||
- **升级路径**:未来技能格式变更的向后兼容
|
||||
|
||||
### 实施风险
|
||||
- **开发工作量**:从React到Vue的完整重写工作量较大
|
||||
- **测试覆盖**:需要完整的端到端测试确保功能稳定
|
||||
|
||||
## 13. 后续步骤建议
|
||||
|
||||
1. **详细设计阶段**:基于本分析完成Vue组件的详细设计
|
||||
2. **原型开发**:开发核心功能的可交互原型
|
||||
3. **迭代开发**:按照优先级分批次实现功能
|
||||
4. **集成测试**:与现有zn-ai系统进行集成测试
|
||||
5. **用户测试**:获取真实用户反馈并进行优化
|
||||
|
||||
---
|
||||
*分析完成时间:2026-04-10*
|
||||
*分析基于ClawX项目commit: 5f54271 (feat(models): add models configuration page...)*
|
||||
Reference in New Issue
Block a user