feat(cmux-tui): update installed plugins automatically
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 -- --checkpython3 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](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
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.