pending.nvim/spec
Barrett Ruth d12838abbf feat: auth backend (#111)
* refactor(types): extract inline anonymous types into named classes

Problem: several functions used inline `{...}` table types in their
`@param` and `@return` annotations, making them hard to read and
impossible to reference from other modules.

Solution: extract each into a named `---@class`: `pending.Metadata`,
`pending.TaskFields`, `pending.CompletionItem`, `pending.SystemResult`,
and `pending.OAuthClientOpts`.

* refactor(sync): extract shared utilities into `sync/util.lua`

Problem: sync epilogue code (`s:save()`, `_recompute_counts()`,
`buffer.render()`) and `fmt_counts` were duplicated across `gcal.lua`
and `gtasks.lua`. The concurrency guard lived in `oauth.lua`, coupling
non-OAuth backends to the OAuth module.

Solution: create `sync/util.lua` with `async`, `system`, `with_guard`,
`finish`, and `fmt_counts`. Delegate from `oauth.lua` and replace
duplicated code in both backends. Add per-backend `auth()` and
`auth_complete()` methods to `gcal.lua` and `gtasks.lua`.

* feat(sync): auto-discover backends, per-backend auth, S3 backend

Problem: sync backends were hardcoded in `SYNC_BACKENDS` list in
`init.lua`, auth routed directly through `oauth.google_client`, and
adding a non-OAuth backend required editing multiple files.

Solution: replace hardcoded list with `discover_backends()` that globs
`lua/pending/sync/*.lua` at runtime. Rewrite `M.auth()` to dispatch
to per-backend `auth()` methods with `vim.ui.select` fallback. Add
`lua/pending/sync/s3.lua` with push/pull/sync via AWS CLI, per-task
merge by `_s3_sync_id` (UUID), and `pending.S3Config` type.
2026-03-08 19:53:42 -04:00
..
archive_spec.lua refactor: organize tests and dry (#49) 2026-02-26 20:03:42 -05:00
complete_spec.lua refactor(config): remove legacy gcal top-level config key (#51) 2026-02-26 22:53:51 -05:00
diff_spec.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
edit_spec.lua refactor: organize tests and dry (#49) 2026-02-26 20:03:42 -05:00
filter_spec.lua refactor: organize tests and dry (#49) 2026-02-26 20:03:42 -05:00
gtasks_spec.lua feat(sync): diff metadata preservation, auth unification, and sync quality improvements (#74) 2026-03-05 22:40:19 -05:00
helpers.lua test: add store, parse, and diff specs 2026-02-24 15:10:09 -05:00
icons_spec.lua refactor(icons): ascii defaults, checkbox overlays, and cleanup (#57) 2026-03-04 18:44:41 -05:00
oauth_spec.lua fix(oauth): resolve re-auth deadlock and improve flow robustness (#87) 2026-03-06 15:47:42 -05:00
parse_spec.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
recur_spec.lua feat: omnifunc completion, recurring tasks, expanded date syntax (#27) 2026-02-25 13:27:52 -05:00
s3_spec.lua feat: auth backend (#111) 2026-03-08 19:53:42 -04:00
status_spec.lua refactor: organize tests and dry (#49) 2026-02-26 20:03:42 -05:00
store_spec.lua feat(buffer): persist fold state across sessions (#94) 2026-03-07 20:18:34 -05:00
sync_spec.lua feat: auth backend (#111) 2026-03-08 19:53:42 -04:00
sync_util_spec.lua feat: auth backend (#111) 2026-03-08 19:53:42 -04:00
textobj_spec.lua feat: text objects and motions for the pending buffer (#39) 2026-02-26 16:28:58 -05:00
views_spec.lua feat: auth backend (#111) 2026-03-08 19:53:42 -04:00