UI shell: two-column navigation, repo list, boxes [1]-[3], details #8
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The core interaction model needs to exist as a working program: two columns, the repo list on the left, numbered boxes previewed on the right,
l/1–5to move into the boxes, details on the right,lto focus the details pane,hto go back, with a breadcrumb, status-bar hints and help. This is the foundation every other UI ticket builds on, and it sets the UI code patterns.Goal
One thin, complete path before breadth (plan-review build order, #17): connect → list repos → open a PR → confirm merge → see the result. The read-only shell below is the first half of that path; #9's merge completes it. Build the minimum of each step end to end before widening any of them.
Plan
internal/ui:[1]Pull requests,[2]Issues,[3]Actions (shown only when the adapter supports runs), with the focused box growing as in the mockup.[/]tab switching wired up.bubbles/key) that drives both the help overlay (?) and the status-bar hints. A breadcrumb header.internal/ui/style. Layout derived fromtea.WindowSizeMsg; must work at 80×24.lazyforge --demo): the full UI running on built-in fake data (theforgetestfake, seeded to look like the mockup). It lets UI work start before the gitea adapter exists, lets actions be tried without touching real repos, and gives agents a deterministic way to verify UI changes: drive the app in tmux (send-keys/capture-pane) and capture screenshots with VHS for the MR body. Demo data lives inforgetest;cmd/lazyforgewires it up behind the flag.Tests:
Updatedriven by messages against theforgetestfake. Whether to adopt a golden-fileViewtesting library is decided by Opus here.Context
docs/design.md→ Navigation model, Boxes, Keymap.docs/mockup.htmlis the visual reference.go-development→ Bubble Tea rules.jat a box edge, whether the focused box grows). Build to the mockup's behavior unless the PM decides otherwise first.PM decisions (2026-10-02, #13)
jstops at the bottom of a box. The focused box grows.r. The timer lives in the UI and re-issues core fetches (ADR 0007).Added to scope (Opus): a demo mode,
lazyforge --demo. It runs the full UI on built-in fake data (theforgetestfake, seeded to look like the mockup), so that:m,xand other actions can be tried without touching real repos;send-keys/capture-pane) and capturing screenshots with VHS. Screenshots or GIFs of UI changes go in the MR body.Demo data lives with the fake in
forgetest, not in production packages;cmd/lazyforgewires it up behind the flag.🤖 Plan approved (engineering lead). Three parts: (1) the UI itself (repo list with ★ Renovate pinned, boxes [1] Pull requests, [2] Issues, [3] Actions when the forge has them, the details pane with Overview, one keymap driving help and the status-bar hints, layout down to 80×24); (2) demo data for
lazyforge --demo; (3) startup wiring and docs. Read-only: actions come in #9. Box titles and tabs follow design.md: only working tabs are shown, so Overview for now.qandctrl+cquit, as in the mockup. Branch: feature/8-ui-shell.🤖 Merged in #30. lazyforge now opens its terminal UI: the repo list with ★ Renovate pinned (placeholder for now), boxes [1] Pull requests, [2] Issues and [3] Actions (when the forge has them), a details pane with Overview, the breadcrumb, status-bar hints and ? help. It fits 80×24.
lazyforge --demoruns it on mockup data. It's read-only: actions are #9.