Signed-in users can view notifications (unread-only or all), paginated,
and jump from an issue/PR notification to that repository's work items.
No mark-read/unread/pinned write endpoint is exposed, matching the
existing single-write-scope posture from ADR-004.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds read-only GET /user/orgs and GET /orgs/{org}/repos to
GiteaRepositoryBrowserApi (a third interface, OrganizationsRepository),
reusing existing repository mapping rather than duplicating it.
Repository list gains an organization filter chip row (all + one per
org), keeping the existing recent-push sort and paging. Organizations
are fetched once per session and cached; a failure to load them
degrades to an empty filter row instead of blocking the repository
list itself. Filtering only applies to the all-repositories mode,
since Gitea star is not organization-scoped.
Closes MVP outcome #2 in docs/product.md. No task file existed
beforehand; created it first per AGENTS.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replace MainActivity's three independent booleans (browsingCode/
browsingHistory/browsingWorkItems) with one typed List<Route> back
stack, restorable through configuration change and process death.
Route holds only stable primitives (owner/name/ref/ref-kind), never
tokens or content. A genuine LIFO stack, not just a refactor: back now
correctly unwinds through arbitrarily nested screens instead of
relying on which boolean happened to still be true underneath another.
No task file existed for this task beforehand (only proposed in an
earlier handoff document); created it first per AGENTS.md.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Separate issue and PR list/detail tabs, paginated, with comments
(issues) and reviews+comments (PRs). Deleted/unavailable authors
render a fixed placeholder instead of crashing or inventing identity;
every status is a text label, never color-only.
Reuses TASK-010 directly; no shared/domain file touched. Both list
types dedupe by number per page. Entry point is a new button on the
repository references screen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Paginated commit history for the current ref, commit detail with
distinguished added/modified/deleted/renamed file status, bounded and
explicitly-truncated patch text, and a ref comparison flow validating
one entered ref against the currently open ref as base.
Reuses TASK-004's listCommits and this session's own TASK-009
HistoryRepository; no shared/domain file touched. Entry point is a new
history button on the existing code browser header.
Self-review caught and fixed a bug before writing tests: a failed
commit-detail fetch discarded which commit had failed, so retry
silently reloaded the whole list instead of re-fetching the commit the
user tried to open.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TASK-018, human product owner priority-1 request. Adds write:user
OAuth scope (ADR-004) and relaxes OAuthClientConfig's read-only guard
to an explicit, hard-coded write-scope allow-list rather than a
general write-scope allowance. GiteaRepositoryBrowserApi gains star/
unstar/listStarred via a new RepositoryFavorites interface, reusing
its existing repository mapping. RepositoryListViewModel tracks an
ALL/FAVORITES mode; toggling favorite confirms against the server
before updating UI state rather than acting optimistically.
No create/edit/merge/close/comment endpoint is introduced. Favorite
state is never cached locally.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
TASK-017, human product owner priority-1 request. Repository list now
requests sort=updated&order=desc from Gitea, loads 5 repositories per
page with explicit prev/next navigation, and each visible row
independently fetches and shows its most recently committed branch.
Removes the legacy eager-loading RepositoryListApi in favor of the
existing paged GiteaRepositoryBrowser.listRepositories. Fixes two
issues found in self-review: missing error handling on page
navigation, and repositories with no default branch (empty repos)
previously failing the whole page instead of just that row.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>