feat(cli): mureo upgrade re-deploys skills + restarts the always-on service - #320
Merged
Conversation
…ervice A new mureo version ships new skill content (deployed under ~/.claude/skills) and, when the always-on `mureo service` daemon is installed, that daemon holds the pre-upgrade code in memory until restarted — so `mureo upgrade` frequently appeared to "have no effect" (stale skill format, stale running MCP tools / static assets). This is the exact failure a customer hit on Windows. After a successful upgrade (unless `--dry-run` / the new `--no-refresh`): - `_refresh_deployed_skills()`: re-copy the bundled skills into ~/.claude/skills (idempotent overwrite) so the deployed format matches the new version. Only when a skills dir already exists — never force-installs skills a user removed. - `_restart_managed_service()`: when a managed service is installed for this platform, restart it (launchd / systemd / Task Scheduler) so the daemon loads the new code. No-op when none is installed. Both run from the OLD process but only touch NEW on-disk files / platform restart commands, so neither depends on stale in-memory code. Both are best-effort: a failure prints a one-line hint and NEVER fails the upgrade or masks pip's exit code (a failed pip install aborts before the refresh). The daemon's own self-upgrade path (web run_upgrade_all) is separate, so there is no re-entrancy. Tests: refresh runs on success; skipped on --no-refresh / --dry-run / failed upgrade; skill refresh no-ops without the dir and recopies when present; service restart no-ops when not installed, restarts when installed, and swallows an unsupported-platform error. python-reviewer: APPROVE. Claude-Session: https://claude.ai/code/session_01NxBrN8Qn53Tpivt9SumdGn
Merged
hyoshi
added a commit
that referenced
this pull request
Jun 23, 2026
Bump version across pyproject / __init__ / .claude-plugin and add the CHANGELOG entry for 0.10.12: the Reports action_log tolerance + daily-check 30-day window fixes (#319), the `mureo upgrade` post-upgrade refresh (#320), and the docs refresh (#321). Claude-Session: https://claude.ai/code/session_01NxBrN8Qn53Tpivt9SumdGn
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
mureo upgradepreviously only ran pip. But a new version ships new skill content (deployed under~/.claude/skills) and, when the always-onmureo servicedaemon is installed, that daemon keeps the pre-upgrade code in memory until restarted — so an upgrade often appears to "have no effect" (stale skills, stale running MCP). A customer hit exactly this on Windows.Change
After a successful upgrade (unless
--dry-run/ the new--no-refresh):~/.claude/skills(idempotent overwrite) so the format matches the new version. Only when a skills dir already exists.Both run from the old process but only touch NEW on-disk files / platform restart commands. Best-effort: a failure prints a one-line hint and NEVER fails the upgrade or masks pip's exit code. The daemon's own self-upgrade path is separate (no re-entrancy).
Tests cover wiring (success / --no-refresh / --dry-run / failed upgrade) + both helpers. python-reviewer: APPROVE. Targets 0.10.12.
https://claude.ai/code/session_01NxBrN8Qn53Tpivt9SumdGn