fix(sync): auth and health UX improvements

Problem: Failed token exchange left credential files on disk, trapping
users in a broken auth loop with no way back to setup. The `auth`
prompt used raw backend names and a terse prompt string. The `health`
action appeared in `:Pending gcal health` tab completion but silently
no-oped outside `:checkhealth`. gcal health omitted the token check
that gtasks had.

Solution: `_exchange_code` now calls `_wipe()` on both failure paths,
clearing the token and credentials files so the next `:Pending auth`
routes back through `setup()`. Prompt uses full service names and
"Authenticate with:". `health` is filtered from sync subcommand
completion and dispatch — its home is `:checkhealth pending`. gcal
health now checks for tokens.
This commit is contained in:
Barrett Ruth 2026-03-05 23:15:43 -05:00
parent 6e381c0d5f
commit fc58e22bfa
4 changed files with 19 additions and 5 deletions

View file

@ -550,7 +550,7 @@ local function run_sync(backend_name, action)
if not action or action == '' then
local actions = {}
for k, v in pairs(backend) do
if type(v) == 'function' and k:sub(1, 1) ~= '_' then
if type(v) == 'function' and k:sub(1, 1) ~= '_' and k ~= 'health' then
table.insert(actions, k)
end
end
@ -558,7 +558,7 @@ local function run_sync(backend_name, action)
log.info(backend_name .. ' actions: ' .. table.concat(actions, ', '))
return
end
if type(backend[action]) ~= 'function' then
if action == 'health' or type(backend[action]) ~= 'function' then
log.error(backend_name .. " backend has no '" .. action .. "' action")
return
end
@ -831,8 +831,8 @@ end
---@return nil
function M.auth()
local oauth = require('pending.sync.oauth')
vim.ui.select({ 'gtasks', 'gcal', 'both' }, {
prompt = 'Authenticate:',
vim.ui.select({ 'Google Tasks', 'Google Calendar', 'Google Tasks and Google Calendar' }, {
prompt = 'Authenticate with:',
}, function(choice)
if not choice then
return