String comparison caused local 1.0.3 to show "update available"
when GitHub had 1.0.2, since "1.0.3" != "1.0.2".
Added _is_newer() with proper semver tuple comparison so update_available
is only set when the remote version is strictly greater than local.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>