From abc392d22c2c14db72568ed1a60acda1453e4a82 Mon Sep 17 00:00:00 2001 From: npc0-hue Date: Fri, 25 Sep 2026 00:25:00 +0800 Subject: [PATCH] Fix SCUM config manifest refresh --- platform/service/resources.go | 10 +++++-- platform/service/resources_test.go | 29 +++++++++++++++++++ .../examples/scum-server-plugin/manifest.json | 2 +- plugins/tests/manifest-validation.test.ts | 2 +- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/platform/service/resources.go b/platform/service/resources.go index 557eee3..9ba15ac 100644 --- a/platform/service/resources.go +++ b/platform/service/resources.go @@ -812,10 +812,14 @@ func (svc *CoreService) upsertLatestGamePlugin(plugin domain.GamePlugin) (domain } } if current.ID != "" && !domain.GamePluginIsNewer(plugin, current) { - if err := svc.pruneOlderGamePluginVersions(current, matched); err != nil { - return domain.GamePlugin{}, err + // Re-registering the same stable manifest ID must refresh its declarative + // contract; file targets and action assets can be corrected in place. + if current.ID != plugin.ID || domain.CompareGamePluginVersions(plugin.Version, current.Version) != 0 { + if err := svc.pruneOlderGamePluginVersions(current, matched); err != nil { + return domain.GamePlugin{}, err + } + return domain.CopyGamePlugin(current), nil } - return domain.CopyGamePlugin(current), nil } if _, err := svc.store.GamePlugins().Get(plugin.ID); err == nil { diff --git a/platform/service/resources_test.go b/platform/service/resources_test.go index 0af835d..0e18ba9 100644 --- a/platform/service/resources_test.go +++ b/platform/service/resources_test.go @@ -2011,6 +2011,35 @@ func TestCoreServiceUpsertsDuplicateGamePluginManifest(t *testing.T) { } } +func TestCoreServiceRefreshesSameVersionPluginManifestDeclarations(t *testing.T) { + svc := newTestCoreService() + registration := validPluginManifestRegistration() + registration.Manifest.FileWorkspace = domain.PluginFileWorkspace{ + DefaultDirectoryKey: "config", + Directories: []domain.PluginLogicalDirectory{{Key: "config", Label: "配置", Scope: "config"}}, + Files: []domain.PluginLogicalFile{{Key: "settings", DirectoryKey: "config", Label: "Settings.ini", Kind: "config", Editable: true}}, + } + if _, err := svc.RegisterGamePluginManifest(registration); err != nil { + t.Fatalf("register legacy manifest: %v", err) + } + + registration.Manifest.FileWorkspace.Files[0].TargetKey = "SCUM/Saved/Config/WindowsServer/ServerSettings.ini" + refreshed, err := svc.RegisterGamePluginManifest(registration) + if err != nil { + t.Fatalf("refresh same-version manifest: %v", err) + } + if len(refreshed.FileWorkspace.Files) != 1 || refreshed.FileWorkspace.Files[0].TargetKey != "SCUM/Saved/Config/WindowsServer/ServerSettings.ini" { + t.Fatalf("expected same-version manifest declaration to refresh, got %+v", refreshed.FileWorkspace) + } + stored, err := svc.store.GamePlugins().Get(registration.Manifest.ID) + if err != nil { + t.Fatalf("load refreshed manifest: %v", err) + } + if stored.FileWorkspace.Files[0].TargetKey != refreshed.FileWorkspace.Files[0].TargetKey { + t.Fatalf("expected stored manifest target to refresh, stored=%+v refreshed=%+v", stored.FileWorkspace, refreshed.FileWorkspace) + } +} + func TestCoreServiceKeepsOnlyLatestPluginVersionAndMigratesReferences(t *testing.T) { svc := newTestCoreService() stale := validPluginManifestRegistration() diff --git a/plugins/examples/scum-server-plugin/manifest.json b/plugins/examples/scum-server-plugin/manifest.json index 5691c84..3f44106 100644 --- a/plugins/examples/scum-server-plugin/manifest.json +++ b/plugins/examples/scum-server-plugin/manifest.json @@ -3,7 +3,7 @@ "id": "game.scum", "name": "SCUM Server", "description": "First-party SCUM game server operations plugin with platform-mediated lifecycle and plugin-owned RCON data flows.", - "version": "0.1.26", + "version": "0.1.27", "kind": "game-plugin", "tags": [ "scum", diff --git a/plugins/tests/manifest-validation.test.ts b/plugins/tests/manifest-validation.test.ts index 8760c26..f75c36e 100644 --- a/plugins/tests/manifest-validation.test.ts +++ b/plugins/tests/manifest-validation.test.ts @@ -357,7 +357,7 @@ describe("plugin manifest validation", () => { const serialized = JSON.stringify(manifest).toLowerCase(); expect(serialized).not.toContain("local-proof"); - expect(manifest.version).toBe("0.1.26"); + expect(manifest.version).toBe("0.1.27"); expect(installAction.environment?.SERVER_TEMPLATE).toBe("scum-server"); expect(manifest.permissions).toEqual(expect.arrayContaining(["server.game-client.read", "server.game-client.command", "server.game-client.maintenance"])); expect(manifest.gameClientBridge.commands.map((command) => command.type)).toEqual(expect.arrayContaining([