Skip to content

feat(web): close and reopen an issue from its detail panel - #1424

Merged
donjor merged 1 commit into
hyprwsfrom
t3code/issues-close-reopen
Sep 30, 2026
Merged

donjor merged 1 commit into
hyprwsfrom
t3code/issues-close-reopen

Conversation

@donjor-agent

@donjor-agent donjor-agent Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

🤖 claude/anthropic claude-opus-5-5 (high)

What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

Issue state Menu items
Open Close as completed, Close as not planned
Closed Reopen issue

Server

  • RPC: new githubIssues.setState
  • CLI: gh issue close|reopen N --repo host/repo
  • Reason: --reason on a close only
  • Scope: Operate, like other write RPCs
  • Gate: new githubIssueStateChange capability
    • Older server: no state items in the menu

Client

  • Afterwards: the detail and the list re-read
  • Failure: error toast with the CLI's message
  • No confirmation: Reopen is one click away
  • Docs: user and fork guides drop "read-only"

Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

UI Changes

Before After, open issue After, closed issue
menu before menu open menu closed

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact gh arguments and the unauthenticated error.

Before: open issue, then closed issue; no state items

state-before.mp4

After: same flow; Close items on the open issue, Reopen on the closed one

state-after.mp4

Checks

tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

@donjor
donjor force-pushed the t3code/issues-close-reopen branch from da534f3 to f37ede2 Compare September 29, 2026 20:50
@donjor
donjor force-pushed the t3code/issues-close-reopen branch 2 times, most recently from 93fc111 to 629b581 Compare September 29, 2026 22:50
@donjor
donjor force-pushed the t3code/issues-close-reopen branch from 629b581 to 497360c Compare September 29, 2026 22:54
@donjor
donjor added this pull request to stack #1436 September 29, 2026 22:55
@donjor
donjor force-pushed the t3code/issues-close-reopen branch 2 times, most recently from 38d8d68 to 64b21b5 Compare September 29, 2026 23:14
@donjor
donjor force-pushed the t3code/issues-close-reopen branch 2 times, most recently from 912aa6b to a69e719 Compare September 29, 2026 23:35
@donjor
donjor force-pushed the t3code/issues-close-reopen branch 2 times, most recently from ad69e56 to 315bd78 Compare September 29, 2026 23:58
@donjor
donjor force-pushed the t3code/issues-close-reopen branch from 315bd78 to 81e3d4d Compare September 30, 2026 00:07
Base automatically changed from t3code/issues-detail-actions to hyprws September 30, 2026 00:14
@donjor
donjor force-pushed the t3code/issues-close-reopen branch 2 times, most recently from 1040612 to 349906c Compare September 30, 2026 00:23
Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
@donjor
donjor force-pushed the t3code/issues-close-reopen branch from 349906c to c44a3f6 Compare September 30, 2026 00:32
@donjor
donjor merged commit 3b7ca21 into hyprws Sep 30, 2026
9 checks passed
@donjor
donjor deleted the t3code/issues-close-reopen branch September 30, 2026 00:38
donjor added a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 2, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 3, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 4, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 6, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 6, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 6, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 6, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 8, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 8, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
donjor added a commit that referenced this pull request Oct 10, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue actions menu can close and reopen the issue, like the Pull Request panel's close.

| Issue state | Menu items |
| --- | --- |
| **Open** | Close as completed, Close as not planned |
| **Closed** | Reopen issue |

### Server

- **RPC:** new `githubIssues.setState`
- **CLI:** `gh issue close|reopen N --repo host/repo`
- **Reason:** `--reason` on a close only
- **Scope:** Operate, like other write RPCs
- **Gate:** new `githubIssueStateChange` capability
  - **Older server:** no state items in the menu

### Client

- **Afterwards:** the detail and the list re-read
- **Failure:** error toast with the CLI's message
- **No confirmation:** Reopen is one click away
- **Docs:** user and fork guides drop "read-only"

## Why

Closing an issue once the work landed meant leaving for GitHub.
The PR panel already closes its pull request in place.

## UI Changes

| Before | After, open issue | After, closed issue |
| --- | --- | --- |
| ![menu before](https://github.com/user-attachments/assets/0352e47d-3448-406b-be0b-d51983ae7b50) | ![menu open](https://github.com/user-attachments/assets/a25a6d79-0000-404a-b406-8ebd61eb3d7e) | ![menu closed](https://github.com/user-attachments/assets/2f282a5c-69fc-49a5-8e83-ef0cda63388d) |

Evidence stops at the menu: a live close would change a real issue.
Focused server tests cover the exact `gh` arguments and the unauthenticated error.

**Before:** open issue, then closed issue; no state items

https://github.com/user-attachments/assets/f020ae33-7aa6-48a8-b201-d4ef700a9816

**After:** same flow; Close items on the open issue, Reopen on the closed one

https://github.com/user-attachments/assets/fbb20f24-0573-4f99-84aa-cf11a86c7e95

## Checks

```text
tsc --noEmit (web, server, client-runtime, contracts)  → exit 0
vp test run GitHubIssueService.test.ts                 → exit 0 (15 tests)
vp test run githubIssue components + issues page       → exit 0 (52 tests)
vp lint (changed files)                                → exit 0
vp run fork:ci                                         → exit 0 (after the gate)
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1423.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no

<!-- gh-bot:edit-attest {"v":2,"repo":"RSI-Software/t3code-hyprws","ref":"t3code/issues-narrow-controls@162a045","build":"1d98cf90","agents":[{"role":"host","iface":"claude","provider":"anthropic","model":"claude-opus-5-5","effort":"high","harness":"[email protected]","session":"7bf97c33c682"}],"ts":"2026-09-29T22:50:50Z"} -->
Co-authored-by: donjor <[email protected]>
donjor pushed a commit that referenced this pull request Oct 10, 2026
> 🤖 claude/anthropic claude-opus-5-5 (high)

## What Changed

The issue list's control row wraps as two groups, not item by item.

- **Top group:** project scope and search
- **Bottom group:** filter, state, projects, order, refresh
- **Wide pane:** both groups share one line
- **Narrow pane:** controls move under the search together
- **Never:** one control stranded on its own line

## Why

Each control wrapped on its own, so the break point depended on the pane's exact width.
At 900px Refresh sat alone on a second line; at 1100px Newest and Refresh did.

## UI Changes

| Width | Before | After |
| --- | --- | --- |
| 1100 | ![1100 before](https://github.com/user-attachments/assets/352b3c5d-76a5-4398-848f-23317a335f4f) | ![1100 after](https://github.com/user-attachments/assets/ea2ccbb8-0a0a-4de4-ac13-8d28fa69c516) |
| 900 | ![900 before](https://github.com/user-attachments/assets/a973aa7e-07d8-4bb7-a363-5455db3843e3) | ![900 after](https://github.com/user-attachments/assets/076de486-1e69-4000-8a5a-fec32507a7f8) |
| 700 | ![700 before](https://github.com/user-attachments/assets/1ab08570-e02d-4ec8-a486-2f69dba2e713) | ![700 after](https://github.com/user-attachments/assets/16a080b0-450a-4392-ad8a-0fd3a07fa429) |

**Before:** window narrows from 1100 to 700

https://github.com/user-attachments/assets/79737a53-e871-41cc-bd4d-1c18339dfda8

**After:** same resize

https://github.com/user-attachments/assets/95964a45-3357-4421-951c-4ced770cd9a2

## Checks

```text
tsc --noEmit (apps/web)              → exit 0
vp test run -issuesPage.test.tsx     → exit 0 (5 tests)
vp lint _chat.issues.tsx             → exit 0
vp run fork:ci                       → exit 0
```

## Checklist

- [x] This PR is small and focused
- [x] I explained what changed and why
- [x] I included before/after screenshots for any UI changes
- [x] I included a video for animation/interaction changes

Stacked on #1424.

Opus 5.5 via Claude Code in T3 Code.

## Fork trailers

Squashes:

- 62e8eec fix(web): issue controls wrap as one group on a narrow pane (#1425) (#1425)
- ad501e5 fix(web): issue controls never strand one control on a narrow pane (#1455) (#1455)

Fork-Domain: github-issues
Fork-Tier: qol
Fork-Upstreamable: no
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant