Repository navigation
feat(web): issues page and detail panel match pull requests - #8
Conversation
Record the last observed issue state on projection_issue_links, refresh it when a linked worktree's pull requests merge, and tint closed issue chips in the sidebar.
…request page Moves the condensing column, compact filter menus, folded search and refresh control into components/workItem so the issues page can share them, and moves the new-issue dialog into its own module. No visible change to the pull request page.
Adds an issues toolkit mirroring the pull request one: list_issues, read_issue, comment_on_issue, close_issue, reopen_issue, update_issue and link_issue.
List rows carry assignees, milestone, close reason and linked work; the list query drops bodies and reactions; filters and sort are sent to GitHub search so pages are full. Issue detail gains linked pull requests, parent and sub-issues, and a new paginated issues.timeline read.
The issues list now uses the shared work-item column: condensing header, search with label:/author:/assignee:/milestone: qualifiers, Sort, Filters, involvement and an All projects scope, ghost rows, and groups for Working on / Assigned to you / Others. Rows share the pull request row layout with close-reason glyphs, assignees, milestone and an In progress marker. Rows can start work directly, be selected for bulk close/reopen/label/assign, and both lists support j/k/Enter keyboard navigation.
Summary and Timeline tabs, a condensing header like the pull request panel, pickers for assignees and labels, linked pull requests, parent and sub-issue progress, markdown editing with preview, the reaction picker and a floating comment composer. The new-issue dialog gains label/assignee pickers, a preview and Create & start work.
- Label and assignee edits can be sent as add/remove, applied with GitHub's additive endpoints so concurrent edits are not overwritten. - author:me / assignee:me map to GitHub's @me. - Multi-repository lists return every fetched row; search cursors keep later pages on the search path. - List rows ignore detached links and pick the latest link deterministically. - New list row fields are optional so newer clients work with older servers. - Detail queries run concurrently, fall back on older GitHub Enterprise, and timeline assignees include bots. - MCP issue writes are limited to the calling thread's project. - Service-level tests for list, detail fallbacks, timeline and additive edits.
Bulk add-label/assign and the summary pickers send additive changes, and bulk actions are disabled while the list shows saved or carried rows. Search handles me/@me and moves typed is:/state:/sort: onto the page controls. Parent and sub-issue links open in the panel, older servers show a timeline-unavailable state, and retired local storage is cleaned up. Adds an Issues section to the user docs.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 07c3c7f9a6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return { | ||
| providers, | ||
| entries: entries.slice(0, limit), | ||
| entries, |
There was a problem hiding this comment.
Bound merged issue pages to the requested limit
When listing multiple repositories, each repository fetches up to limit rows and this returns all of them, so the web request with limit: 99 can send and render as many as 9,900 rows, while an MCP caller using limit: 1 can unexpectedly receive one row per repository. This creates a large WebSocket/list-rendering regression in the new all-projects view; pagination needs to preserve unreturned per-repository rows or otherwise avoid advancing their cursors while keeping each merged response globally bounded.
AGENTS.md reference: AGENTS.md:L15-L17
Useful? React with 👍 / 👎.
| .toSorted(([left], [right]) => left.localeCompare(right)) | ||
| .map(([environmentId, selections]) => ({ | ||
| environmentId, | ||
| repositories: [...selections.values()].slice(0, MAX_REPOSITORIES_PER_REQUEST), |
There was a problem hiding this comment.
Batch repositories instead of dropping entries after 100
For an environment containing more than 100 distinct GitHub repositories, the All projects scope silently discards every repository after the first 100. Because those selections never enter scopeQueries, neither initial loading nor Load more can retrieve their issues; partition the selections into multiple request-sized targets instead of slicing them away.
Useful? React with 👍 / 👎.
The Issues page looked and behaved differently from the Pull Requests page. It had a plain toolbar, one project at a time, spinners, hand-built rows, and comma-separated label and assignee editing. The server already supported involvement, filters and several repositories, but the page used none of it. List rows also fetched every issue's body and reactions, then never used them.
This PR builds Issues on the same pieces as Pull Requests, so the two pages read as one product.
Shared list frame (
components/workItem): the PR page's shrinking header, folding search, compact filter menus and refresh control were moved into shared components. The PR page looks and behaves the same as before.Issues list
label:,-label:,author:,assignee:,milestone:andme. Sort, Filters (labels, author, assignee, milestone), involvement (Assigned / Authored / Mentioned), and an All projects or single-project scope.j/k/Enter on both list pages;x,candmod+Aon Issues.Issue view
Server
memaps to@me.issues.timeline. These degrade quietly on older GitHub Enterprise.Agents: an MCP issues toolkit, mirroring the pull request one:
list_issues,read_issue,comment_on_issue,close_issue,reopen_issue,update_issue,link_issue. Write tools are limited to the calling thread's project.Also: linked issue chips in the sidebar show closed issues (closing state is recorded when a linked worktree's PRs merge).
Docs: an Issues section in
docs/user/source-control.md, and the list shortcuts indocs/user/keybindings.md.Surfaces
Verification
apps/web,apps/server,packages/contractsandpackages/client-runtime.vp test runon issue, workItem, pullRequest, MCP issues and client-runtime state passes: 83 files, 1,282 tests.Sidebar.tsxerrors were already there).Built with Claude Opus 5.5 (orchestration, UI, review and fixes) and Codex GPT-6.1-Sol (server data layer, MCP toolkit) in T3 Code via the Claude Code harness.