feat: 新增工作台我的技能和技能配置功能
新增功能: - 我的技能页面:管理已订阅技能,支持启用/禁用/配置/删除 - 技能配置页面:为已订阅技能提供 key-value 变量配置能力 - 导航栏新增"我的技能"入口(使用 FiBox 图标) 重构内容: - 技能市场页面:移除"全部技能/已订阅"切换,专注技能浏览和订阅 - 技能详情页面:移除订阅逻辑,统一使用"当前生效版本"布局 - 技能图标样式:移除渐变色背景,改为纯 emoji 显示 数据结构: - 新增 userSubscriptions 数组(用户级订阅和配置数据) 状态显示: - 我的技能列表状态改为纯文字(启用/禁用/已下架)
This commit is contained in:
124
openspec/specs/my-skills/spec.md
Normal file
124
openspec/specs/my-skills/spec.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# Capability: 我的技能
|
||||
|
||||
## Purpose
|
||||
|
||||
提供我的技能管理功能,允许用户查看、启用/禁用、配置和取消订阅已订阅的技能。
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: 我的技能页面访问
|
||||
系统 SHALL 在工作台导航栏提供"我的技能"入口,用户点击后进入我的技能管理页面。
|
||||
|
||||
#### Scenario: 进入我的技能页面
|
||||
- **WHEN** 用户点击导航栏"我的技能"入口
|
||||
- **THEN** 系统显示我的技能管理页面
|
||||
- **AND** 页面包含搜索/筛选卡片
|
||||
- **AND** 页面展示已订阅技能列表
|
||||
|
||||
### Requirement: 技能列表展示
|
||||
系统 SHALL 以表格形式展示已订阅的技能,包括技能名称、描述、分类、状态和操作列。
|
||||
|
||||
#### Scenario: 查看技能列表
|
||||
- **WHEN** 我的技能页面加载完成
|
||||
- **THEN** 系统显示表格,包含以下列:
|
||||
- 技能名称(带图标)
|
||||
- 描述
|
||||
- 分类
|
||||
- 状态
|
||||
- 操作
|
||||
|
||||
#### Scenario: 列表数据来源
|
||||
- **WHEN** 我的技能页面加载
|
||||
- **THEN** 系统显示 userSubscriptions 中的所有订阅记录
|
||||
- **AND** 根据 skillId 关联获取技能的 currentVersion 信息
|
||||
|
||||
### Requirement: 技能状态显示
|
||||
系统 SHALL 根据技能上架状态和用户启用状态显示不同的状态标识。
|
||||
|
||||
#### Scenario: 已上架且启用的技能
|
||||
- **WHEN** 技能状态为 published 且 enabled 为 true
|
||||
- **THEN** 状态列显示"●启用"(绿色)
|
||||
|
||||
#### Scenario: 已上架但禁用的技能
|
||||
- **WHEN** 技能状态为 published 且 enabled 为 false
|
||||
- **THEN** 状态列显示"○禁用"(灰色)
|
||||
|
||||
#### Scenario: 已下架的技能
|
||||
- **WHEN** 技能状态为 unlisting、unlisted 或 dev
|
||||
- **THEN** 状态列显示"▣已下架"(红色/警告色)
|
||||
|
||||
### Requirement: 技能启用/禁用
|
||||
系统 SHALL 允许用户启用或禁用已上架的技能。
|
||||
|
||||
#### Scenario: 启用技能
|
||||
- **WHEN** 用户点击"启用"按钮
|
||||
- **THEN** 系统显示确认弹框
|
||||
- **AND** 弹框标题为"确认启用"
|
||||
- **AND** 弹框内容为"确定要启用"<技能名称>"吗?"
|
||||
- **AND** 用户确认后将 enabled 设置为 true
|
||||
- **AND** 显示启用成功提示
|
||||
|
||||
#### Scenario: 禁用技能
|
||||
- **WHEN** 用户点击"禁用"按钮
|
||||
- **THEN** 系统显示确认弹框
|
||||
- **AND** 弹框标题为"确认禁用"
|
||||
- **AND** 弹框内容为"确定要禁用"<技能名称>"吗?"
|
||||
- **AND** 用户确认后将 enabled 设置为 false
|
||||
- **AND** 显示禁用成功提示
|
||||
|
||||
#### Scenario: 下架技能禁用启用按钮
|
||||
- **WHEN** 技能状态为"已下架"
|
||||
- **THEN** 操作列不显示启用/禁用按钮
|
||||
- **AND** 仅显示删除按钮
|
||||
|
||||
### Requirement: 技能配置入口
|
||||
系统 SHALL 为已订阅的技能提供配置入口。
|
||||
|
||||
#### Scenario: 配置按钮显示
|
||||
- **WHEN** 技能状态为"已上架"
|
||||
- **THEN** 操作列显示"配置"按钮
|
||||
|
||||
#### Scenario: 下架技能禁用配置按钮
|
||||
- **WHEN** 技能状态为"已下架"
|
||||
- **THEN** 操作列不显示"配置"按钮
|
||||
|
||||
#### Scenario: 进入配置页面
|
||||
- **WHEN** 用户点击"配置"按钮
|
||||
- **THEN** 系统跳转到技能配置页面
|
||||
- **AND** 传递当前技能的订阅信息
|
||||
|
||||
### Requirement: 取消订阅
|
||||
系统 SHALL 允许用户取消订阅(删除)技能。
|
||||
|
||||
#### Scenario: 删除已订阅技能
|
||||
- **WHEN** 用户点击"删除"按钮
|
||||
- **THEN** 系统显示确认弹框
|
||||
- **AND** 弹框标题为"确认取消订阅"
|
||||
- **AND** 弹框内容为"确定要取消订阅"<技能名称>"吗?取消后将无法使用该技能,且配置数据将被删除。"
|
||||
- **AND** 用户确认后从 userSubscriptions 中移除该订阅记录
|
||||
- **AND** 显示删除成功提示
|
||||
|
||||
#### Scenario: 删除下架技能
|
||||
- **WHEN** 技能状态为"已下架"且用户点击"删除"按钮
|
||||
- **THEN** 系统执行相同的删除流程
|
||||
- **AND** 删除后技能不再显示在列表中
|
||||
|
||||
### Requirement: 搜索和筛选
|
||||
系统 SHALL 支持按关键词、分类和状态筛选已订阅的技能。
|
||||
|
||||
#### Scenario: 关键词搜索
|
||||
- **WHEN** 用户在搜索框输入关键词
|
||||
- **THEN** 系统实时过滤显示匹配的技能
|
||||
- **AND** 匹配范围包括技能名称和描述
|
||||
|
||||
#### Scenario: 按分类筛选
|
||||
- **WHEN** 用户选择分类下拉框中的分类
|
||||
- **THEN** 系统仅显示该分类下的已订阅技能
|
||||
|
||||
#### Scenario: 按状态筛选
|
||||
- **WHEN** 用户选择状态下拉框中的选项
|
||||
- **THEN** 系统根据选择显示相应状态的技能:
|
||||
- "全部":显示所有已订阅技能
|
||||
- "启用":仅显示 enabled 为 true 的已上架技能
|
||||
- "禁用":仅显示 enabled 为 false 的已上架技能
|
||||
- "已下架":仅显示已下架的技能
|
||||
128
openspec/specs/skill-config/spec.md
Normal file
128
openspec/specs/skill-config/spec.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Capability: 技能配置
|
||||
|
||||
## Purpose
|
||||
|
||||
提供技能配置功能,允许用户为已订阅的技能配置 key-value 变量。
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: 技能配置页面访问
|
||||
系统 SHALL 提供技能配置页面,允许用户为已订阅的技能配置 key-value 变量。
|
||||
|
||||
#### Scenario: 从我的技能进入配置
|
||||
- **WHEN** 用户在"我的技能"页面点击"配置"按钮
|
||||
- **THEN** 系统跳转到技能配置页面
|
||||
- **AND** 显示当前技能的基本信息
|
||||
- **AND** 显示当前技能的配置变量列表
|
||||
|
||||
#### Scenario: 返回我的技能
|
||||
- **WHEN** 用户点击"返回我的技能"链接
|
||||
- **THEN** 系统返回"我的技能"页面
|
||||
|
||||
### Requirement: 技能基本信息展示
|
||||
系统 SHALL 在配置页面顶部展示技能基本信息,布局和样式参考开发台"当前生效版本"卡片。
|
||||
|
||||
#### Scenario: 查看技能基本信息
|
||||
- **WHEN** 技能配置页面加载完成
|
||||
- **THEN** 系统在第一个卡片显示:
|
||||
- 技能图标(大尺寸,48px)
|
||||
- 技能公开名称(h3 标题样式)
|
||||
- 分类标签(蓝色高亮)和其他标签
|
||||
- 技能描述
|
||||
- 订阅数、评分和版本号(带图标)
|
||||
|
||||
### Requirement: 变量配置列表
|
||||
系统 SHALL 以表格形式展示技能的配置变量,每行包含 Key、Value 和操作列。
|
||||
|
||||
#### Scenario: 查看配置列表
|
||||
- **WHEN** 配置页面加载完成
|
||||
- **THEN** 系统在第二个卡片显示配置变量表格
|
||||
- **AND** 表格包含以下列:
|
||||
- Key 输入框
|
||||
- Value 输入框
|
||||
- 删除按钮(×)
|
||||
|
||||
#### Scenario: 空配置状态
|
||||
- **WHEN** 用户尚未添加任何配置变量
|
||||
- **THEN** 系统显示空表格或提示信息
|
||||
|
||||
### Requirement: 新增配置项
|
||||
系统 SHALL 允许用户新增配置项。
|
||||
|
||||
#### Scenario: 点击新增配置按钮
|
||||
- **WHEN** 用户点击右上角"+ 新增配置"按钮
|
||||
- **THEN** 系统在表格中新增一行
|
||||
- **AND** 新行包含空的 Key 输入框、空的 Value 输入框和删除按钮
|
||||
- **AND** Key 输入框自动获得焦点
|
||||
|
||||
### Requirement: 删除配置项
|
||||
系统 SHALL 允许用户删除配置项。
|
||||
|
||||
#### Scenario: 删除配置项
|
||||
- **WHEN** 用户点击某行的删除按钮(×)
|
||||
- **THEN** 系统从表格中移除该行
|
||||
- **AND** 不需要确认
|
||||
|
||||
#### Scenario: 删除最后一个配置项
|
||||
- **WHEN** 用户删除最后一个配置项
|
||||
- **THEN** 系统允许删除操作
|
||||
- **AND** 表格变为空状态
|
||||
|
||||
### Requirement: 配置输入校验
|
||||
系统 SHALL 对配置输入进行校验,确保 Key 和 Value 不能为空。
|
||||
|
||||
#### Scenario: Key 为空时保存
|
||||
- **WHEN** 用户点击"保存"按钮且存在 Key 为空的配置项
|
||||
- **THEN** 系统阻止保存操作
|
||||
- **AND** 显示错误提示"配置项的 Key 不能为空"
|
||||
- **AND** 高亮显示 Key 为空的输入框
|
||||
|
||||
#### Scenario: Value 为空时保存
|
||||
- **WHEN** 用户点击"保存"按钮且存在 Value 为空的配置项
|
||||
- **THEN** 系统阻止保存操作
|
||||
- **AND** 显示错误提示"配置项的 Value 不能为空"
|
||||
- **AND** 高亮显示 Value 为空的输入框
|
||||
|
||||
#### Scenario: 所有配置项填写完整
|
||||
- **WHEN** 用户点击"保存"按钮且所有配置项的 Key 和 Value 都不为空
|
||||
- **THEN** 系统允许保存操作
|
||||
|
||||
### Requirement: 保存配置
|
||||
系统 SHALL 允许用户保存配置到用户订阅数据中。
|
||||
|
||||
#### Scenario: 保存成功
|
||||
- **WHEN** 用户点击右下角"保存"按钮且校验通过
|
||||
- **THEN** 系统将配置数据保存到 userSubscriptions 的 config 字段
|
||||
- **AND** 显示保存成功提示
|
||||
- **AND** 返回"我的技能"页面
|
||||
|
||||
#### Scenario: 未修改直接返回
|
||||
- **WHEN** 用户未保存配置直接点击"返回我的技能"
|
||||
- **THEN** 系统直接返回"我的技能"页面
|
||||
- **AND** 不显示任何提示
|
||||
|
||||
### Requirement: 配置数据存储
|
||||
系统 SHALL 为每个用户订阅的技能独立存储配置数据。
|
||||
|
||||
#### Scenario: 配置数据结构
|
||||
- **WHEN** 系统保存配置数据
|
||||
- **THEN** 数据存储格式为:
|
||||
```javascript
|
||||
config: [
|
||||
{ key: "apiKey", value: "sk-xxxxx" },
|
||||
{ key: "model", value: "gpt-4" }
|
||||
]
|
||||
```
|
||||
|
||||
#### Scenario: 用户级配置隔离
|
||||
- **WHEN** 多个用户订阅同一技能
|
||||
- **THEN** 每个用户的配置数据独立存储
|
||||
- **AND** 互不影响
|
||||
|
||||
### Requirement: 配置页面禁用状态处理
|
||||
系统 SHALL 在技能下架后禁止访问配置页面。
|
||||
|
||||
#### Scenario: 下架技能无法配置
|
||||
- **WHEN** 技能状态为"已下架"
|
||||
- **THEN** "我的技能"页面不显示"配置"按钮
|
||||
- **AND** 用户无法访问配置页面
|
||||
87
openspec/specs/skill-market/spec.md
Normal file
87
openspec/specs/skill-market/spec.md
Normal file
@@ -0,0 +1,87 @@
|
||||
# Capability: 技能市场
|
||||
|
||||
## Purpose
|
||||
|
||||
提供技能市场功能,允许用户浏览、搜索和订阅已上架的技能。
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: 技能市场浏览
|
||||
系统 SHALL 在工作台提供技能市场页面,展示所有已上架的技能供用户浏览和订阅。
|
||||
|
||||
#### Scenario: 查看技能市场
|
||||
- **WHEN** 用户点击导航栏"技能市场"入口
|
||||
- **THEN** 系统显示技能市场页面
|
||||
- **AND** 页面包含搜索/筛选卡片
|
||||
- **AND** 页面展示所有状态为"已上架"(published)的技能卡片
|
||||
|
||||
#### Scenario: 搜索技能
|
||||
- **WHEN** 用户在搜索框输入关键词
|
||||
- **THEN** 系统实时过滤显示匹配的技能
|
||||
- **AND** 匹配范围包括技能名称、描述、分类和标签
|
||||
|
||||
#### Scenario: 按分类筛选
|
||||
- **WHEN** 用户选择分类下拉框中的分类
|
||||
- **THEN** 系统仅显示该分类下的技能
|
||||
|
||||
### Requirement: 技能卡片展示
|
||||
系统 SHALL 以卡片形式展示技能信息,包括技能图标、名称、作者、描述、分类、标签、订阅数和评分。
|
||||
|
||||
#### Scenario: 查看技能卡片
|
||||
- **WHEN** 技能市场页面加载完成
|
||||
- **THEN** 每个技能卡片显示以下信息:
|
||||
- 技能图标(emoji)
|
||||
- 技能公开名称
|
||||
- 作者名称
|
||||
- 技能描述
|
||||
- 分类标签(蓝色高亮)
|
||||
- 其他标签
|
||||
- 订阅数
|
||||
- 评分
|
||||
- "订阅"按钮
|
||||
|
||||
#### Scenario: 订阅按钮状态
|
||||
- **WHEN** 用户查看任意技能卡片
|
||||
- **THEN** 订阅按钮始终显示"订阅"文本
|
||||
- **AND** 不显示已订阅状态
|
||||
|
||||
### Requirement: 技能详情查看
|
||||
系统 SHALL 允许用户点击技能卡片查看技能详情。
|
||||
|
||||
#### Scenario: 进入技能详情页
|
||||
- **WHEN** 用户点击技能卡片
|
||||
- **THEN** 系统跳转到技能详情页面
|
||||
- **AND** 显示技能基本信息、使用说明、文件列表和当前版本
|
||||
|
||||
#### Scenario: 返回技能市场
|
||||
- **WHEN** 用户在技能详情页点击"返回技能市场"
|
||||
- **THEN** 系统返回技能市场页面
|
||||
|
||||
### Requirement: 技能订阅
|
||||
系统 SHALL 允许用户订阅技能,订阅后技能自动加入"我的技能"列表。
|
||||
|
||||
#### Scenario: 发起订阅
|
||||
- **WHEN** 用户点击技能卡片的"订阅"按钮
|
||||
- **THEN** 系统显示确认弹框
|
||||
- **AND** 弹框标题为"确认订阅"
|
||||
- **AND** 弹框内容为"确定要订阅"<技能名称>"吗?"
|
||||
|
||||
#### Scenario: 确认订阅
|
||||
- **WHEN** 用户在确认弹框中点击"订阅"按钮
|
||||
- **THEN** 系统将技能添加到用户订阅列表
|
||||
- **AND** 设置 enabled 为 true(默认启用)
|
||||
- **AND** 初始化 config 为空数组
|
||||
- **AND** 显示订阅成功提示
|
||||
|
||||
#### Scenario: 取消订阅操作
|
||||
- **WHEN** 用户在确认弹框中点击"取消"按钮
|
||||
- **THEN** 系统关闭弹框
|
||||
- **AND** 不执行订阅操作
|
||||
|
||||
### Requirement: 下架技能处理
|
||||
系统 SHALL 不在技能市场显示已下架的技能。
|
||||
|
||||
#### Scenario: 技能市场过滤下架技能
|
||||
- **WHEN** 技能市场页面加载
|
||||
- **THEN** 系统仅显示 status 为 "published" 的技能
|
||||
- **AND** 不显示 status 为 "unlisting"、"unlisted" 或 "dev" 的技能
|
||||
Reference in New Issue
Block a user