Skip to content

fix: 詳細ビューのマウススクロールで文字入力される不具合を修正 + レイアウト改修 - #21

Merged
takecchi merged 1 commit into
mainfrom
fix/session-detail-scroll
Jul 19, 2026
Merged

fix: 詳細ビューのマウススクロールで文字入力される不具合を修正 + レイアウト改修#21
takecchi merged 1 commit into
mainfrom
fix/session-detail-scroll

Conversation

@takecchi

Copy link
Copy Markdown
Owner

概要

セッション詳細ビューの2点を改修しました。

1. マウススクロールで文字が入力される不具合を修正(バグ修正)

詳細ビューの useInput がマウスの SGR レポートを解釈していなかったため、マウスホイールでスクロールしようとするとレポート列([<64;..M など)が生テキストとしてコンポーザへ入力されていました。

  • 一覧ビュー(session-list.tsx)と同様に、useInput の先頭で parseSgrMouse によりマウスレポートを先取り解釈するようにしました。
  • ホイール↑↓をログスクロール(新設 WHEEL_SCROLL_ROWS = 1ティックあたり ~3行)に割り当てました。press/release はログビューでは無視します。

2. 詳細ビューのレイアウト改修(コンテンツ + フッタのみ)

要件どおり、詳細ビューを「コンテンツ(スクロール可能なメッセージ/ツール履歴)+ フッタ(コメントエリア、固定)」の構成に変更しました。

  • ステータスヘッダ(タイトル / バッジ / 進捗 / コスト / エラー)を撤去し、ログの縦幅を最大化。
  • ヘッダ撤去に伴い DETAIL_CHROME_ROWS を 10 → 7 に調整(可視ログ高さ=スクロール移動量が正しくなる)。
  • スクロールは PgUp/PgDn に加えてマウスホイールでも可能に。

一覧(ホーム)はこれまでどおり ヘッダー(Banner) + コンテンツ(一覧) + フッター(コンポーザ) 構成のままです。

変更ファイル

  • src/ui/session-detail.tsx: マウス先取り解釈 + ホイールスクロール、ステータスヘッダ撤去
  • src/core/scroll.ts: WHEEL_SCROLL_ROWS を追加
  • src/core/layout.ts: DETAIL_CHROME_ROWS を 10→7
  • tests/app.test.tsx: ホイールが文字入力に漏れない回帰テストを追加 / ヘッダ撤去に追従
  • docs/ARCHITECTURE.md, .claude/rules/ink-components.md: 実装に追従

テスト計画

  • npm run typecheck
  • npm run lint 緑(既存の warning のみ)
  • npm test 全 467 テスト緑(新規のホイール回帰テスト含む)
  • 手動確認: 実端末(Ghostty 等・マウス有効)で詳細ビューをホイールスクロールしても文字が入らず、ログが遡れること
  • 手動確認: 詳細ビューにヘッダが出ず、ログが上端まで表示されること

セッション詳細の useInput がマウスの SGR レポートを解釈しておらず、
マウスホイールでスクロールしようとするとレポート列(`[<64;..M` 等)が
生テキストとしてコンポーザへ入力されていた。一覧と同じく useInput 先頭で
`parseSgrMouse` により先取り解釈し、ホイールはログスクロール(新設の
`WHEEL_SCROLL_ROWS`)に割り当てて漏れを防ぐ。

あわせて詳細ビューのレイアウトを「コンテンツ(スクロール可能なログ)+
フッタ(コンポーザ、固定)」に変更し、ステータスヘッダ(タイトル/バッジ/
進捗/コスト/エラー)を撤去してログ用の縦幅を最大化。ヘッダ撤去に伴い
`DETAIL_CHROME_ROWS` を 10→7 に調整。

- src/ui/session-detail.tsx: マウス先取り解釈 + ホイールスクロール、ヘッダ撤去
- src/core/scroll.ts: WHEEL_SCROLL_ROWS を追加
- src/core/layout.ts: DETAIL_CHROME_ROWS を調整
- tests/app.test.tsx: ホイールが文字入力に漏れない回帰テストを追加、ヘッダ撤去に追従
- docs/ARCHITECTURE.md, .claude/rules/ink-components.md: 実装に追従
@takecchi
takecchi merged commit f1d075a into main Jul 19, 2026
1 check passed
@takecchi
takecchi deleted the fix/session-detail-scroll branch July 19, 2026 10:23
takecchi added a commit that referenced this pull request Jul 19, 2026
## 概要

Completed になっていて GitHub 上に PR が出ているのに、codiva の一覧で `#n`
バッジが表示されないバグを修正する。

## 原因

セッションは `codiva/<slug>` という worktree ブランチ上で作成される。一方、実際に PR 化される作業は git
ワークフロー規約に従い **別ブランチ(`feat/…` / `fix/…` 等)を切ってから** push / PR することが多い。この場合
worktree の HEAD は `codiva/<slug>` から外れているため、PR 検出に使っている

```
gh pr view <state.branch>   # = codiva/<slug>
```

ではヒットせず、`lookupPr` が `undefined` を返し続け、`#n` バッジが**一度も**表示されなかった。

実際にマージ済みの履歴でも、ブランチ名が `codiva/…` の PR (#17#20) はバッジが出るが、`feat/…`・`fix/…`
の PR (#21#23) では出ない、という差が出ていた。

## 修正

`lookupPr` を次のように変更:

1. まず worktree の**現在の HEAD ブランチ**を `git rev-parse --abbrev-ref HEAD`
で解決し、そのブランチで `gh pr view` する(作業とPRが実際に載っているブランチ)。
2. そこで見つからなければ、従来どおり記録済みの `codiva/<slug>` ブランチにフォールバック。
3. detached HEAD(`HEAD` / 空)や `git`/`gh` の失敗時は best-effort で
`undefined`(従来挙動を維持、セッションを妨げない)。

`git` も `gh` も既存の `ExecLike` (execFile ラッパ) 経由で、引数は argv
渡し(シェル連結なし)。`refreshPrs` 側のシグネチャは不変。

## テスト計画

- [x] `src/utils/pr.spec.ts` を拡充(7 ケース)
  - HEAD ブランチで解決する / 記録ブランチにフォールバックする
  - HEAD == 記録ブランチのときは `gh` 呼び出しが1回だけ
  - git 失敗 / detached HEAD で記録ブランチを使う
  - どのブランチにも PR がない → `undefined`
  - 不正・部分 JSON → `undefined`
- [x] `npm test`(470 passed)
- [x] `npm run typecheck`
- [x] `npm run lint`(本変更ファイルは警告なし)
- [ ] 手動確認: worktree 内で `git checkout -b feat/x` → PR 作成後、一覧に `#n` が出ること
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant