Add a UI roadmap for issues and projects.

e0e61fb1718b · AtlantisPleb · · parent 81181fe0ba6c

Add a UI roadmap for issues and projects.

Describe the DaisyUI LiveView surfaces on /:owner/:repo paths, the
clone harvest files, and the API each page calls.

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

Not deployed through the forge lane

No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.

Changed files

  • added docs/issues-projects-ui-roadmap.md

Diff

1 file changed, +393 -0

docs/issues-projects-ui-roadmap.md added +393

@@ -0,0 +1,393 @@

1
# Issues and Projects UI roadmap
2
3
Date: 2026-08-19
4
5
Source: `docs/issues-projects-work-plan.md`, `docs/github-api-issues-projects-assessment.md`, and the GitHub clone harvest under `~/work/projects/repos/githubclones/`.
6
7
This roadmap outlines a simple browser UI for the existing OpenAgents issues, labels, assignees, milestones, comments, and Projects V2 API. The implementation uses Phoenix 1.8 LiveView, `OpenAgentsWeb.CoreComponents`, and DaisyUI component classes. The goal is a GitHub-shaped surface that is usable, not a pixel-perfect clone.
8
9
## Scope and assumptions
10
11
- The JSON API is in place and follows the paths in `docs/github-api-issues-projects-assessment.md`.
12
- The UI lives on `/:owner/:repo` paths, starting with the surfaces in this document.
13
- `OpenAgentsWeb.CoreComponents` and DaisyUI are the building blocks.
14
- `Phoenix.Component.to_form/2` drives forms, and LiveView streams handle issue and comment lists.
15
- Markdown bodies are rendered as HTML with `OpenAgentsWeb` markdown helpers.
16
17
## What is out of scope
18
19
- Drag-and-drop project boards.
20
- Real-time presence and live updates beyond standard PubSub.
21
- Full-text issue search indexing.
22
- React-style hovercards and preview cards.
23
- File browser, code review, and pull request surfaces.
24
- Pixel-perfect GitHub Primer styling.
25
26
## Layout foundation
27
28
Build the repo header and subnavigation before any issue page.
29
30
### Global navigation and repo header
31
32
What the surface shows:
33
34
- A top **navbar** with the OpenAgents logo, a search field, and the current user avatar.
35
- A **repo header** with the owner avatar, owner name, repo name, and a visibility badge.
36
- A **subnav** row with **Code**, **Issues**, **Pull requests**, **Projects**, and **Settings** tabs. The active tab gets a highlighted underline.
37
38
DaisyUI parts:
39
40
- `navbar` for the top bar.
41
- `tabs` for the subnav.
42
- `avatar` and `badge` for the owner and visibility indicators.
43
- `btn` for star, fork, and watch actions.
44
- `input` for the search field.
45
46
Clone harvest:
47
48
- `gh-next/src/app/(app)/[user]/[repository]/page.tsx`
49
- `gitea/templates/repo/header.tmpl`
50
- `gitea/templates/repo/issue/navbar.tmpl`
51
52
Acceptance:
53
54
- The same `Layouts.app` wrapper is on every page with `current_scope` assigned.
55
- The subnav links to `/:owner/:repo/issues`, `/:owner/:repo/projects`, and so on.
56
57
## Phase 1: Placeholder homepage
58
59
What the surface shows:
60
61
- A **hero** section with the OpenAgents value proposition.
62
- A list of owned repositories as cards.
63
- Primary actions: **Create new repository** and **Create new issue**.
64
- Optional: a placeholder contribution activity block.
65
66
DaisyUI parts:
67
68
- `hero` for the welcome section.
69
- `card` for repository cards.
70
- `btn btn-primary` for the main call to action.
71
- `badge` for public or private status.
72
- `stat` for star and fork counts.
73
- `avatar` for the owner avatar.
74
75
Clone harvest:
76
77
- `leoronne-github-ui-clone/src/pages/Profile/index.tsx`
78
- `TiagoDiass-github-ui-clone/src/pages/Profile/Profile.tsx`
79
- `gh-next/src/app/(app)/[user]/[repository]/page.tsx`
80
81
Acceptance:
82
83
- `/` renders without a `current_scope` error.
84
- The page lists at least one owned repo.
85
- Each repo card links to `/:owner/:repo`.
86
87
## Phase 2: Issues list
88
89
What the surface shows:
90
91
- A search and filter bar.
92
- **Open** and **Closed** tabs with counts.
93
- Issue rows with state icon, title, labels, author, relative time, and comment count.
94
- Pagination.
95
- An empty state when no issues match.
96
97
DaisyUI parts:
98
99
- `tabs` for **Open** and **Closed**.
100
- `input` for the search field.
101
- `btn` and `dropdown` for filters and sort.
102
- `table` or custom flex rows for the issue list.
103
- `badge` for state and labels.
104
- `avatar` for assignees.
105
- `join` for pagination.
106
107
Clone harvest:
108
109
- `gh-next/src/components/issues/issue-row.tsx`
110
- `gh-next/src/components/issues/issue-list.tsx`
111
- `gh-next/src/components/issues/issues-list-header-form.tsx`
112
- `gitea/templates/repo/issue/list.tmpl`
113
114
API to call:
115
116
- `GET /api/v3/repos/:owner/:repo/issues`
117
118
Acceptance:
119
120
- `/:owner/:repo/issues` lists open issues by default.
121
- Clicking **Closed** lists closed issues.
122
- Each title links to `/:owner/:repo/issues/:number`.
123
- The page uses `stream` for the issue list.
124
125
## Phase 3: Issue detail and comments
126
127
What the surface shows:
128
129
- A header with the issue number, title, and state badge.
130
- Author, avatar, and relative time.
131
- A markdown-rendered body.
132
- Label, assignee, and milestone sections.
133
- A chronological comment thread with author avatars and markdown bodies.
134
- A comment form.
135
136
DaisyUI parts:
137
138
- `badge` for the open or closed state.
139
- `avatar` and `card` for comments.
140
- `textarea` for the comment form.
141
- `btn` for submit, close, and reopen actions.
142
- `timeline` for the comment thread.
143
- `collapse` or `drawer` for the metadata sidebar.
144
145
Clone harvest:
146
147
- `gh-next/src/app/(app)/[user]/[repository]/issues/[number]/page.tsx`
148
- `gitea/templates/repo/issue/view.tmpl`
149
- `gitea/templates/repo/issue/view_content.tmpl`
150
- `git.limo/apps/gitgud_web/lib/gitgud_web/live/issue_live.html.heex`
151
152
API to call:
153
154
- `GET /api/v3/repos/:owner/:repo/issues/:issue_number`
155
- `GET /api/v3/repos/:owner/:repo/issues/:issue_number/comments`
156
- `POST /api/v3/repos/:owner/:repo/issues/:issue_number/comments`
157
- `PATCH /api/v3/repos/:owner/:repo/issues/:issue_number/comments/:comment_id`
158
- `DELETE /api/v3/repos/:owner/:repo/issues/:issue_number/comments/:comment_id`
159
160
Acceptance:
161
162
- The detail page renders at `/:owner/:repo/issues/:number`.
163
- Comments appear newest first or oldest first consistently.
164
- Submitting a comment adds it without a full page reload.
165
166
## Phase 4: New and edit issue
167
168
### New issue
169
170
What the surface shows:
171
172
- A title input.
173
- A body textarea with a live markdown preview.
174
- Multi-select fields for labels and assignees.
175
- A single-select milestone field.
176
- Submit and cancel actions.
177
178
DaisyUI parts:
179
180
- `input` for the title.
181
- `textarea` for the body.
182
- `select` for the milestone.
183
- `checkbox` for labels and assignees.
184
- `btn` for submit and cancel.
185
- `card` to frame the form.
186
187
Clone harvest:
188
189
- `gh-next/src/components/issues/new-issue-form.tsx`
190
- `gitea/templates/repo/issue/new.tmpl`
191
- `gitea/templates/repo/issue/new_form.tmpl`
192
- `git.limo/apps/gitgud_web/lib/gitgud_web/live/issue_form_live.html.heex`
193
194
API to call:
195
196
- `POST /api/v3/repos/:owner/:repo/issues`
197
- `GET /api/v3/repos/:owner/:repo/labels`
198
- `GET /api/v3/repos/:owner/:repo/assignees`
199
- `GET /api/v3/repos/:owner/:repo/milestones`
200
201
Acceptance:
202
203
- `/:owner/:repo/issues/new` renders the form.
204
- Submitting a valid issue redirects to the detail page.
205
- Validation errors appear next to the title or body fields.
206
207
### Edit issue
208
209
What the surface shows:
210
211
- Inline editing of the title and body on the detail page.
212
- A state toggle, label multi-select, assignee multi-select, and milestone select.
213
- Save and cancel actions.
214
215
DaisyUI parts:
216
217
- `input` and `textarea` for editable fields.
218
- `btn` for save, cancel, close, and reopen.
219
- `modal` only if a separate edit view is preferred.
220
- `collapse` for compact edit sections.
221
222
Clone harvest:
223
224
- `git.limo/apps/gitgud_web/lib/gitgud_web/live/issue_live.html.heex`
225
- `gitea/templates/repo/issue/view_content.tmpl`
226
227
API to call:
228
229
- `PATCH /api/v3/repos/:owner/:repo/issues/:issue_number`
230
- `POST /api/v3/repos/:owner/:repo/issues/:issue_number/labels`
231
- `DELETE /api/v3/repos/:owner/:repo/issues/:issue_number/labels/:name`
232
- `POST /api/v3/repos/:owner/:repo/issues/:issue_number/assignees`
233
- `DELETE /api/v3/repos/:owner/:repo/issues/:issue_number/assignees`
234
235
Acceptance:
236
237
- The detail page allows in-place editing of title and body.
238
- State changes update the state badge immediately.
239
- Saving updates the issue and re-renders the page.
240
241
## Phase 5: Labels, milestones, and assignees
242
243
### Labels
244
245
What the surface shows:
246
247
- A count header and a sort dropdown.
248
- Label rows with colored badge, name, description, issue count, and edit and delete actions.
249
- A create button and an inline or modal create form.
250
251
DaisyUI parts:
252
253
- `badge` for label colors.
254
- `table` or `card` for label rows.
255
- `btn` for edit, delete, and create.
256
- `input`, `textarea`, and a color picker for the create and edit forms.
257
- `dropdown` for sorting.
258
- `modal` for the create and edit forms.
259
260
Clone harvest:
261
262
- `gitea/templates/repo/issue/labels/label_list.tmpl`
263
- `primer-view_components/app/components/primer/beta/label.rb`
264
265
API to call:
266
267
- `GET /api/v3/repos/:owner/:repo/labels`
268
- `POST /api/v3/repos/:owner/:repo/labels`
269
- `PATCH /api/v3/repos/:owner/:repo/labels/:name`
270
- `DELETE /api/v3/repos/:owner/:repo/labels/:name`
271
272
Acceptance:
273
274
- `/:owner/:repo/labels` lists all labels.
275
- Creating or editing a label updates the list.
276
277
### Milestones
278
279
What the surface shows:
280
281
- A count header and open or closed filter tabs.
282
- Milestone cards with title, due date, progress bar, open count, and closed count.
283
- Edit, close, and delete actions.
284
- A create form.
285
286
DaisyUI parts:
287
288
- `progress` for the milestone progress bar.
289
- `stat` for open and closed counts.
290
- `card` for milestone cards.
291
- `badge` for the open or closed state.
292
- `input` for the create and edit forms.
293
294
Clone harvest:
295
296
- `gitea/templates/repo/issue/milestones.tmpl`
297
- `primer-view_components/app/components/primer/beta/counter.rb`
298
299
API to call:
300
301
- `GET /api/v3/repos/:owner/:repo/milestones`
302
- `POST /api/v3/repos/:owner/:repo/milestones`
303
- `PATCH /api/v3/repos/:owner/:repo/milestones/:milestone_number`
304
- `DELETE /api/v3/repos/:owner/:repo/milestones/:milestone_number`
305
306
Acceptance:
307
308
- `/:owner/:repo/milestones` renders milestones with progress bars.
309
- Closing a milestone updates its state badge.
310
311
### Assignees
312
313
What the surface shows:
314
315
- Assignees appear as an avatar stack on issue rows and in the detail view.
316
- The issue detail page shows an assignee selection dropdown.
317
- An optional `/:owner/:repo/assignees` page lists users and their assigned issue counts.
318
319
DaisyUI parts:
320
321
- `avatar` and `avatar-group` for the stack.
322
- `badge` for overflow counts like `+2`.
323
- `menu` for the assignee dropdown.
324
325
Clone harvest:
326
327
- `gh-next/src/components/issues/issue-row.tsx`
328
- `gh-next/src/components/issues/issue-assignee-filter-action-list.tsx`
329
- `gitea/templates/repo/issue/sidebar/assignee_list.tmpl`
330
331
API to call:
332
333
- `GET /api/v3/repos/:owner/:repo/assignees`
334
335
## Phase 6: Projects V2 board
336
337
What the surface shows:
338
339
- A project list page with project cards.
340
- A simple board view with columns such as **To Do**, **In Progress**, and **Done**.
341
- Cards inside columns show issue title, labels, and assignees.
342
- Buttons to create a project and add a column.
343
344
DaisyUI parts:
345
346
- `card` for project cards and board cards.
347
- `collapse` for collapsible columns.
348
- `badge` for labels and status.
349
- `avatar` for assignees.
350
- `progress` for project completion.
351
- `btn` for create actions.
352
353
Clone harvest:
354
355
- `gitea/templates/repo/projects/list.tmpl`
356
- `gitea/templates/repo/projects/view.tmpl`
357
- `gitea/templates/repo/issue/sidebar/project_list.tmpl`
358
359
API to call:
360
361
- `GET /api/v3/users/:username/projectsV2`
362
- `POST /:owner/projectsV2`
363
- `GET /api/v3/users/:username/projectsV2/:project_number`
364
- `GET /api/v3/users/:username/projectsV2/:project_number/items`
365
- `POST /api/v3/users/:username/projectsV2/:project_number/items`
366
- `PATCH /api/v3/users/:username/projectsV2/:project_number/items/:item_id`
367
368
Acceptance:
369
370
- The project list renders at `/:owner/projects`.
371
- A project board renders at `/:owner/projects/:project_number`.
372
- Cards display issue title, labels, and assignees.
373
- Drag-and-drop is not required for the first pass.
374
375
## Component conventions
376
377
- Begin every LiveView template with `<Layouts.app flash={@flash} ...>`.
378
- Use `OpenAgentsWeb.CoreComponents` for `input`, `textarea`, `button`, `table`, and `icon`.
379
- Use DaisyUI classes only where they make the final layout simpler than the core component.
380
- Use `Phoenix.Component.to_form/2` for forms.
381
- Use LiveView `stream` for issue lists, comment lists, and board cards.
382
- Use `<.icon name="..." />` for icons and avoid hand-written `svg` tags.
383
384
## Implementation order
385
386
1. Layout foundation and placeholder homepage.
387
2. Issues list with open and closed tabs.
388
3. Issue detail and comment thread.
389
4. New issue and inline edit issue forms.
390
5. Labels, milestones, and assignee selection.
391
6. Projects V2 list and simple board view.
392
393
Each phase can become its own `mix test` and `mix precommit` cycle. Keep the UI simple, build from the API already in place, and add polish once the core flows are usable.

This page updates live while a promote is in flight · changelog