@@ -3,6 +3,7 @@ package cmd
33import (
44 "errors"
55 "fmt"
6+ "os"
67 "strings"
78 "time"
89
@@ -331,16 +332,31 @@ func updateSource(manifest *skill.Manifest, repo string) error {
331332 defer cleanup ()
332333
333334 fmt .Println ()
335+ var removed []string
334336 for _ , s := range installed {
335337 entry := & skill.SkillEntry {
336338 Name : s .Name ,
337339 Description : s .Description ,
338340 Path : s .Path ,
339341 }
340342 if err := installSkillEntry (manifest , entry , repo , dir ); err != nil {
343+ if errors .Is (err , os .ErrNotExist ) {
344+ removed = append (removed , s .Name )
345+ continue
346+ }
341347 terminal .Errorf ("Failed to update %q: %v" , s .Name , err )
342348 }
343349 }
350+ if len (removed ) > 0 {
351+ for _ , name := range removed {
352+ skill .Uninstall (name )
353+ manifest .RemoveSkill (name )
354+ }
355+ if err := manifest .Save (); err != nil {
356+ return fmt .Errorf ("failed to update manifest after removing skills: %w" , err )
357+ }
358+ terminal .Warningf ("The following skills were removed from upstream: %s" , strings .Join (removed , ", " ))
359+ }
344360 return nil
345361}
346362
@@ -359,7 +375,11 @@ func installSkillEntry(manifest *skill.Manifest, entry *skill.SkillEntry, repo s
359375 targets , err = skill .Install (entry .Name , repo , entry .Path )
360376 }
361377 if err != nil {
362- spinner .Error (fmt .Sprintf ("Failed to install skill %q" , entry .Name ))
378+ if errors .Is (err , os .ErrNotExist ) {
379+ spinner .Stop ()
380+ } else {
381+ spinner .Error (fmt .Sprintf ("Failed to install skill %q" , entry .Name ))
382+ }
363383 return fmt .Errorf ("failed to install skill %q: %w" , entry .Name , err )
364384 }
365385
0 commit comments