feat: 新增技能相关功能

This commit is contained in:
duanshuwen
2026-04-10 23:03:56 +08:00
parent 90a3ff6f77
commit 825fe36967
17 changed files with 2295 additions and 27 deletions

View 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...)*