Skip to content

Browse Issues: list, filters, parent tree and side panel #27

Description

@lukemaj

Parent

#25

Outcome

The user browses GitHub Issues from all repositories of their T3 projects in Chromeria, and reads and acts on one Issue in a side panel.

Acceptance criteria

  • The Pull Requests page has a PRs/Issues toggle; a sidebar Issues icon next to the PR icon opens the page with Issues selected.
  • Issues from every repository of the user's T3 projects are listed across connected environments, GitHub only; other forges show a not-supported state.
  • Each row shows GitHub state: Open, Done (closed as completed) or Not planned (closed as not planned or duplicate).
  • Search, sort (updated, created, number) and filters Repository/Project, Labels, Milestone and Parent; PR-only filters are hidden in Issues mode.
  • Group by parent shows the sub-Issue tree, including children in other repositories, marked when outside the user's projects.
  • Side panel: body, comments, add comment, close and reopen, open on GitHub.
  • The command palette searches Issues on the Issues page, like it searches PRs.
  • No fork storage; upstream tables, migrations and events unchanged; every upstream-file edit is in scripts/fork-upstream-edits.txt and docs/fork-features.md.

Non-goals

Blocked by

None

Required proof

  • Live suite against real gh and real GitHub (no fake CLI) covering listing, pagination, cross-repo children, comment and close/reopen, using a disposable fixture Issue.
  • Web logic tests for filtering, sorting and parent grouping, following pullRequestList.logic.test.ts.
  • Targeted lint and typecheck; scripts/fork-check.sh; independent review of the exact head.

Activity

  1. lukemaj commented on Sep 25, 2026

    @lukemaj
    ContributorAuthor

    Handoff

    PR: #32 (into feat/25-issues, not merged)
    Head: 92202bf97e3490960c46086f5aacb68bcd1fb00e on feat/27-browse-issues

    Delivered: every acceptance criterion of this Issue:

    • PRs/Issues toggle (/pull-requests?view=issues), a sidebar Issues icon and a palette "Open issues" action.
    • GitHub-only listing across environments, with a not-supported note for other forges.
    • Rows show Open, Done or Not planned.
    • Search; sort by updated, created or number; filters for Repository/Project, Labels, Milestone and Parent.
    • Parent tree with cross-repo children marked "Outside your projects".
    • Side panel: body, comments, comment, close as completed or not planned, reopen, open on GitHub.
    • The palette searches listed Issues on the Issues page.
    • No storage. Upstream edits are allowlisted and mapped under issues-browse.

    Commands and results (run in apps/server or apps/web):

    • T3CODE_ISSUES_LIVE=1 T3CODE_ISSUES_LIVE_FIXTURE=30 vp test run src/issues/IssueService.live.test.ts: 6/6 pass against real gh and GitHub. It covers:

      • listing with worktree dedupe and an unsupported forge;
      • pagination;
      • cross-repo children (model-router#3 → agent-observer);
      • detail and a missing Issue;
      • comment, close as not planned, reopen and close on fixture [test fixture] Issues live suite (disposable) #30.

      Without the flag, all 6 skip.

    • vp test run src/components/issues/issueList.logic.test.ts src/components/CommandPalette.logic.test.ts: 47/47.

    • vp test run src/server.test.ts: 197/197. src/auth/RpcAuthorization.test.ts: pass.

    • tsc --noEmit: server, web, contracts, client-runtime and mobile all clean.

    • vp lint on changed files: 0 errors. The only warnings are 22 that already existed in the touched upstream files.

    • scripts/fork-check.sh: OK (14 commits, 10 features).

    Fixture: #30 has the test-fixture label, which I created. It is closed as completed, with one suite comment.

    Unverified:

    • No integrated pass in a real web client, so no screenshots.
    • Independent review not yet done.
    • Fork CI on the PR not yet observed.

    Merge note for #28: both branches append to scripts/fork-upstream-edits.txt and docs/fork-features.md, and probably touch rpc.ts, ws.ts, server.ts and RpcAuthorization.ts. Each upstream path may have only one primary owner, so the merge must move any path both features list into one feature's sharedFiles.

  2. lukemaj commented on Sep 25, 2026

    @lukemaj
    ContributorAuthor

    Handoff update: review fixes

    PR: #32 (into feat/25-issues, not merged)
    Head: 31d77678b007ce7f386abd436df427445f8e0016 (supersedes 92202bf)

    Review findings addressed:

    1. Failures are now visible. A failed server or failed "Load more" page shows a Retry banner above the rows that stay, and "Load more" is hidden while a failure is showing. It also no longer re-asks for a page it already asked for.
    2. Dead code removed. scoreIssueMatch and its tests are gone, and the PR body's palette claim is corrected.
    3. Unsupported repositories counted once. The contract now returns each unsupported repository ({host, repository}) instead of a count. The server dedupes by the same host+repository key it uses for GitHub, and the client dedupes again across pages and servers. The count reads "N repositories on host".
    4. Toasts explain failures. Comment and close/reopen failure toasts include GitHub's reason via formatEnvironmentQueryError(result.cause).
    5. Locked Issues keep the comment box. GitHub's schema has no viewerCanComment on Issue (checked with gh api graphql __type(name:"Issue")). So the box always shows. IssueDetail now carries locked, a locked Issue shows a note, and if GitHub refuses the comment, the toast shows why.
    6. Pure tests added. New src/issues/gitHubIssues.test.ts table-tests issueStateOf (OPEN, REOPENED, COMPLETED, NOT_PLANNED, DUPLICATE, null reason) and issueSearchQuery (state, sort, quoting, qualifier injection, refused repositories).
    7. Left as is, per review.
    8. Palette placement. The Issues group now comes after Actions and appears only once something is typed.

    Also fixed:

    • knip: make is no longer exported from IssueService.ts, and issueDetail is no longer exported from state/issues.ts.
    • Server typecheck: the live test used new Date(), which the server typecheck rejects, so the server typecheck failed at 92202bf. The marker now uses DateTime.

    Commands and results at 31d7767:

    • T3CODE_ISSUES_LIVE=1 T3CODE_ISSUES_LIVE_FIXTURE=30 vp test run src/issues/ src/auth/RpcAuthorization.test.ts: 28/28 (live 6, tables 13, auth 9). The live suite now also checks that a second worktree of the GitLab project counts once. Without the flag, the live suite's 6 tests skip.
    • vp test run src/components/issues/ src/components/CommandPalette.logic.test.ts: 45/45.
    • vp test run src/server.test.ts: 197/197.
    • tsc --noEmit: server, web, contracts, client-runtime and mobile all clean.
    • vp lint on every changed file: 0 errors, no warnings in new files.
    • vp fmt --check: clean.
    • vp run knip:check: pass.
    • scripts/fork-check.sh: OK (15 commits, 10 features).

    Fixture: I reopened #30 before the run; the suite left it closed as completed.

    Unverified:

    • No integrated pass in a real client, so no screenshots.
    • The fixes have not been re-reviewed.
    • Fork CI on 31d7767 was pending when I wrote this.
  3. lukemaj commented on Sep 25, 2026

    @lukemaj
    ContributorAuthor

    Handoff update: rebased onto feat/25-issues after #33

    Head: ae5ad454ca7fb7dd1dc9014d7bece5da198ba6dc (supersedes 31d7767). It is rebased onto 5e31442c and force-pushed with lease; PR #32 is MERGEABLE again.

    Conflicts: only scripts/fork-upstream-edits.txt and docs/fork-features.md, and both features' blocks are kept. No upstream path is claimed by both features:

    So no sharedFiles change was needed. Sidebar.tsx and packages/shared/package.json did not conflict. The tree differs from 31d7767 by exactly #33's diff (10 files, +612/−4).

    Results at ae5ad45:

    • Typecheck (tsc --noEmit -p tsconfig.json): server, web, shared, contracts and client-runtime all clean.
    • Live suite (T3CODE_ISSUES_LIVE=1 T3CODE_ISSUES_LIVE_FIXTURE=30 vp test run src/issues/ src/auth/RpcAuthorization.test.ts): 28/28. Fixture [test fixture] Issues live suite (disposable) #30 was reopened first and left closed as completed.
    • Sidebar: show a parent thread as working while its child threads work #31's tests: ThreadSettlementReactor.test.ts passes 58/58 with the docs/fork.md host scrub. Without it, 37 fail on macOS, which is the known host issue. SidebarChildActivity.logic.test.ts and shared childThreadActivity.test.ts pass.
    • Web (issues logic, palette logic, SidebarChildActivity): 54/54. Shared: 8/8. server.test.ts: 197/197.
    • Lint (changed files vs base): 0 errors, no warnings in new files. vp fmt --check: clean.
    • vp run knip:check: pass. scripts/fork-check.sh: OK (16 commits, 11 features).

    Unverified: fork CI on ae5ad45 was not yet observed; no integrated client pass.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions