feat: 9-phase audit + modernization (P0-P8)#7
Open
gabrielcsapo wants to merge 1 commit into
Open
Conversation
Audit-driven sweep of UX gaps, real bugs, and missing features that came out of a deep walkthrough of the running instance. 41 incremental commits squashed into one PR for review. Each phase was individually green on pnpm typecheck + pnpm lint and chrome-verified end-to-end after a final hotfix. P0 (bug fixes) - Repo-layout Outlet keyed by pathname so sibling tab navigation fully unmounts the previous page (Pipelines → Activity, Settings → Pipelines, …). - Pipeline run-level timeout (configurable via top-level timeout in YAML; default 60min) plus a stuck-run sweeper that recovers runs whose worker process died without writing finishedAt. - Server-side initial fetch reads ?status= so direct-loading filtered URLs shows the correct list instead of always defaulting to "open". - Danger-zone confirm-input placeholder no longer pre-fills the repo name. P1 (foundation + daily ergonomics) - Cursor-based pagination primitives in @groffee/db (encodeCursor / decodeCursor / cursorWhere / cursorOrderBy / paginatedResult); retrofit on issues / PRs / pipelines lists with a shared LoadMore component. - Diff syntax highlighting via the existing Shiki helper (server-side; +/- row coloring preserved). - Unified branch+tag picker with search + keyboard nav, used consistently across home / tree / blob / commits. - Line anchors and Copy permalink button on the blob view (#L42 / #L42-L60). - Search language facet labels: replaced brittle SUBSTR-based extension extraction with JS aggregation so facets like ".lient.tsx" become Tsx / TypeScript / JSON / etc. - Markdown editor component (Write/Preview tabs, drag-paste image upload, toolbar) wired into issue / PR / comment forms; bodies now render markdown. - Image upload API at /api/uploads (content-addressed, sha256, 10 MB cap). - Edit-in-browser file CRUD via git CLI (hash-object / mktree / commit-tree / update-ref); per-repo "edit policy" toggle (direct vs PR mode). P2 (light code review) - diff_comments table for inline PR review (threaded via parentId). - PR detail page tabs (Conversation / Files changed / Commits). - Inline diff comment UI with reply, resolve, collapse-when-resolved. - Merge button (merge / squash; rebase returns 501) with branch-deletion checkbox. - CI status badge on Conversation tab via getLatestRunForCommit. P3 (pipelines polish — flagship) - ANSI color rendering + per-line ISO timestamps stored TAB-separated on disk. - Live-tail SSE with per-conn byte offsets + 15s heartbeat + terminal-state close. - Search-in-log; per-step and full-run log download. - "Rerun failed jobs only" preserves the prior run's succeeded jobs. - pipelineArtifacts.retentionUntil + 30-min retention sweeper + UI. - repoSecrets schema (AES-256-GCM at rest, master key at data/.groffee-key mode 0600) + UI under repo settings + runner env injection (per-step). - Build matrix support: matrix in YAML, per-cell row in pipelineJobs, template interpolation for matrix.X, DAG render with cell aggregation. - Inline error annotations: parse file:line from logs, validate path exists via git cat-file, link to /blob/<sha>/<path>#L<line>. - Pipeline config editor at /pipelines/config with validate-then-commit (re-uses the P1 editFile flow so it respects editPolicy). - Run history sidebar on detail page (last 15 runs on same ref). - List page filters: ref, trigger, actor (URL-driven, paginated). P4 (homelab ops) - Repo invite links (one-time, time-limited, optional permission binding). - Admin CLI subcommands (reset-password, make-admin, disable-user, recompute-storage, reindex-search). - Admin dashboard rebuilt: storage by repo, audit feed (filterable), search index freshness, PR backfill button. - Per-repo "Reindex now" button with last_indexed_at status. - Historical PR backfill from "Merge pull request #N" commit messages. P5 (repo polish) - Clone helper popover (HTTPS / SSH / CLI tabs + "Open in VS Code"). - About sidebar lifted to shared component, rendered on tree + blob too. - Markdown copy buttons on every <pre><code>, heading anchor links. - /tags listing page with cursor pagination. P6 (personal touches) - Profile schema: avatarUploadId, website, location. - Avatar upload via the P1 image upload route + <Avatar /> component used in the top-bar and profile page. - Profile fields UI (bio with char counter, website URL-validated, location). - PAT management UI polish (status badge, last-used, revoke confirm). - SSH keys UI: algorithm-prefix gate + clarified vs deploy keys. P7 (mobile responsive) - Repo browsing: About reflow, file-table column hiding, repo nav horizontal-scroll, blob action bar. - Issue / PR detail: comment-header stacking, tab strip scroll, Files-changed file-list collapsible under lg. - Search: tab strip scroll + Languages facet collapsible under md. P8 (settings expansion) - Default branch change (DB-only, validated against gitRefs). - Repository rename (renames disk dir + diskPath; redirects to new URL). - Archive flag enforced across every write path (issues, PRs, comments, diff comments, secrets, invites, edit-in-browser, SSH push). - Per-repo deploy keys (separate table; SSH auth callback tries user keys then deploy keys; read-only flag enforced). Hotfix - Rename RepoAboutSidebar's `ref` prop to `gitRef`. `ref` is React-reserved and crashed every repo home/tree/blob route with "Refs cannot be used in Server Components". Cross-cutting principle established for the codebase: cursor pagination, no "fetch all and slice", aggregates precomputed where applicable, every list scoped by viewer permissions in SQL. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Audit-driven sweep of UX gaps, real bugs, and missing features that came out of a deep walkthrough of the running instance at
https://groffee.local. Squashed from 41 incremental commits into one PR for review.Each phase was individually green on
pnpm typecheck+pnpm lint, then chrome-verified end-to-end after a final hotfix. See the commit body for the per-phase breakdown.Stats: 125 files changed, +43,715 / -1,619.
What's in the box
Cross-cutting principle
Cursor pagination on every list (no offset, no fetch-all-and-slice). Aggregates precomputed where applicable. Every list query scoped by viewer permissions in SQL.
Test plan
Known follow-ups (not blocking)
🤖 Generated with Claude Code