feat(cmux-tui): update installed plugins automatically

Merged
TE
4d ago
+331-3

Summary

cmux now checks installed sidebar and agent plugins in the daemon background once per day. When a clean install has a newer remote HEAD, it uses the existing staged clone, manifest validation, build, executable check, and atomic replacement path. Local paths, file:// origins, symlinks, and dirty checkouts remain manual so development work is not overwritten.

The check is asynchronous and records its last attempt, so network availability never delays daemon startup or causes a request on every launch. Updated files are used the next time the plugin process starts; a config reload restarts a process that is already running.

Next-issue: #14707
Fixes #14707

Testing

  • cargo fmt --manifest-path cmux-tui/Cargo.toml --all -- --check
  • python3 scripts/cmux-next/prepush-gate.py
  • Hosted cmux-tui focused tests: pending on the exact pushed head
  • python3 scripts/verify-local.py: localization debt and workspace package grouping are already red on the base; no changed file is involved

Changelog

Fixed: installed sidebar and agent plugins can update automatically from clean remote Git origins.

Agent session: agent session


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Adds a background daemon check that updates installed sidebar and agent plugins from clean remote Git origins once per day.

  • Compares local and remote HEAD, then reuses the existing staged-clone, validation, build, and atomic replacement path.
  • Only HTTPS, SSH, and git:// origins qualify; local paths, file:// origins, symlinks, detached heads, and dirty checkouts stay manual.
  • Runs asynchronously so a remote host never delays daemon startup, and records the attempt atomically so a broken remote doesn't retry on every launch.
  • Serializes installs and updates through a plugin lock, and fails closed by rechecking checkout safety right before replacement.
  • Updated files are used at the next plugin process start; reload the daemon config to restart one already running.