This release adds 2 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+11 more
Affected surfaces
Summary
AI summaryAdded mureo upgrade [--all] to refresh mureo and its plugins in a pipx‑aware virtual environment.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
Validates package specs against PEP 503 regex to prevent argument injection. Validates package specs against PEP 503 regex to prevent argument injection. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
| Security | Medium |
Ensures same‑venv guarantee by using `sys.executable` for all pip/ensurepip invocations. Ensures same‑venv guarantee by using `sys.executable` for all pip/ensurepip invocations. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
| Feature | Medium |
Adds `mureo upgrade` subcommand for venv‑aware package upgrades. Adds `mureo upgrade` subcommand for venv‑aware package upgrades. Source: llm_adapter@2026-06-06 Confidence: high |
— |
| Feature | Low |
Implements `--all` flag to upgrade mureo and all installed `mureo-*` packages in one pip call. Implements `--all` flag to upgrade mureo and all installed `mureo-*` packages in one pip call. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
| Feature | Low |
Provides `--dry-run` option to print the pip command without executing it. Provides `--dry-run` option to print the pip command without executing it. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
| Feature | Low |
Adds targeted `ensurepip` fallback when pip is missing, with clear diagnostics for failures. Adds targeted `ensurepip` fallback when pip is missing, with clear diagnostics for failures. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
| Performance | Low |
Performs atomic resolution under `--all` by issuing a single `pip install --upgrade` invocation. Performs atomic resolution under `--all` by issuing a single `pip install --upgrade` invocation. Source: granite4.1:30b@2026-06-06-audit Confidence: low |
— |
Full changelog
Added — mureo upgrade [--all] for pipx venv-aware plugin upgrades (#177, #178)
Operators installing mureo via pipx install mureo and extending it with
third-party packages (via mureo.providers / mureo.policy_gates /
mureo.web_extensions entry-point groups, typically registered through
pipx inject or pip install into the same venv) hit a UX gap: there
was no single command for keeping the whole stack fresh.
pipx upgrade mureoonly upgrades the primary venv package; injected
plugins are silently left behind.pipx upgrade <plugin>fails because plugins do not have a same-named
venv (pipx expects~/.local/pipx/venvs/<plugin>/).pipx inject mureo <pkg> --forcetriggers a known pipx 1.11
"looks like a path" bug whenevercwdcontains amureodirectory,
so operators cannot reliably use it as an upgrade path.
mureo upgrade closes this gap with a single top-level subcommand that
operates on sys.executable — the venv currently running the CLI —
independent of cwd, PATH, and PYTHONPATH.
Usage
mureo upgrade # upgrade mureo itself
mureo upgrade <pkg> # upgrade a same-venv package
mureo upgrade <pkg>==<version> # version-pinned upgrade
mureo upgrade --all # mureo + every installed mureo-* in one pip call
mureo upgrade --dry-run # print the pip command without invoking it
Safety properties
- Argument-injection guard. Package specs are validated against a
PEP 503 regex (optionally followed by a single==<version>pin) and
pip is always invoked with a--sentinel. Hostile inputs such as
-r/etc/passwd,--index-url=http://attacker/,pkg @ git+https://…,
PEP 508 markers, and extras are rejected at the boundary; pip's
option parser never sees them. - Squatter-resistant discovery.
--allwalks
importlib.metadata.distributions(), normalises every name per
PEP 503, and accepts onlymureoexact match ormureo-<rest>.
Prefix squatters likemureologyormureoextrasare excluded by
construction. - Same-venv guarantee. Every pip / ensurepip invocation uses
sys.executable, so the command can never accidentally upgrade a
globally-installed mureo or a sibling venv. - Targeted
ensurepipfallback. Only the literal
No module named pipfailure ofpython -m pip --versiontriggers
anensurepip --upgradebootstrap; every other failure is surfaced
verbatim so permission / network / disk errors are never silently
bypassed. After a successful bootstrap, pip availability is
re-probed to produce a clear diagnostic for half-broken venvs. - Atomic resolution under
--all. A singlepip install --upgrade
invocation is issued with every target so pip's resolver sees the
full set together. - Exit-code transparency. pip's exit code is propagated as the CLI
exit code, enabling automation scripts to retry or branch.
Why ship this in OSS rather than per-plugin
Each plugin author could in principle ship its own <plugin> upgrade
command, but that path produces duplicated code per plugin and forces
operators to remember a different command for each one. Centralising
the logic in OSS — which already owns mureo install-desktop and
mureo configure, both also venv-aware top-level commands — keeps the
mental model simple: mureo upgrade --all is the only command an
operator needs.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About logly/mureo
Framework for AI agents (Claude Code, Cursor, Codex, Gemini) to operate Google Ads, Meta Ads, and Search Console. Grounded in a local STRATEGY.md — not metric-chasing. Defense-in-depth security, local-first. Apache 2.0.
Related context
Related tools
Beta — feedback welcome: [email protected]