Extends the salvaged #118302 fix across the rest of the Desktop's hub actions.
The Desktop spawns `hermes skills install|update|uninstall` and reports failure
only from the exit code, so every refusal that exited 0 was a silent no-op:
- do_update: an update whose new version the scan gate refuses (do_install
-> False) is counted as "Not updated" instead of "Updated N skill(s)", and
the command exits 1 (Capabilities -> "Update installed").
- do_uninstall: a refused removal (not a hub skill, unsafe path) returns
False -> exit 1; True on success, None when the prompt is declined.
- skills_command returns the code instead of sys.exit()-ing from library
code; cmd_skills returns it so main()'s existing `rc = args.func(args)`
owns the exit status (the in-app console's _capture_output handles an int).
- TUI `/skills install` (skills.manage RPC): #128443 (merged) already keys
the RPC off do_install's True/False/None; this commit supplies the True
that RPC expects on success (on main do_install still returns None, so a
successful TUI install answers error 5031).
- Desktop parseInstallBlocked: the hard-block clause is matched across the
80-column Rich wrap ("... Hermes never\ninstalls unverified ..."), which a
real arxiv install produces; otherwise the toast mislabels an unverified
hard block as overridable.
Refs #118301