You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Update notifier — a gentle "a newer version is available" nudge. A new ironcore/update.py checks PyPI for a newer release of the ironcore-cli
distribution and, when one exists, prints a one-line upgrade hint. It never auto-installs — a CLI that runs shell commands and edits files leaves
the user in control of what version they run — so it only ever prints the
command (pip install -U ironcore-cli / uv tool upgrade ironcore-cli / pipx upgrade ironcore-cli). The check is fail-silent (any network/DNS/
timeout/bad-JSON error reads as "no update", never a traceback), cached for
a day at ~/.ironcore/update-check.json (an atomic write, so a normal launch
inside the window does not dial), short-timeout, and opt-out via a new [update] check setting (default true). It surfaces in exactly two places,
and neither runs in a non-interactive / headless / CI context: ironcore doctor prints [--] update: <v> available … / [ok] up to date (<v>) (only
when stdout is a real terminal; offline is never a doctor failure), and the
TUI posts a single boot-style note in the background at startup. Headless ironcore exec and any non-TTY path never dial PyPI. Version comparison uses packaging.version (PEP 440, pre-release aware). Documented in docs/CONFIG.md
§12, the ironcore init starter config, and the README's new "Updating"
section. 31 new offline tests (tests/test_update.py + TUI/doctor additions),
all inject the fetch so nothing dials.
Fixed
Update notifier: declared its packaging dependency so a stock install's ironcore doctor no longer crashes.ironcore/update.py's is_newer imports packaging.version, but packaging was not in the runtime dependencies — it
was only reachable in the dev env because pytest pulls it in, so the whole
green suite hid the gap. In a stock install (pip/pipx/uv tool install ironcore-cli into a clean env), packaging was absent, so ironcore doctor
raised ModuleNotFoundError: No module named 'packaging' and exited 1 — a
doctor failure caused solely by the notifier — and the TUI boot nudge was
silently dead. packaging>=23.0 is now a declared runtime dependency.
Defense in depth: is_newer's import moved inside its try (a future prune
degrades to "no nudge", not a crash) and doctor's _report_update is wrapped
fail-silent, so the maintenance ping can never be the reason a doctor run ends
in a traceback. Three offline regression tests pin the declaration and both
guards.