@@ -841,10 +841,17 @@ func (m TuiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
841841 }
842842 }
843843 case "u" :
844- m .loading = true
845- m .statusMsg = "Checking for updates…"
846- m .checkingUpdates = true
847- return m , m .checkForUpdatesCmd ()
844+ items := m .getActiveItems ()
845+ if len (items ) > 0 && m .selectedIndex < len (items ) {
846+ pkg := items [m .selectedIndex ]
847+ if pkg .Installed && ! m .taskActive {
848+ m .taskActive = true
849+ m .statusMsg = fmt .Sprintf ("Updating %s…" , pkg .ShortName )
850+ if Program != nil {
851+ m .RunUpdatePackageTask (pkg .Name , pkg .ShortName , pkg .Kind , pkg .LocalSource , Program )
852+ }
853+ }
854+ }
848855 case "g" :
849856 if m .ctx != nil {
850857 m .settingsInstallMode = m .ctx .Settings .InstallMode
@@ -2513,7 +2520,6 @@ func (m TuiModel) renderStatusBar(w int) string {
25132520 line1Parts = append (line1Parts , barKeyStyle .Render ("s" ) + barStyle .Render (" save changes · " ))
25142521 }
25152522 line1Parts = append (line1Parts ,
2516- barKeyStyle .Render ("u" ) + barStyle .Render (" updates · " ),
25172523 barKeyStyle .Render ("g" ) + barStyle .Render (" settings" ),
25182524 )
25192525
@@ -2540,6 +2546,18 @@ func (m TuiModel) renderStatusBar(w int) string {
25402546 barKeyStyle .Render ("↑↓" ) + barStyle .Render (" move" ),
25412547 barKeyStyle .Render ("Space" ) + barStyle .Render (" toggle" ),
25422548 barKeyStyle .Render ("c" ) + barStyle .Render (" manage" ),
2549+ )
2550+
2551+ items := m .getActiveItems ()
2552+ hasHoveredInstalled := false
2553+ if len (items ) > 0 && m .selectedIndex < len (items ) {
2554+ hasHoveredInstalled = items [m .selectedIndex ].Installed
2555+ }
2556+ if hasHoveredInstalled {
2557+ shortcutParts = append (shortcutParts , barKeyStyle .Render ("u" ) + barStyle .Render (" update" ))
2558+ }
2559+
2560+ shortcutParts = append (shortcutParts ,
25432561 serverShortcut ,
25442562 barKeyStyle .Render ("r" ) + barStyle .Render (" refresh" ),
25452563 barKeyStyle .Render ("q" ) + barStyle .Render (" quit" ),
@@ -3129,6 +3147,61 @@ func (m *TuiModel) RunSetupTask(adds map[string]string, p *tea.Program) {
31293147 }()
31303148}
31313149
3150+ func (m * TuiModel ) RunUpdatePackageTask (pkgName string , shortName string , kind string , isLocalSource bool , p * tea.Program ) {
3151+ go func () {
3152+ p .Send (clearLogsMsg {})
3153+ p .Send (logLineMsg (fmt .Sprintf (">>> Starting update for %s…" , shortName )))
3154+
3155+ desktopJs := filepath .Join (m .workspaceRoot , "packages" , "cli" , "bin" , "desktop.js" )
3156+
3157+ if isLocalSource {
3158+ kindDir := ""
3159+ switch kind {
3160+ case "app" :
3161+ kindDir = "apps"
3162+ case "module" :
3163+ kindDir = "packages"
3164+ case "theme" :
3165+ kindDir = "themes"
3166+ }
3167+
3168+ if kindDir != "" {
3169+ pkgPath := filepath .Join (m .workspaceRoot , kindDir , shortName )
3170+ p .Send (logLineMsg (fmt .Sprintf (">>> Running git pull in %s…" , pkgPath )))
3171+ if err := runProcessAndStreamLogsSilent (pkgPath , "git" , []string {"pull" }, p ); err != nil {
3172+ p .Send (logLineMsg (fmt .Sprintf (">>> Git pull failed: %v" , err )))
3173+ p .Send (taskFinishedMsg {Success : false , Err : err })
3174+ return
3175+ }
3176+ }
3177+ } else {
3178+ p .Send (logLineMsg (fmt .Sprintf (">>> Re-installing %s from NPM to get latest version…" , shortName )))
3179+ args := []string {desktopJs , "add" , shortName , "--npm" }
3180+ if err := runProcessAndStreamLogsSilent (m .workspaceRoot , "node" , args , p ); err != nil {
3181+ p .Send (logLineMsg (fmt .Sprintf (">>> NPM update failed: %v" , err )))
3182+ p .Send (taskFinishedMsg {Success : false , Err : err })
3183+ return
3184+ }
3185+ }
3186+
3187+ // Run pnpm install
3188+ p .Send (logLineMsg (">>> Running pnpm install (syncing workspace)…" ))
3189+ if err := runProcessAndStreamLogsSilent (m .workspaceRoot , "pnpm" , []string {"install" }, p ); err != nil {
3190+ p .Send (taskFinishedMsg {Success : false , Err : err })
3191+ return
3192+ }
3193+
3194+ // Rebuild stubs
3195+ p .Send (logLineMsg (">>> Rebuilding stubs…" ))
3196+ if err := runProcessAndStreamLogsSilent (m .workspaceRoot , "pnpm" , []string {"run" , "prepare:modules" }, p ); err != nil {
3197+ p .Send (taskFinishedMsg {Success : false , Err : err })
3198+ return
3199+ }
3200+
3201+ p .Send (taskFinishedMsg {Success : true })
3202+ }()
3203+ }
3204+
31323205func (m * TuiModel ) RunServeTask (p * tea.Program ) {
31333206 go func () {
31343207 if m .ctx == nil {
0 commit comments