diff --git a/internal/skillscheck/sync.go b/internal/skillscheck/sync.go index 2f8adb3d..2d9c3f0e 100644 --- a/internal/skillscheck/sync.go +++ b/internal/skillscheck/sync.go @@ -335,7 +335,7 @@ func SyncSkills(opts SyncOptions) *SyncResult { UpdatedSkills: plan.ToUpdate, AddedOfficialSkills: plan.Added, SkippedDeletedSkills: plan.SkippedDeleted, - UpdatedAt: opts.Now().UTC().Format(time.RFC3339), + UpdatedAt: opts.Now().Format(time.RFC3339), } if err := WriteState(state); err != nil { result.Action = "failed" @@ -428,7 +428,7 @@ func fallbackFullInstall(opts SyncOptions, reason string, official []string) *Sy UpdatedSkills: official, AddedOfficialSkills: official, SkippedDeletedSkills: []string{}, - UpdatedAt: opts.Now().UTC().Format(time.RFC3339), + UpdatedAt: opts.Now().Format(time.RFC3339), } if writeErr := WriteState(state); writeErr != nil { return &SyncResult{ diff --git a/internal/skillscheck/sync_test.go b/internal/skillscheck/sync_test.go index fb8f117f..b4df4591 100644 --- a/internal/skillscheck/sync_test.go +++ b/internal/skillscheck/sync_test.go @@ -322,6 +322,7 @@ func (f *fakeSkillsRunner) InstallAllSkills() *selfupdate.NpmResult { func TestSyncSkills_WritesStateAndDoesNotWriteStamp(t *testing.T) { dir := t.TempDir() t.Setenv("LARKSUITE_CLI_CONFIG_DIR", dir) + localZone := time.FixedZone("UTC+8", 8*60*60) if err := WriteState(SkillsState{ Version: "1.0.30", OfficialSkills: []string{"lark-calendar", "lark-mail"}, @@ -339,7 +340,7 @@ func TestSyncSkills_WritesStateAndDoesNotWriteStamp(t *testing.T) { result := SyncSkills(SyncOptions{ Version: "1.0.33", Runner: runner, - Now: func() time.Time { return time.Date(2026, 5, 18, 12, 0, 0, 0, time.UTC) }, + Now: func() time.Time { return time.Date(2026, 5, 18, 20, 0, 0, 0, localZone) }, }) if result.Err != nil { @@ -361,6 +362,9 @@ func TestSyncSkills_WritesStateAndDoesNotWriteStamp(t *testing.T) { assertStrings(t, state.UpdatedSkills, []string{"lark-calendar", "lark-new"}) assertStrings(t, state.AddedOfficialSkills, []string{"lark-new"}) assertStrings(t, state.SkippedDeletedSkills, []string{"lark-mail"}) + if state.UpdatedAt != "2026-05-18T20:00:00+08:00" { + t.Fatalf("UpdatedAt = %q, want local RFC3339 timestamp with offset preserved", state.UpdatedAt) + } if _, err := os.Stat(filepath.Join(dir, "skills.stamp")); !os.IsNotExist(err) { t.Fatalf("skills.stamp exists or stat failed with unexpected err: %v", err) }