mirror of
https://github.com/iflytek/skillhub.git
synced 2026-09-24 00:55:35 +00:00
7.8 KiB
7.8 KiB
Why
PR #828 已经完成 Suite 版本模型、套件专区搜索和原子安装,但创建或更新包含多个本地 Skill 的 Suite 时,维护者仍需逐个创建或上传 Skill,再手工把 Suite 固定到对应版本。Suite 还可能引用 维护者并不拥有的公开 Skill,因此 Bundle 发布必须区分“操作者有权创建或发布的包内容”和 “操作者只能复用的外部精确引用”。
What Changes
- 为创建和更新 Suite 增加共用的两阶段导入:通过一个 ZIP,或受支持浏览器选择的一个根目录, 一次提交多个 Skill 文件夹;先预览成员与发布动作,再明确确认。确认前不得创建 Skill、 SkillVersion、Suite、SuiteVersion、扫描或审核任务。
- Manifest 使用两种成员形式描述完整的目标 Suite 快照:一种是操作者有权发布的已有 Skill 包, 或操作者有权在目标 Namespace 创建的新 Skill 包;另一种是不修改、也不要求归 Suite 维护者 所有的精确 PUBLISHED SkillVersion 引用。
- Bundle 先校验唯一 Manifest、成员目录边界和文件归属,再将每个目录独立还原为以
SKILL.md为根的普通 Skill 包,复用现有路径、大小、扩展名、内容签名、YAML、元数据和合规校验。任一成员 存在阻塞错误时不得确认,也不得通过猜测目录或静默选择冲突字段继续。 - 新增持久化 Bundle 发布操作。只有具备独立创建或发布权限且携带包的成员进入现有校验、扫描和 审核流程;所有包版本均为 PUBLISHED 且全部引用仍然有效后,才原子创建新 Suite 及首个草稿, 或为已有 Suite 创建 DRAFT SuiteVersion。
- Bundle 确认后进入独立发布任务详情;“我的套件”以“技能套件/发布任务”页签分离结果和过程, 发布任务按“需要处理/进行中/最近完成”分层。停止创建 Suite 后保留任务、已创建的 SkillVersion 和审核任务,并继续提供成员版本与审核入口。
- 未变化成员继续使用原精确版本,不创建版本、扫描或审核;支持添加、移除、调整顺序和显式重新 固定引用成员版本。
- 任意成员 Skill 均可展示当前用户可见的所属 Suite,不再只支持 Entry Skill。
- 技能市场(
/search)与套件专区(/suites)保持独立。#828 已经交付的套件专区和类型化 Suite 搜索无需替换。 - 新 SuiteVersion 提交或发布前必须具备非空摘要和 Markdown 概述;不完整的 DRAFT 仍可保存, 已发布历史数据仍可读取。
- Suite 可以配置自己的 Label,并复用 Registry 的 Label 定义和权限类型,用于套件专区筛选。 Suite Label 不向成员 Skill 级联。Skill Tag 仍是指向 PUBLISHED SkillVersion 的版本别名,不引入 Suite。
- 暂不支持覆盖无权管理的已有 Skill、批量迁移 Namespace、按成员关键词提升 Suite 排名、CLI 上传 Bundle、嵌套 Suite 和跨 Registry 成员。
相对 Issue #847 的需求取舍
| Issue 原提议 | 结论 | OpenSpec 决策 |
|---|---|---|
| 上传一个多 Skill 归档 | 保留 | 归档只上传一次;预览使用不占位且有期限的 PreviewSession,确认后才创建并占位的 ExecutionOperation。 |
| 每个 Suite 成员都必须在归档中有目录 | 调整 | 只有需要发布内容的成员才提供包目录;纯引用成员在 Manifest 中填写精确已发布版本。 |
| 被引用 Skill 必须属于 Suite 维护者 | 拒绝 | Suite 可以引用其他人发布的合规公开 Skill;引用权限与发布权限相互独立。 |
| 通过 fingerprint 判断包内容变化 | 保留并澄清 | 携带包的成员使用现有 Skill 规范化 fingerprint;纯引用成员比较精确 SkillVersion 身份。 |
| 未变化的包不升版、不重新扫描 | 保留 | 继续引用当前精确 SkillVersion。 |
| 变化的包沿用现有 Skill 发布流程 | 保留 | 仅限操作者已经具备该 Skill 的独立发布权限。 |
| 包成员变化后立刻创建 SuiteVersion | 调整 | 等全部包版本 PUBLISHED、全部引用仍有效后,再创建一个 DRAFT SuiteVersion;创建模式同时原子创建 Suite 容器。 |
| 消除 N 次上传和 N 个审核任务 | 调整 | 消除 N 次人工上传,但变化 Skill 仍独立审核,Suite 仍保留自身审核。 |
| Bundle 自动创建不存在的 Skill | 保留并收紧 | 仅允许在操作者具备 Skill 创建权限的 Namespace 中创建;坐标冲突、越权或 Namespace 不可写时阻塞整个预览。 |
| 批量设置 labels/tags | 调整 | 为 Suite 自身配置 Label,不向成员 Skill 扩散;Suite 不支持 SkillVersion Tag。 |
| 把 Suite 结果并入技能市场 | 拒绝 | 技能市场与套件专区保持分开;/suites 已提供 Suite 搜索和卡片。 |
| 成员关键词提升 Suite 排名 | 延后 | 相关性和隐私安全索引需要单独提案。 |
| 任意成员展示所属 Suite | 保留 | 仅返回最新、可见、ACTIVE、非隐藏、PUBLISHED 的 Suite 引用,并标明是否为 Entry。 |
| Suite 摘要或概述为空 | 调整 | DRAFT 可暂时不完整,但新提交或直接发布必须同时具备摘要和概述,发布页不能用泛化文案冒充。 |
| 保留 #828 精确引用模型 | 保持不变 | SuiteVersion 仍只引用精确 PUBLISHED SkillVersion,发布后保持不可变。 |
Capabilities
New Capabilities
suite-bundle-publishing:从一个归档或根目录预览、确认、跟踪、恢复并完成 Suite 创建或更新, 同时严格区分有权创建/发布的包内容与非本人所有的精确版本引用。suite-member-discovery:保持技能市场与套件专区独立,同时让任意成员 Skill 展示经过隐私过滤的 所属 Suite。suite-metadata:要求 Suite 具备有效展示内容并支持 Suite 自有 Label,不修改成员 Skill 元数据 或 SkillVersion Tag。
Modified Capabilities
无。现有 add-skill-suites 变更尚未归档为主 OpenSpec capability;这些增量 capability 依赖它,
但不修改其精确引用和生命周期要求。
Impact
- 领域与持久化:新增 Bundle 操作、目标坐标占用、成员结果和 Suite-to-Label 关联;不增加 SkillVersion 或 SuiteVersion 生命周期状态。
- API / OpenAPI:新增预览、确认、状态、取消、重试和 Suite Label 接口;扩展 Skill 详情中的 Suite 引用和套件专区标签筛选;技能与套件发现 API 继续分开。
- 对象存储:按操作临时保存一个上传归档,支持过期和补偿清理;日志不得保存归档内容。
- 安全与治理:复用包校验、Scanner、Namespace 权限、单 Skill 审核、Suite 审核和审计规则; 管理 Suite 不会获得被引用 Skill 的发布权限。
- 性能:每个携带包成员只解压和计算一次 hash;批量读取引用与权限;未变化成员不扫描;限制 归档和成员规模;反向引用不得产生 N+1 查询。
- Web:在“创建 Suite”和“创建新版本”中增加手工组合/本地导入选择,新增 Bundle 差异预览、 权限提示和进度页;增加所属 Suite、发布信息校验、Suite Label,以及按需展开的 Entry Skill 固定版本说明。技能市场与套件专区导航保持不变。
- 兼容性:现有单 Skill 发布、单 Skill Label/Tag 管理、Suite 管理和安装 API、旧客户端以及 已发布 SuiteVersion 快照保持不变。
分阶段交付
OpenSpec 保留完整产品方向,但实现和 PR 按以下边界拆分,后续阶段不得绕过第一阶段建立的权限、 生命周期和性能约束:
- Suite 创建/更新 Bundle、成员格式验证、权限重检、生命周期协调和 Web 进度闭环。
- 基于 Suite 当前
latestVersionId的任意成员反向发现。 - Suite Label、展示信息发布校验、概述模板和 Entry Skill 固定版本说明。