Skip to Content
DesignCompact ModeConception du mode compact : analyse concurrentielle et optimisation

Conception du mode compact : analyse concurrentielle et optimisation

Basculement du mode compact/verbeux via Ctrl+O — analyse concurrentielle avec Claude Code, revue de l’implémentation actuelle et recommandations d’optimisation.

Documentation utilisateur : Settings — ui.compactMode.

1. Résumé

Qwen Code et Claude Code proposent tous deux un raccourci Ctrl+O pour basculer entre les vues compacte et détaillée des sorties d’outils, mais la philosophie de conception, l’état par défaut et le modèle d’interaction diffèrent fondamentalement. Ce document propose une comparaison approfondie au niveau du code source, identifie les lacunes UX et suggère des optimisations pour Qwen Code.

DimensionClaude CodeQwen Code
Mode par défautCompact (verbose=false)Verbeux (compactMode=false)
Sémantique du basculementAperçu temporaire des détailsChangement de préférence persistant
PersistanceLimitée à la session, réinitialisée au redémarragePersistée dans settings.json
PortéeBasculement global d’écran (prompt ↔ transcript)Basculement de rendu par composant
Capture figéeAucune (concept inexistant)Aucune (supprimée)
Indice d’expansion par outilOui ("ctrl+o to expand")Oui ("Press Ctrl+O to show full tool output")

2. Analyse de l’implémentation de Claude Code

2.1 Architecture

Claude Code utilise une approche basée sur l’écran plutôt qu’un basculement de rendu au niveau des composants :

┌──────────────────────────────────┐ │ AppState (Zustand) │ │ verbose: boolean (default: false)│ │ screen: 'prompt' | 'transcript' │ └──────────┬───────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ toggles screen mode │ Handler │ NOT a rendering flag └─────┬──────┘ ┌─────▼──────────────┐ │ REPL.tsx │ │ screen='prompt' → compact view (default) │ screen='transcript'→ detailed view └────────────────────────┘

2.2 Fichiers sources clés

ComposantFichierLogique clé
Gestionnaire de basculementsrc/hooks/useGlobalKeybindings.tsx:90-132Bascule screen entre 'prompt' et 'transcript'
Raccourci claviersrc/keybindings/defaultBindings.ts:44app:toggleTranscript
Définition de l’étatsrc/state/AppStateStore.ts:472verbose: false (limité à la session)
Indice d’expansionsrc/components/CtrlOToExpand.tsx:29-46Texte "(ctrl+o to expand)" par outil
Filtre de messagessrc/components/Messages.tsx:93-151filterForBriefTool() pour la vue compacte
Autorisationsrc/components/permissions/PermissionRequest.tsxRendu dans un calque superposé, jamais masqué

2.3 Décisions de conception

  1. Le mode compact est activé par défaut. Les utilisateurs voient une interface épurée dès le départ ; les détails sont activés sur demande.
  2. Limité à la session. verbose est réinitialisé à false à chaque nouvelle session — Claude Code part du principe que les utilisateurs préfèrent généralement la vue compacte et n’ont besoin des détails que temporairement.
  3. Basculement au niveau de l’écran. Ctrl+O ne modifie pas le rendu des composants ; il bascule l’affichage entier entre un écran “prompt” (compact) et un écran “transcript” (détaillé).
  4. Aucune capture figée. Le concept de gel de capture n’existe pas. Lors du basculement, l’affichage se met à jour immédiatement avec l’état actuel.
  5. Les boîtes de dialogue d’autorisation sont séparées. Les validations d’outils sont rendues dans un calque superposé dédié, jamais affecté par le basculement verbeux/compact.
  6. Indice par outil. Le composant CtrlOToExpand affiche un indice contextuel sur les outils individuels lorsqu’ils produisent une sortie volumineuse, supprimé dans les sous-agents.

2.4 Flux utilisateur

Session start → compact mode (default) ├─ Tool outputs are summarized in a single line ├─ Large tool output shows "(ctrl+o to expand)" hint ├─ User presses Ctrl+O │ └─→ Screen switches to transcript (detailed view) │ └─ User sees all tool output, thinking, etc. ├─ User presses Ctrl+O again │ └─→ Screen switches back to prompt (compact) └─ Session ends → verbose resets to false

3. Analyse de l’implémentation de Qwen Code

3.1 Architecture

Qwen Code utilise un indicateur de rendu au niveau des composants que chaque composant UI lit depuis le contexte :

┌─────────────────────────────────────┐ │ CompactModeContext │ │ compactMode: boolean (default: false)│ │ setCompactMode: (v) => void │ └──────────┬──────────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ toggles compactMode │ Handler │ persists to settings └─────┬──────┘ ┌─────▼──────────────────┐ │ Each component reads │ │ compactMode and │ │ decides how to render │ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ ToolGroupMessage │ │ showCompact = compactMode │ │ && !hasConfirmingTool │ │ && !hasErrorTool │ │ && !isEmbeddedShellFocused │ │ && !isUserInitiated │ └────────────────────────────────────┘

3.2 Fichiers sources clés

ComposantFichierLogique clé
Gestionnaire de basculementAppContainer.tsx:1684-1690Bascule compactMode, persiste dans les paramètres
ContexteCompactModeContext.tsxcompactMode, setCompactMode
Groupe d’outilsToolGroupMessage.tsx:105-110showCompact avec 4 conditions d’expansion forcée
Message d’outilToolMessage.tsx:346-350Masque displayRenderer en mode compact
Affichage compactCompactToolGroupDisplay.tsx:49-108Résumé sur une ligne avec statut + indice
ConfirmationToolConfirmationMessage.tsx:113-147Approbation compacte simplifiée à 3 options
AstucesTips.tsx:14-29La rotation des astuces au démarrage inclut l’indice du mode compact
Synchronisation des paramètresSettingsDialog.tsx:189-193Synchronise avec CompactModeContext + refreshStatic
MainContentMainContent.tsx:60-76Rendu des pendingHistoryItems en direct
RéflexionHistoryItemDisplay.tsx:123-133Masque gemini_thought en mode compact

3.3 Décisions de conception

  1. Le mode verbeux est activé par défaut. Les utilisateurs voient toutes les sorties d’outils et la réflexion par défaut.
  2. Préférence persistante. compactMode est enregistré dans settings.json et survit aux sessions.
  3. Rendu au niveau des composants. Chaque composant lit compactMode depuis le contexte et ajuste son propre rendu.
  4. Protection par expansion forcée. Quatre conditions remplacent le mode compact pour garantir que les éléments UI critiques restent toujours visibles (confirmations, erreurs, shell, actions initiées par l’utilisateur).
  5. Aucune capture figée. Le basculement affiche toujours la sortie en direct — pas de captures figées.
  6. Synchronisation avec la boîte de dialogue des paramètres. Le basculement du mode compact depuis les paramètres met à jour l’état React immédiatement via setCompactMode.
  7. Découverte non intrusive. Le mode compact est présenté via la rotation des astuces au démarrage plutôt que par un indicateur persistant en pied de page, évitant ainsi la surcharge visuelle.

3.4 Flux utilisateur

Session start → verbose mode (default) ├─ All tool outputs, thinking, details visible ├─ User presses Ctrl+O (or toggles in Settings) │ └─→ compactMode = true, persisted │ ├─ Tool groups show single-line summary │ ├─ Thinking/thought content hidden │ └─ Confirmations, errors, shell still expanded ├─ User presses Ctrl+O again │ └─→ compactMode = false, persisted │ └─ All details visible again └─ Next session → same mode as last session

4. Analyse approfondie des différences clés

4.1 Philosophie du mode par défaut

AspectClaude Code (compact par défaut)Qwen Code (verbeux par défaut)
Première impressionÉpuré, minimal — aspect professionnelRiche en informations — transparence totale
Courbe d’apprentissageL’utilisateur doit apprendre Ctrl+O pour voir les détailsL’utilisateur peut tout voir immédiatement
Public cibleUtilisateurs expérimentés qui font confiance à l’outilUtilisateurs souhaitant comprendre ce qui se passe
Surcharge d’informationÉvitée par défautPossible pour les nouveaux utilisateurs
DécouvrabilitéIndices "(ctrl+o to expand)" par outilRotation des astuces au démarrage + raccourcis ? + /help

Analyse : Le mode compact par défaut de Claude Code fonctionne car sa base d’utilisateurs est généralement composée de développeurs expérimentés qui font confiance à l’outil et n’ont pas besoin de voir chaque invocation. Le mode verbeux par défaut de Qwen Code est adapté à son stade actuel, où la transparence est essentielle pour instaurer la confiance des utilisateurs.

4.2 Modèle de persistance

AspectClaude CodeQwen Code
Persisté ?Non — limité à la sessionOui — dans settings.json
JustificationLe mode verbeux est un aperçu temporaireLe mode est une préférence utilisateur
Comportement au redémarrageCommence toujours en mode compactCommence avec le dernier mode utilisé

Analyse : Claude Code considère la consultation des détails comme un besoin ponctuel — on regarde, puis on revient en arrière. Qwen Code le traite comme une préférence stable — certains utilisateurs veulent toujours les détails, d’autres toujours le mode compact. Les deux approches sont valides ; celle de Qwen Code est plus flexible.

4.3 Protection des confirmations

AspectClaude CodeQwen Code
MécanismeCalque superposé/modal (structurellement séparé)Conditions d’expansion forcée dans showCompact
CouvertureTotale — les validations ne peuvent jamais être masquéesTotale — 4 conditions couvrent tous les états interactifs
UI de confirmation compacteN/A (la superposition est toujours complète)RadioButtonSelect simplifié à 3 options

Analyse : La séparation architecturale de Claude Code (calque superposé) est plus robuste. L’approche par expansion forcée de Qwen Code est efficace, mais nécessite d’ajouter explicitement chaque nouvel état interactif à la liste des conditions.

4.4 Approche de rendu

AspectClaude CodeQwen Code
Portée du basculementNiveau écran (prompt ↔ transcript)Niveau composant (chaque composant décide)
GranularitéTout ou rienFine, par composant
FlexibilitéFaible — commutateur globalHaute — les composants peuvent remplacer
CohérenceGarantieDépend de l’implémentation de chaque composant

Analyse : L’approche au niveau des composants de Qwen Code est plus flexible (ex. : expansion forcée pour des conditions spécifiques) mais exige plus de rigueur pour maintenir la cohérence. L’approche au niveau de l’écran de Claude Code est plus simple et garantit un comportement uniforme.

5. Recommandations d’optimisation

5.1 [P0] Conserver le mode verbeux par défaut — Aucun changement nécessaire

Le mode verbeux par défaut de Qwen Code est la bonne décision pour son stade actuel. Les nouveaux utilisateurs ont besoin de transparence pour instaurer la confiance. À mesure que le produit mûrit, envisagez de passer au mode compact par défaut (comme Claude Code).

5.2 [P1] Expansion par outil pour les sorties volumineuses

Claude Code affiche "(ctrl+o to expand)" sur les outils individuels produisant une sortie volumineuse. Qwen Code ne dispose actuellement que d’un basculement global. Envisagez :

  • Lorsqu’un outil produit une sortie dépassant N lignes, afficher un indice “expand” par outil en mode compact.
  • Portée : amélioration future, non prioritaire actuellement.

5.3 [P2] Envisager un remplacement limité à la session

Certains utilisateurs peuvent souhaiter le mode compact par défaut, mais avoir occasionnellement besoin du mode verbeux pour une session spécifique. Envisagez de prendre en charge les deux :

  • settings.json → valeur par défaut persistante (comportement actuel)
  • Ctrl+O pendant la session → remplacement temporaire pour la session en cours uniquement (comportement de Claude Code)
  • Au redémarrage de la session → retour à la valeur de settings.json

Cela offre aux utilisateurs le meilleur des deux mondes. L’implémentation nécessiterait de séparer l’état “valeur par défaut des paramètres” de l’état “remplacement de session”.

5.4 [P2] Séparation structurelle pour les confirmations

Actuellement, la protection des confirmations repose sur les conditions showCompact dans ToolGroupMessage. Envisagez une approche plus robuste :

  • Rendre les confirmations dans un calque séparé (comme l’approche par superposition de Claude Code).
  • Cela rendrait architecturalement impossible l’impact du mode compact sur les confirmations.
  • Priorité plus faible car l’approche actuelle par expansion forcée fonctionne correctement.

6. État actuel de l’implémentation

Après les modifications de la branche feat/compact-mode-optimization :

FonctionnalitéStatutNotes
Astuce au démarrageTerminéAstuce du mode compact dans la rotation Tips (non intrusive)
Ctrl+O dans les raccourcis clavier (?)TerminéAjouté au composant KeyboardShortcuts
Ctrl+O dans /helpTerminéAjouté au composant Help
Synchronisation des paramètresTerminéSynchronise compactMode avec CompactModeContext
Aucune capture figéeTerminéLe basculement affiche toujours la sortie en direct
Protection des confirmationsTerminéExpansion forcée + garde WaitingForConfirmation
Protection du shellTerminéExpansion forcée !isEmbeddedShellFocused
Protection des erreursTerminéExpansion forcée !hasErrorTool
Documentation utilisateur mise à jourTerminésettings.md, keyboard-shortcuts.md

7. Référence des fichiers

Qwen Code

FichierObjectif
packages/cli/src/ui/AppContainer.tsxGestionnaire de basculement, initialisation de l’état, fournisseur de contexte
packages/cli/src/ui/contexts/CompactModeContext.tsxDéfinition du contexte
packages/cli/src/ui/components/messages/ToolGroupMessage.tsxLogique d’expansion forcée
packages/cli/src/ui/components/messages/ToolMessage.tsxMasquage de la sortie par outil
packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsxRendu de la vue compacte
packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsxUI de confirmation compacte
packages/cli/src/ui/components/MainContent.tsxRendu des éléments d’historique en attente
packages/cli/src/ui/components/Tips.tsxAstuce au démarrage avec indice du mode compact
packages/cli/src/ui/components/Help.tsxEntrée de raccourci /help
packages/cli/src/ui/components/KeyboardShortcuts.tsxEntrée de raccourci ?
packages/cli/src/ui/components/SettingsDialog.tsxSynchronisation des paramètres
packages/cli/src/ui/components/HistoryItemDisplay.tsxMasquage du contenu de réflexion
packages/cli/src/config/settingsSchema.tsDéfinition du paramètre
packages/cli/src/config/keyBindings.tsRaccourci Ctrl+O

Claude Code (Référence)

FichierObjectif
src/hooks/useGlobalKeybindings.tsxGestionnaire de basculement
src/state/AppStateStore.tsDéfinition de l’état (verbose: false)
src/components/CtrlOToExpand.tsxIndice d’expansion par outil
src/components/Messages.tsxFiltre de messages brefs
src/screens/REPL.tsxBasculement de mode au niveau de l’écran
src/components/permissions/PermissionRequest.tsxConfirmation basée sur une superposition
Last updated on