Skip to Content
デザインCompact Modeコンパクトモード設計:競合分析と最適化

コンパクトモード設計:競合分析と最適化

Ctrl+O コンパクト/詳細モード切り替え — Claude Code との競合分析、現在の実装レビュー、最適化提案。

ユーザードキュメント: 設定 — ui.compactMode

1. エグゼクティブサマリー

Qwen Code と Claude Code はどちらも Ctrl+O ショートカットでコンパクト表示と詳細表示を切り替えられるが、設計思想、デフォルト状態、インタラクションモデルは根本的に異なる。本書ではソースレベルの詳細な比較を行い、UX のギャップを特定し、Qwen Code の最適化を提案する。

次元Claude CodeQwen Code
デフォルトモードコンパクト (verbose=false)詳細 (compactMode=false)
切り替えの意味論一時的な詳細表示(ピーク)永続的な設定切り替え
永続性セッション限定、再起動でリセットsettings.json に永続化
スコープ画面全体の切り替え(prompt ↔ transcript)コンポーネントごとのレンダリング切り替え
フローズンスナップショットなし(概念なし)なし(削除済み)
ツールごとの展開ヒントあり (“ctrl+o to expand”)あり (“Press Ctrl+O to show full tool output”)

2. Claude Code 実装分析

2.1 アーキテクチャ

Claude Code は画面ベースのアプローチを採用しており、コンポーネントレベルのレンダリング切り替えではない:

┌──────────────────────────────────┐ │ AppState (Zustand) │ │ verbose: boolean (default: false)│ │ screen: 'prompt' | 'transcript' │ └──────────┬───────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ スクリーンモードを切り替え │ Handler │ レンダリングフラグではない └─────┬──────┘ ┌─────▼──────────────┐ │ REPL.tsx │ │ screen='prompt' → コンパクト表示(デフォルト) │ screen='transcript'→ 詳細表示 └────────────────────┘

2.2 主要ソースファイル

コンポーネントファイル主要ロジック
トグルハンドラsrc/hooks/useGlobalKeybindings.tsx:90-132screen'prompt''transcript' で切り替え
キーバインディングsrc/keybindings/defaultBindings.ts:44app:toggleTranscript
状態定義src/state/AppStateStore.ts:472verbose: false(セッション限定)
展開ヒントsrc/components/CtrlOToExpand.tsx:29-46ツールごとの “(ctrl+o to expand)” テキスト
メッセージフィルタsrc/components/Messages.tsx:93-151コンパクト表示用 filterForBriefTool()
権限src/components/permissions/PermissionRequest.tsxオーバーレイレイヤーでレンダリング、常に表示

2.3 設計上の判断

  1. コンパクトがデフォルト。 ユーザーは初期状態でクリーンなインターフェースを目にし、詳細はオプトインとなる。
  2. セッションスコープ。 verbose は新しいセッションごとに false にリセットされる。Claude Code はユーザーが基本的にコンパクト表示を好み、一時的にしか詳細を必要としないと想定している。
  3. 画面レベルの切り替え。 Ctrl+O はコンポーネントのレンダリング方法を変えるのではなく、画面全体を「プロンプト」(コンパクト)と「トランスクリプト」(詳細)の間で切り替える。
  4. フローズンスナップショットはなし。 スナップショットの固定概念はない。切り替えると、現在の状態で即座に表示が更新される。
  5. 権限ダイアログは分離。 ツール承認は専用のオーバーレイレイヤーにレンダリングされ、詳細/コンパクトの切り替えの影響を受けない。
  6. ツールごとのヒント。 CtrlOToExpand コンポーネントは、個々のツールが大きな出力を生成した場合にコンテキストヒントを表示する。サブエージェントでは非表示。

2.4 ユーザーフロー

セッション開始 → コンパクトモード(デフォルト) ├─ ツール出力は1行に要約 ├─ 大きなツール出力には "(ctrl+o to expand)" ヒントを表示 ├─ ユーザーが Ctrl+O を押下 │ └─→ 画面がトランスクリプト(詳細表示)に切り替わる │ └─ すべてのツール出力、思考過程などを表示 ├─ ユーザーが再度 Ctrl+O を押下 │ └─→ 画面がプロンプト(コンパクト表示)に戻る └─ セッション終了 → verbose は false にリセット

3. Qwen Code 実装分析

3.1 アーキテクチャ

Qwen Code はコンポーネントレベルのレンダリングフラグを使用し、各 UI コンポーネントがコンテキストからフラグを読み取る:

┌─────────────────────────────────────┐ │ CompactModeContext │ │ compactMode: boolean (default: false)│ │ setCompactMode: (v) => void │ └──────────┬──────────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ compactMode を切り替え │ Handler │ settings に永続化 └─────┬──────┘ ┌─────▼──────────────────┐ │ 各コンポーネントが │ │ compactMode を読み取り │ │ レンダリング方法を決定│ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ ToolGroupMessage │ │ showCompact = compactMode │ │ && !hasConfirmingTool │ │ && !hasErrorTool │ │ && !isEmbeddedShellFocused │ │ && !isUserInitiated │ └────────────────────────────────────┘

3.2 主要ソースファイル

コンポーネントファイル主要ロジック
トグルハンドラAppContainer.tsx:1684-1690compactMode を切り替え、settings に永続化
コンテキストCompactModeContext.tsxcompactMode, setCompactMode
ツールグループToolGroupMessage.tsx:105-1104つの強制展開条件を持つ showCompact
ツールメッセージToolMessage.tsx:346-350コンパクトモードで displayRenderer を非表示
コンパクト表示CompactToolGroupDisplay.tsx:49-108ステータスとヒントを含む1行要約
確認ToolConfirmationMessage.tsx:113-147コンパクト時の3択簡略承認
ヒントTips.tsx:14-29起動時のヒントローテーションにコンパクトモードヒントを含む
設定同期SettingsDialog.tsx:189-193CompactModeContext との同期 + refreshStatic
MainContentMainContent.tsx:60-76ライブ pendingHistoryItems のレンダリング
思考過程HistoryItemDisplay.tsx:123-133コンパクトモードで gemini_thought を非表示

3.3 設計上の判断

  1. 詳細がデフォルト。 ユーザーはデフォルトですべてのツール出力と思考過程を目にする。
  2. 永続的な設定。 compactModesettings.json に保存され、セッションをまたいで維持される。
  3. コンポーネントレベルのレンダリング。 各コンポーネントが compactMode をコンテキストから読み取り、自身のレンダリングを調整する。
  4. 強制展開の保護。 4つの条件がコンパクトモードをオーバーライドし、重要な UI 要素(確認、エラー、シェル、ユーザー起因)を常に表示する。
  5. スナップショット固定なし。 切り替えは常にライブ出力を表示 — 固定スナップショットはなし。
  6. 設定ダイアログとの同期。 Settings からコンパクトモードを切り替えると、setCompactMode を介して即座に React 状態が更新される。
  7. 発見可能性は控えめ。 コンパクトモードは、永続的なフッターインジケーターではなく、起動時の Tips ローテーションで紹介され、UI の乱雑さを避ける。

3.4 ユーザーフロー

セッション開始 → 詳細モード(デフォルト) ├─ すべてのツール出力、思考過程、詳細が表示される ├─ ユーザーが Ctrl+O を押下(または Settings で切り替え) │ └─→ compactMode = true、永続化 │ ├─ ツールグループが1行要約で表示 │ ├─ 思考過程/思考内容は非表示 │ └─ 確認、エラー、シェルは展開されたまま ├─ ユーザーが再度 Ctrl+O を押下 │ └─→ compactMode = false、永続化 │ └─ すべての詳細が再表示 └─ 次回セッション → 前回と同じモード

4. 主要な違いの詳細分析

4.1 デフォルトモードの哲学

側面Claude Code(コンパクトデフォルト)Qwen Code(詳細デフォルト)
第一印象クリーンでミニマル — プロフェッショナル感情報豊富 — 完全な透明性
学習曲線ユーザーは詳細を見るために Ctrl+O を学ぶ必要ありユーザーはすぐにすべてを確認できる
ターゲットユーザーツールを信頼する経験豊富なユーザー何が起こっているかを理解したいユーザー
情報過多デフォルトで回避新規ユーザーには可能性あり
発見可能性ツールごとの “(ctrl+o to expand)” ヒント起動時 Tips ローテーション + ? ショートカット + /help

分析: Claude Code のコンパクトデフォルトは、ユーザーベースが一般的に経験豊富な開発者であり、ツールを信頼して毎回のツール呼び出しを確認する必要がないため機能している。Qwen Code の詳細デフォルトは、透明性を通じてユーザーの信頼を構築することが重要な現在の段階では適切である。

4.2 永続性モデル

側面Claude CodeQwen Code
永続化?いいえ — セッション限定はい — settings.json に保存
根拠詳細表示は一時的なピークモードはユーザーの好み
再起動時常にコンパクトで開始最後に使用したモードで開始

分析: Claude Code は詳細表示を瞬間的なニーズとして扱う — 見て、戻る。Qwen Code は安定した設定として扱う — 常に詳細を望むユーザーもいれば、常にコンパクトを望むユーザーもいる。どちらも有効だが、Qwen Code のアプローチはより柔軟である。

4.3 確認保護

側面Claude CodeQwen Code
メカニズムオーバーレイ/モーダルレイヤー(構造的に分離)showCompact 内の強制展開条件
カバレッジ完全 — 承認が非表示になることは絶対にない完全 — 4条件で対話状態すべてをカバー
コンパクト確認 UIなし(オーバーレイは常にフル表示)簡略化した3択 RadioButtonSelect

分析: Claude Code のアーキテクチャ上の分離(オーバーレイレイヤー)はより堅牢である。Qwen Code の強制展開アプローチは有効だが、新しい対話状態を追加するたびに明示的に条件リストに追加する必要がある。

4.4 レンダリングアプローチ

側面Claude CodeQwen Code
切り替え範囲画面レベル(prompt ↔ transcript)コンポーネントレベル(各コンポーネントが判断)
粒度オール・オア・ナッシングコンポーネントごとの細かい制御
柔軟性低 — グローバルスイッチ高 — コンポーネントがオーバーライド可能
一貫性保証される各コンポーネントの実装に依存

分析: Qwen Code のコンポーネントレベルアプローチはより柔軟だが(特定条件での強制展開など)、一貫性を維持するにはより多くの規律が必要。Claude Code の画面レベルアプローチはよりシンプルで、動作の一貫性が保証される。

5. 最適化の提案

5.1 [P0] 詳細デフォルトを維持 — 変更不要

Qwen Code の詳細デフォルトは、現在の段階では正しい選択である。ツールに不慣れなユーザーは透明性を通じて信頼を構築する必要がある。プロダクトが成熟するにつれて、コンパクトデフォルト(Claude Code のように)への変更を検討すべきである。

5.2 [P1] 大きな出力に対するツールごとの展開

Claude Code では、大きな出力を生成した個々のツールに “(ctrl+o to expand)” と表示される。Qwen Code は現在グローバルな切り替えしかない。以下を検討:

  • 単一のツール出力が N 行を超えた場合、コンパクトモードでツールごとに「展開」ヒントを表示する。
  • スコープ: 将来の機能拡張、現時点では優先度低。

5.3 [P2] セッションスコープの一時オーバーライドの検討

コンパクトモードをデフォルトとしたいが、特定のセッションだけ詳細を必要とするユーザーもいる。両方のサポートを検討:

  • settings.json → 永続的なデフォルト(現在の動作)
  • セッション中の Ctrl+O → 現在のセッションのみの一時オーバーライド(Claude Code の動作)
  • セッション再起動時 → settings.json の値に戻す

これにより、ユーザーは両方の利点を得られる。実装には「設定のデフォルト」と「セッションのオーバーライド」の状態を分離する必要がある。

5.4 [P2] 確認画面の構造的分離

現在、確認保護は ToolGroupMessageshowCompact 条件に依存している。より堅牢なアプローチを検討:

  • 確認画面を別レイヤーにレンダリングする(Claude Code のオーバーレイアプローチのように)。
  • これにより、アーキテクチャ上、コンパクトモードが確認画面に影響を与えることが不可能になる。
  • 現在の強制展開アプローチが正しく機能しているため、優先度は低い。

6. 現在の実装状況

feat/compact-mode-optimization ブランチの変更後:

機能状態備考
起動時 Tips ヒント完了Tips ローテーションにコンパクトモードヒント(控えめ)
キーボードショートカット (?) の Ctrl+O完了KeyboardShortcuts コンポーネントに追加
/help の Ctrl+O完了Help コンポーネントに追加
設定ダイアログの同期完了compactMode を CompactModeContext と同期
スナップショット固定なし完了切り替えは常にライブ出力を表示
確認保護完了強制展開 + WaitingForConfirmation ガード
シェル保護完了!isEmbeddedShellFocused による強制展開
エラー保護完了!hasErrorTool による強制展開
ユーザードキュメント更新完了settings.md, keyboard-shortcuts.md

7. ファイル参照

Qwen Code

ファイル目的
packages/cli/src/ui/AppContainer.tsxトグルハンドラ、状態初期化、コンテキストプロバイダ
packages/cli/src/ui/contexts/CompactModeContext.tsxコンテキスト定義
packages/cli/src/ui/components/messages/ToolGroupMessage.tsx強制展開ロジック
packages/cli/src/ui/components/messages/ToolMessage.tsxツールごとの出力非表示
packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsxコンパクト表示レンダリング
packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsxコンパクト確認 UI
packages/cli/src/ui/components/MainContent.tsx保留中の履歴アイテムのレンダリング
packages/cli/src/ui/components/Tips.tsxコンパクトモードヒントを含む起動時 Tips
packages/cli/src/ui/components/Help.tsx/help ショートカットエントリ
packages/cli/src/ui/components/KeyboardShortcuts.tsx? ショートカットエントリ
packages/cli/src/ui/components/SettingsDialog.tsx設定同期
packages/cli/src/ui/components/HistoryItemDisplay.tsx思考内容の非表示
packages/cli/src/config/settingsSchema.ts設定定義
packages/cli/src/config/keyBindings.tsCtrl+O バインディング

Claude Code(参考)

ファイル目的
src/hooks/useGlobalKeybindings.tsxトグルハンドラ
src/state/AppStateStore.ts状態定義 (verbose: false)
src/components/CtrlOToExpand.tsxツールごとの展開ヒント
src/components/Messages.tsx簡略メッセージフィルタ
src/screens/REPL.tsx画面レベルのモード切り替え
src/components/permissions/PermissionRequest.tsxオーバーレイベースの確認
Last updated on