Repository navigation
openplanr 1.23.0 — installed-tuple reconciliation and a safe upgrade path
The CLI could tell you your install had drifted and then leave you to derive the
fix across two package managers. doctor already computed the drift correctly —
nothing acted on it, and nothing read back the compatibility ranges the ecosystem
manifest publishes.
planr upgrade status reconciles the installed tuple — this CLI plus both
host-plugin versions — against the published compatible set and reports
aligned, upgrade-available, incompatible, or unknown. The warn-versus-fail
distinction is extracted from doctor rather than re-derived, so a CLI merely
trailing an upgrade stays a warning while a genuinely incompatible tuple fails.
An absent plugin is recorded as absent, never as a violation.
planr upgrade apply performs the half the CLI owns and prints the plugin
half it structurally cannot — plugin installation is a host command. The printed
commands are rendered from the plugin integration's own operation list so they
can never drift from what an apply would really run, and the marketplace refresh
is always first: without it the installer reinstalls the stale version and you
believe you upgraded.
The offer comes to you — a four-way choice on an ordinary command, resuming
whatever you were doing. "Not now" escalates 24h → 48h → a week. auto_upgrade
and update_check are real settings, and "never ask again" always states the
command that reverses it.
Versioned migrations now carry state across an upgrade for what a reinstall
cannot repair. The legacy operating-profile migration is registered by delegating
to the existing implementation, reusing its exact backup and journalled rollback;
the standalone command keeps working unchanged.
Guarantees held: offline capability is preserved — the fetch trusts a short-TTL
cache with no network round-trip and carries a hard timeout that wins even when a
fetch hangs, and a snooze or opt-out short-circuits before any reconcile. The CLI
never installs a plugin. A partially-upgraded install can never report success: a
clean exit that fails to land the target restores the previous version and says so.