From 802f8f886f648e34a32848960d77e604d5440b63 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Thu, 10 Sep 2026 11:17:25 +0800 Subject: [PATCH 1/2] feat(starter): publish Zero Slop runtime package Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../src/main/resources/builtin-skills/manifest.json | 6 ++++++ 1 file changed, 6 insertions(+) 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 178f7015..df5cabc9 100644 --- a/server/skillhub-app/src/main/resources/builtin-skills/manifest.json +++ b/server/skillhub-app/src/main/resources/builtin-skills/manifest.json @@ -113,6 +113,12 @@ "version": "1.0.0", "url": "https://bjcdn.openstorage.cn/open_res/xfyundoc/2026-07-31/0170ce8f-ad41-4819-bc50-9b572b1c6510/skillhub-builtin-skills/weather/1.0.0/181e36c0fd6ca5f6cdf224276dd12e0fd203f83456a988a6bcf15cc4f3c20dd6.zip", "sha256": "181e36c0fd6ca5f6cdf224276dd12e0fd203f83456a988a6bcf15cc4f3c20dd6" + }, + { + "slug": "zero-slop", + "version": "2.10.2", + "url": "https://bjcdn.openstorage.cn/open_res/xfyundoc/2026-09-10/2abb2bab-737c-479e-9c79-d153a140e30b/1789010150588/d84fea7cd1ee53f6582889c89877d9423c1a79b419553f4626e7ab6409da10b0.zip", + "sha256": "d84fea7cd1ee53f6582889c89877d9423c1a79b419553f4626e7ab6409da10b0" } ] } From 7d0aedb8d3d323d99ad96d5e7b9c4e0c26dd1cb0 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Thu, 10 Sep 2026 11:39:30 +0800 Subject: [PATCH 2/2] test(starter): cover built-in download failure isolation Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../BuiltinSkillInitializerTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/server/skillhub-app/src/test/java/com/iflytek/skillhub/bootstrap/BuiltinSkillInitializerTest.java b/server/skillhub-app/src/test/java/com/iflytek/skillhub/bootstrap/BuiltinSkillInitializerTest.java index e9e6dda5..416c3e03 100644 --- a/server/skillhub-app/src/test/java/com/iflytek/skillhub/bootstrap/BuiltinSkillInitializerTest.java +++ b/server/skillhub-app/src/test/java/com/iflytek/skillhub/bootstrap/BuiltinSkillInitializerTest.java @@ -251,6 +251,50 @@ class BuiltinSkillInitializerTest { verify(skillPublishService, never()).publishFromEntries(any(), any(), any(), any(), any(), anyBoolean()); } + @Test + void skipsPackageWhenDownloadFailsBeforeExtraction() throws Exception { + givenManifestAndSystemPublisher(); + when(skillRepository.findByNamespaceIdAndSlug(1L, "skillhub-hello")).thenReturn(List.of()); + when(downloader.download(URI.create(ITEM.url()))).thenReturn(Optional.empty()); + + runInitializer(); + + verify(downloader).download(URI.create(ITEM.url())); + verify(extractor, never()).extract(any()); + verify(skillPublishService, never()).publishFromEntries(any(), any(), any(), any(), any(), anyBoolean()); + } + + @Test + void continuesWithLaterManifestItemWhenEarlierDownloadFails() throws Exception { + ManifestItem laterItem = new ManifestItem( + "next-skill", + "1.0.0", + "https://bjcdn.openstorage.cn/skills/next-skill.zip", + PACKAGE_SHA256 + ); + List laterEntries = packageEntries("next-skill", "1.0.0", "same"); + givenManifestAndSystemPublisher(List.of(ITEM, laterItem)); + when(skillRepository.findByNamespaceIdAndSlug(1L, "skillhub-hello")).thenReturn(List.of()); + when(skillRepository.findByNamespaceIdAndSlug(1L, "next-skill")).thenReturn(List.of()); + when(downloader.download(URI.create(ITEM.url()))).thenReturn(Optional.empty()); + when(downloader.download(URI.create(laterItem.url()))).thenReturn(Optional.of(PACKAGE_BYTES)); + when(extractor.extract(PACKAGE_BYTES)) + .thenReturn(new SkillPackageArchiveExtractor.ExtractionResult(laterEntries, List.of())); + + runInitializer(); + + verify(downloader).download(URI.create(ITEM.url())); + verify(downloader).download(URI.create(laterItem.url())); + verify(skillPublishService).publishFromEntries( + eq(GLOBAL), + eq(laterEntries), + eq(PUBLISHER), + eq(SkillVisibility.PUBLIC), + eq(Set.of("SUPER_ADMIN")), + eq(true) + ); + } + @Test void skipsWhenManifestSlugDoesNotMatchPackageMetadata() throws Exception { givenExtractedPackage(packageEntries("other-skill", "1.0.0", "same"));