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

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

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

ユーザー向けドキュメント: Settings — ui.compactMode

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

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

項目Claude CodeQwen Code
デフォルトモードコンパクト (verbose=false)詳細 (compactMode=false)
切り替えのセマンティクス詳細の一時的な表示永続的な設定の切り替え
永続化セッションのみ(再起動でリセット)settings.json に保存
スコープグローバル画面切り替え(プロンプト ↔ トランスクリプト)コンポーネント単位のレンダリング切り替え
フローズンスナップショットなし(概念なし)なし(削除済み)
ツール単位の展開ヒントあり (“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 │ 設定に永続化 └─────┬──────┘ ┌─────▼──────────────────┐ │ 各コンポーネントが │ │ compactMode を読み取り │ │ レンダリング方法を決定 │ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ ToolGroupMessage │ │ showCompact = compactMode │ │ && !hasConfirmingTool │ │ && !hasErrorTool │ │ && !isEmbeddedShellFocused │ │ && !isUserInitiated │ └────────────────────────────────────┘

3.2 主要ソースファイル

コンポーネントファイル主要ロジック
切り替えハンドラAppContainer.tsx:1684-1690compactMode を切り替え、設定に永続化
コンテキスト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. 強制展開による保護。 重要なUI要素が常に表示されるよう、コンパクトモードを上書きする4つの条件が設定されています(確認、エラー、シェル、ユーザー操作)。
  5. スナップショットの固定なし。 切り替えは常にライブ出力を表示し、固定されたスナップショットは使用しません。
  6. 設定ダイアログとの同期。 設定からコンパクトモードを切り替えると、setCompactMode を介して React の状態が即座に更新されます。
  7. 邪魔にならない発見性。 コンパクトモードは永続的なフッターインジケーターではなく、起動時の Tips ローテーションで紹介され、UI の混雑を回避しています。

3.4 ユーザーフロー

セッション開始 → 詳細モード(デフォルト) ├─ すべてのツール出力、思考、詳細が表示される ├─ ユーザーが Ctrl+O を押す(または設定で切り替え) │ └─→ 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
切り替えスコープ画面レベル(プロンプト ↔ トランスクリプト)コンポーネントレベル(各コンポーネントが決定)
粒度一括切り替えコンポーネント単位で細かく制御
柔軟性低い — グローバルスイッチ高い — コンポーネントが上書き可能
一貫性保証される各コンポーネントの実装に依存

分析: 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] 確認ダイアログの構造的な分離

現在、確認ダイアログの保護は ToolGroupMessage 内の showCompact 条件に依存しています。より堅牢なアプローチを検討してください:

  • 確認ダイアログを別のレイヤーでレンダリングする(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