skillhub/openspec/changes/add-suite-bundle-publishing/proposal.md

7.8 KiB
Raw Blame History

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 按以下边界拆分,后续阶段不得绕过第一阶段建立的权限、 生命周期和性能约束:

  1. Suite 创建/更新 Bundle、成员格式验证、权限重检、生命周期协调和 Web 进度闭环。
  2. 基于 Suite 当前 latestVersionId 的任意成员反向发现。
  3. Suite Label、展示信息发布校验、概述模板和 Entry Skill 固定版本说明。