From c8e205eed2ffe151cd97fdf422bea166dd609e63 Mon Sep 17 00:00:00 2001 From: zhangheng023 Date: Tue, 2 Jun 2026 23:26:16 +0800 Subject: [PATCH] fix: recover toUpdate skills empty fallback (#1233) --- internal/skillscheck/sync.go | 4 ++++ internal/skillscheck/sync_test.go | 33 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/internal/skillscheck/sync.go b/internal/skillscheck/sync.go index f2d2a2cf..3239131b 100644 --- a/internal/skillscheck/sync.go +++ b/internal/skillscheck/sync.go @@ -270,6 +270,10 @@ func SyncSkills(opts SyncOptions) *SyncResult { Force: opts.Force, } + if len(plan.ToUpdate) == 0 { + return fallbackFullInstall(opts, "toUpdate skills empty fallback", official) + } + if len(plan.ToUpdate) > 0 { installResult := opts.Runner.InstallSkill(plan.ToUpdate) if installResult == nil || installResult.Err != nil { diff --git a/internal/skillscheck/sync_test.go b/internal/skillscheck/sync_test.go index 18a2802c..059bc656 100644 --- a/internal/skillscheck/sync_test.go +++ b/internal/skillscheck/sync_test.go @@ -306,6 +306,39 @@ func TestSyncSkills_ParseEmptyGlobalListWithNonEmptyStdoutDegradesToColdStart(t } } +func TestSyncSkills_EmptyToUpdateFallsBackToFullInstall(t *testing.T) { + dir := t.TempDir() + t.Setenv("LARKSUITE_CLI_CONFIG_DIR", dir) + if err := WriteState(SkillsState{ + Version: "1.0.30", + OfficialSkills: []string{"lark-calendar", "lark-mail"}, + UpdatedAt: "2026-05-18T00:00:00Z", + }); err != nil { + t.Fatal(err) + } + + runner := &fakeSkillsRunner{ + officialOut: officialSkillsOutput("lark-calendar", "lark-mail"), + globalOut: globalSkillsOutput(), + installAllErr: nil, + } + + result := SyncSkills(SyncOptions{Version: "1.0.33", Runner: runner, Now: time.Now}) + if result.Action != "fallback_synced" { + t.Fatalf("SyncSkills() action = %q, want fallback_synced", result.Action) + } + if len(runner.installed) != 0 { + t.Fatalf("installed = %#v, want no incremental installs", runner.installed) + } + if runner.installedAll != 1 { + t.Fatalf("installedAll = %d, want 1 (fallback triggered)", runner.installedAll) + } + assertStrings(t, result.Official, []string{"lark-calendar", "lark-mail"}) + assertStrings(t, result.Updated, []string{"lark-calendar", "lark-mail"}) + assertStrings(t, result.Added, []string{"lark-calendar", "lark-mail"}) + assertStrings(t, result.SkippedDeleted, []string{}) +} + func TestSyncSkills_InstallFailureFallsBackToFullInstall(t *testing.T) { dir := t.TempDir() t.Setenv("LARKSUITE_CLI_CONFIG_DIR", dir)