diff --git a/docs/20-cloud-url-builtin-skills-setup.md b/docs/20-cloud-url-builtin-skills-setup.md index 3d2a20f4..d5b292b3 100644 --- a/docs/20-cloud-url-builtin-skills-setup.md +++ b/docs/20-cloud-url-builtin-skills-setup.md @@ -35,7 +35,8 @@ manifest 需要维护四个字段: - `slug`:Skill 在 `@global` 下的 slug。 - `version`:期望同步的 Skill 版本。 - `url`:Skill zip 包的云存储 HTTPS 链接。 -- `sha256`:发布制品的 SHA-256,小写 64 位十六进制字符串。 +- `sha256`:发布制品内容的 SHA-256,小写 64 位十六进制字符串。它是完整性依据, + 不要求 URL 的文件名必须等于 SHA-256;CDN 自动生成 UUID 文件名也可以使用。 ## 2. Manifest 配置 @@ -87,6 +88,7 @@ manifest 文件格式如下: - 每一项必须同时填写 `slug`、`version`、`url`、`sha256`。 - `slug` 必须符合 SkillHub slug 规则。 - `sha256` 必须是小写 64 位十六进制字符串,并与 URL 返回的原始 zip 字节一致。 +- `url` 最后路径段必须是 `.zip` 文件;文件名可以是 SHA-256、UUID 或 CDN 生成的不可变名称。 - 同一个 `slug + version` 重复出现时,只处理第一条,后续重复项会被跳过。 - manifest 最多处理前 100 条 entries。 - 同一个 `slug` 的多个版本建议按从旧到新的顺序排列;运行时按 manifest 文件顺序处理,不做自动版本排序。 @@ -236,7 +238,7 @@ SKILLHUB_BUILTIN_SKILLS_ENABLED=false 更新一个已有内置 Skill 的推荐步骤: -1. 不要覆盖已经发布过的旧版本 zip 内容。 +1. 不要覆盖已经发布过的旧版本 zip 内容;URL 对应对象必须保持不可变。 2. 在 `SKILL.md` 中提升 `version`。 3. 重新打包并上传新的 zip 文件。 4. 在 manifest 中新增一条同 `slug`、新 `version` 的记录。 @@ -279,7 +281,7 @@ SKILLHUB_BUILTIN_SKILLS_ENABLED=false - manifest JSON 格式合法。 - 每个 item 都包含 `slug`、`version`、`url`、`sha256`。 - 每个 `sha256` 都与 URL 下载到的原始 zip 字节一致。 -- URL 使用 `https://bjcdn.openstorage.cn/...` 或可信子域名。 +- URL 使用 `https://bjcdn.openstorage.cn/...` 或可信子域名,并以 `.zip` 结尾;文件名不必等于 SHA-256。 - zip 根目录直接包含 `SKILL.md`,或只有一个顶层 Skill 目录且该目录包含 `SKILL.md`。 - `SKILL.md name` 归一化后的 slug 与 manifest `slug` 一致。 - `SKILL.md version` 与 manifest `version` 一致。 diff --git a/scripts/tests/build-builtin-skills-test.sh b/scripts/tests/build-builtin-skills-test.sh index 26f210c5..4608f8f2 100755 --- a/scripts/tests/build-builtin-skills-test.sh +++ b/scripts/tests/build-builtin-skills-test.sh @@ -130,7 +130,7 @@ for coordinate in packaged_runtime_coordinates: assert parsed_url.scheme == "https", coordinate assert parsed_url.hostname == "bjcdn.openstorage.cn", coordinate assert not parsed_url.query and not parsed_url.fragment, coordinate - assert parsed_url.path.endswith(f'/{artifact["sha256"]}.zip'), coordinate + assert parsed_url.path.lower().endswith('.zip'), coordinate PY python3 - "$first" <<'PY' diff --git a/server/skillhub-app/src/main/resources/builtin-skills/manifest.json b/server/skillhub-app/src/main/resources/builtin-skills/manifest.json index 6ced03fe..fb7393fd 100644 --- a/server/skillhub-app/src/main/resources/builtin-skills/manifest.json +++ b/server/skillhub-app/src/main/resources/builtin-skills/manifest.json @@ -60,6 +60,12 @@ "url": "https://bjcdn.openstorage.cn/open_res/xfyundoc/2026-07-31/fae63ded-f222-4583-a723-d6d9529360e0/skillhub-builtin-skills/frontend-design/1.0.0/67b2f34163874e56ba43a0a9ed3d1012d752615a1a80f0c26608a702d9fe394e.zip", "sha256": "67b2f34163874e56ba43a0a9ed3d1012d752615a1a80f0c26608a702d9fe394e" }, + { + "slug": "ledger-tasks-yylo", + "version": "1.0.0", + "url": "https://bjcdn.openstorage.cn/aicontest/2026-09-22/5fac3d84-44db-4b90-a707-a820a096a2a4.zip", + "sha256": "1b8aa3bb329a4f8551f7e262eb1faab1b1e3111b2b2053278aa2e6996099215b" + }, { "slug": "linkedin-post-formatter", "version": "1.0.0", @@ -72,6 +78,12 @@ "url": "https://bjcdn.openstorage.cn/open_res/xfyundoc/2026-07-31/6cf347a7-ccc5-4016-b4ca-6263959a1b08/skillhub-builtin-skills/meeting-note-summarizer/1.0.0/5add401203f323bc1cbb350f306d3a5d3f3b16c2ad6578e7cab55d2c196152ca.zip", "sha256": "5add401203f323bc1cbb350f306d3a5d3f3b16c2ad6578e7cab55d2c196152ca" }, + { + "slug": "orca-replay", + "version": "1.0.0", + "url": "https://bjcdn.openstorage.cn/aicontest/2026-09-22/2c7f87a4-b339-47f5-9a8e-f0ad1caad2c6.zip", + "sha256": "9184ae8bafab208fe468c9f6b5053ca76dd9e594a96ea57ff66cb370196dbd4b" + }, { "slug": "plugin-scanner", "version": "1.0.0",