feat(dashboard): show tickets as a full page instead of a rail tab (#1144)#1226
Conversation
…1144) Tickets move out of the 27rem right rail into their own page at /{projectId}/tickets, reached from a new "Tickets" row in the sidebar once a project is selected. TicketsPanel keeps rendering the list, queue button, and GitHub import — just at full width now. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
#1144) The tickets page now lists each ticket as a single line; clicking one opens /{projectId}/tickets/{filename}, showing the ticket's whole markdown file (a new readTicket/onTicket read, not just the head readTickets parses) plus the Queue button, which moved off the list row. The GitHub import empty-state stays on the list. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
…144-ko7ye7 # Conflicts: # packages/framework-dashboard/components/TicketsPanel.tsx # packages/framework-dashboard/server/reads.telefunc.ts # packages/the-framework/src/dashboard-rpc/index.ts # packages/the-framework/src/dashboard-rpc/reads.telefunc.ts # packages/the-framework/src/dashboard/index.ts # packages/the-framework/src/dashboard/tickets.test.ts # packages/the-framework/src/index.ts
|
CI failure investigated: the single failing test was Generated by Claude Code |
|
Re-run failed the same way ( Generated by Claude Code |
#1144) Tickets moves below Overview in the sidebar and becomes cross-project: the page now reads every registered project's backlog (new collectAllTickets/onAllTickets) and renders one section per project, each with its own Import/Update-from-GitHub bar, at /tickets. Each row now shows priority, topics, and a human-readable age ("2d ago"), and the list sorts newest-first by the ticket file's mtime (new WorkspaceTicket.date/topics fields, parsed by readTickets/readTicket). Clicking a row still opens its own page at /{projectId}/tickets/{filename}. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
|
CI red on Generated by Claude Code |
|
Base recovered — Generated by Claude Code |
Tickets now carry Status: open/closed (from #1230), parsed and surfaced through the dashboard. The Tickets page gets Open/Closed filter checkboxes (Open only by default) and a wider two-up grid; a project with tickets hidden by the filter says so rather than offering an import for work that already exists. List rows badge closed tickets. The detail page moves the date to the left of the description and status into the meta row below it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
…link and sort (#1144) The detail page now puts every meta fact below the description in one order — date, priority, GitHub link, then status/topics/spiked/planned — instead of splitting date out beside the description. Priority reads "Priority: n" rather than a bare number, and a ticket's GitHub: link renders as an icon plus its issue number, linking out. A ticket's date now comes from its <DATE>_<SLUG>.md filename rather than the file's mtime (which drifted whenever an update-from-GitHub run touched it), falling back to mtime only for tickets that predate the dated-filename format. The Tickets page adds a "Sort by: Date/Priority" dropdown (ties fall back to newest-first) and widens to a third column at large viewports. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
…ort (#1144) The Tickets page drops its column grid: each project's table now spans the whole pane, which is the one dimension the rows actually need now that they carry topics, spiked/planned, effort, age, "Priority: n", and a GitHub issue link. The link sits beside the row's button (a link inside a button is invalid HTML), so the row still opens the detail page while the link goes out to the issue; the trailing meta keeps the date/priority/GitHub order the detail page uses. A ticket whose .spike.md (else .plan.md) records an effort estimate — the "Human intervention effort: low" line the spike format asks for — now surfaces it as WorkspaceTicket.effort, shown as "Effort: n" on the row and in the detail page's meta. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
…1144) The trailing meta on a ticket row is now three fixed-width columns — priority (an empty slot when the ticket names none), then the date, then the GitHub issue link (an equal-width spacer when there is none) — so the meta lines up down the table instead of drifting with whatever each row happens to have. The Update-from-GitHub action now sits adjacent to the "Updated from GitHub 2d ago" stamp it acts on rather than flush against the panel's far edge, and wears the outline button style instead of ghost. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
…1144) The topics/spiked/planned/effort chips now live in a fixed-width column between the title and the priority column, so they start at the same x on every row — with each row's tags starting wherever its title ended, the blank stretch between a short title and the right-hand meta read as dead space rather than as a table. The GitHub issue link steps up from 10px text with a 12px icon to text-xs with a 16px icon, on the row and the detail page both. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
The fixed 16rem tags column traded one gap for another: with the chips
left-aligned inside it, a row with one topic showed most of that column as
blank, pooling dead space mid-row between the tags and the priority. The
tags are now content-sized and right-packed, so the row's slack all lands in
the stretched title column — the one place a table carries it — and the
priority column narrows to hug its widest value ("Priority: 10") while
staying fixed so rows still align.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FzE7jX1qxv52V7xqKDvd3z
|
@suleimansh I didn't read the code. |
Summary
tickets/*.mdbacklog gets its own full-width section (newcollectAllTickets/onAllTickets) — the table spans the whole pane rather than sharing it with grid columns — each with its own Import/Update-from-GitHub bar (the update button now sits adjacent to its "Updated from GitHub 2d ago" stamp, styled as an outline button).GitHub:issue link (icon +#42, linking out — beside the row's button, so the row still opens the detail page).YYYY-MM-DD_slug.md) rather than the file's mtime (which drifted every time an update-from-GitHub run touched the file), falling back to mtime only for tickets written before the dated-filename format..spike.md(else.plan.md) records an effort estimate — the "Human intervention effort: low" line the spike format asks for — surfaces it asWorkspaceTicket.effort, shown as "Effort: n" on the row and in the detail meta.Status: open/closedheader (Add Status: open/closed to every ticket header #1230); a project with tickets hidden by the filter says so instead of offering an import for work that already exists./{projectId}/tickets/{filename}(same slug as the file), showing the ticket's entire markdown — not just the head a list row reads. All of a ticket's meta sits below the description, in one order: date, priority (spelled out as "Priority: n", not a bare number — the format's priority is a 0-10 scale), the ticket'sGitHub:link, then status, topics, spiked/planned, and effort. The Queue button lives here too, since the list row no longer has room for it.route.tsextended:/ticketsis the cross-project list,/{projectId}/tickets/{slug}is one ticket's page, alongside the existing/settings.Status:/Priority:/GitHub:headers) and reconciled cleanly each time.Closes #1144. Required for the demo video per the issue.
Test plan
pnpm exec vitest runinpackages/framework-dashboard— 555 tests pass.pnpm exec tsc --noEmitinpackages/framework-dashboard— clean.pnpm testinpackages/the-framework— 1405 tests pass, 1 pre-existing skip (readTicket/readTicketsMeta/collectAllTicketscoverage, plus date/topics/status/github/effort parsing, filename-vs-mtime dating, and newest-first sort).pnpm exec vite buildinpackages/framework-dashboard— clean,onAllTicketsregistered in the telefunc shield.Generated by Claude Code