skillhub/docs/25-skill-suites.md
XiaoSeS 8c0b853023 fix(suite): close rollout and concurrency gaps
Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com>
2026-09-09 13:54:59 +08:00

151 lines
7 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.

# Skill Suite 设计与使用
## 定位
Skill Suite 是一个有独立身份和版本的 Skill 集合。它只引用当前 SkillHub 中已经发布的精确
SkillVersion,不复制 Skill 文件,也不替成员重新执行扫描或审核。
Skill 与 Suite 的完整身份都包含资源类型,因此下列两个资源可以同时存在:
```text
SKILL @global/marketing
SUITE @global/marketing
```
原有 `skillhub install @global/marketing` 始终安装 Skill;Suite 必须使用
`skillhub suite install @global/marketing`,不会根据名称猜测类型。
## 版本和生命周期
SuiteVersion 固定成员的 Skill ID、SkillVersion ID、坐标、版本和 fingerprint。成员发布新版本不会
改变现有 SuiteVersion;调整成员、顺序、Entry Skill 或可见范围都需要创建新的 SuiteVersion。
```text
DRAFT -> PENDING_REVIEW -> PUBLISHED -> YANKED
\-> REJECTED -> DRAFT
```
- PRIVATE Suite 可以从 DRAFT 直接发布。
- PUBLIC 和 NAMESPACE_ONLY Suite 需要一次 Suite 级审核。
- Suite 没有可执行包,因此没有 SCANNING 或 SCAN_FAILED 状态。
- 隐藏、归档、下架或删除 Suite 不会改变任何成员 Skill。
- 成员失效后,已发布 SuiteVersion 保留历史快照并显示为不可安装,不会自动切换到成员最新版本。
## 成员与权限
一个 SuiteVersion 最多包含 100 个不同 Skill,并且必须明确选择其中一个普通成员作为 Entry Skill。
Entry Skill 仍是完整、可独立安装的 Skill。跨 Namespace 的 PUBLIC Skill 可以作为 Entry;非 PUBLIC
成员仍必须满足下表中的同 Namespace 受众约束。
v1 不支持嵌套 Suite、版本范围、外部 Registry 成员或条件成员。
Suite 的可见范围不能宽于成员:
| Suite 可见性 | 允许的成员 |
| --- | --- |
| PUBLIC | 仅 PUBLIC Skill |
| NAMESPACE_ONLY | PUBLIC,或同 Namespace 的 NAMESPACE_ONLY Skill |
| PRIVATE | PUBLIC,或同 Namespace 的 NAMESPACE_ONLY/PRIVATE Skill |
创建、提交、审核和安装时都会重新检查成员资格。成员被下架、隐藏、归档、收窄权限或硬删除后,
SuiteVersion 仍为 PUBLISHED,但安装计划会整体失败。硬删除只清空成员外键;坐标、版本和 fingerprint
快照继续用于历史展示和审计。
创作页面保存成员时会携带候选接口返回的精确 `skillVersionId`。服务端按 ID 读取版本,并校验坐标和
版本一致后再保存快照,不会按名称重新解析到另一个所有者的同名 Skill。
## `suite.yaml` 定义
`suite.yaml` 是可移植的 Suite 创作格式,不是上传到 Agent 的多 Skill ZIP:
```yaml
apiVersion: skillhub.iflytek.com/v1alpha1
kind: SkillSuite
metadata:
namespace: global
slug: superpowers
version: 1.0.0
displayName: Superpowers
spec:
visibility: PUBLIC
entrySkill: "@global/using-superpowers@1.0.0"
members:
- skill: "@global/using-superpowers"
version: 1.0.0
- skill: "@global/brainstorming"
version: 2.1.0
```
当前版本通过 Web 编辑器或 Suite API 创建同一份定义;CLI v1 负责安装生命周期,尚不读取或发布
`suite.yaml`。保留该格式是为了后续增加 CLI 导入时不改变服务端领域模型。
## CLI 安装生命周期
```bash
skillhub suite install @global/superpowers --version 1.0.0
skillhub suite check @global/superpowers
skillhub suite upgrade @global/superpowers --check
skillhub suite upgrade @global/superpowers
skillhub suite remove @global/superpowers
```
安装、升级和卸载先获取当前 Suite 的本地操作锁,避免两个 CLI 进程基于同一份旧 inventory 并发
提交。安装随后解析精确计划并下载、校验全部成员,再按稳定顺序锁定目标目录并整体提交。提交中途
失败时,CLI 恢复本次替换的目录并保持安装前 inventory。卸载只移除当前 Suite 的来源;直接安装、
被其他 Suite 共享或已被本地修改的成员目录会保留。
CLI inventory 向后兼容旧记录。旧记录没有 `installedBy` 时按直接安装处理,不会在移除 Suite 时被
误删。新 CLI 在 Server 未声明 `skill-suite-v1` 能力时会明确停止 Suite 命令,普通 Skill 命令不受影响。
CLI 获取安装计划时会发送独立的 `Idempotency-Key`,遇到网络错误或 502/503/504 时使用同一个 key
重试一次。Server 按登录用户隔离该 key;匿名请求使用经过哈希的请求来源、客户端标识和 Suite 坐标
隔离,不保存原始身份字段。Server 为计划生成 `operationId`,在 24 小时窗口内避免重复记录 Suite
安装请求和审计。
安装计划本身不预增成员下载数;每个成员仍由原有 Skill 下载接口按实际请求计数。
本地 `local` profile 可直接运行 `make suite-smoke`。验证 release Compose 时必须使用真实管理员会话:
```bash
SMOKE_ADMIN_USERNAME=admin \
SMOKE_ADMIN_PASSWORD='<configured-password>' \
./scripts/suite-smoke-test.sh http://localhost:8080
```
脚本不会输出密码,并在结束时删除其创建的临时 Suite 和 Skill。
## API 与发现
- Suite 管理与详情:`/api/v1/suites/**`、`/api/web/suites/**`
- 当前用户可管理的 Suite:`/api/v1/me/suites`、`/api/web/me/suites`
- 类型化资源发现:`/api/v1/resources`、`/api/web/resources`
- 原有 Skill 搜索接口继续只返回 Skill。
类型化发现结果通过 `resourceType=SKILL|SUITE` 区分同名资源。Suite 详情返回固定版本、按顺序排列
的成员快照、Entry Skill、实时可安装状态和阻塞原因。普通 Skill 详情会列出当前用户可见、以该 Skill
作为 Entry 的最新已发布 SuiteVersion,并链接到完整 Suite;Skill 的独立安装能力保持不变。
## 部署顺序
数据库迁移会先把既有审核任务回填为 `SKILL_VERSION`,保留旧 Skill 专用列,并通过数据库触发器
把旧版 Server 新写入的 Skill 审核同步补全为类型化 subject。官方单实例
`compose.release.yml` 和本地开发 profile 已默认开启 Suite 审核写入,因为它们不会同时运行新旧 Server。
其他部署方式默认保持关闭。全新安装、单实例升级或停机升级可直接设置:
```bash
SKILLHUB_SUITE_REVIEW_WRITES_ENABLED=true
```
旧版与新版 Server 会同时运行的滚动升级,应在发布新版前保持:
```bash
SKILLHUB_SUITE_REVIEW_WRITES_ENABLED=false
```
用该配置完成所有 Server 实例升级;确认不再有旧版实例后,将其改为 `true` 并再次滚动重启。开关关闭
期间,现有 Skill 审核保持可用,Suite 草稿和 PRIVATE 直发不受影响,PUBLIC 与 NAMESPACE_ONLY
Suite 的新审核提交会被拒绝。Server 启动时会记录明确告警,避免门禁被长期遗忘。
## 日志与审计
Suite 创建、编辑、提交、审核、发布、下架、隐藏、恢复、归档和删除都会写审计记录。业务日志仅记录
Suite ID、SuiteVersion ID、actor ID 和 request ID 等定位字段,不记录成员内容、Token 或下载地址。