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

Conception du mode compact : analyse concurrentielle et optimisation

Ctrl+O pour basculer entre mode compact et mode verbeux — analyse concurrentielle avec Claude Code, revue de l’implémentation actuelle et recommandations d’optimisation.

Documentation utilisateur : Settings — ui.compactMode.

1. Résumé exécutif

Qwen Code et Claude Code proposent tous deux un raccourci Ctrl+O pour basculer entre une vue compacte et une vue 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 fournit une comparaison approfondie au niveau du code source, identifie les lacunes UX et propose des optimisations pour Qwen Code.

DimensionClaude CodeQwen Code
Mode par défautCompact (verbose=false)Verbeux (compactMode=false)
Sémantique du basculementAffichage temporaire des détailsChangement de préférence persistant
PersistanceLimité à la session, réinitialisé au redémarragePersisté dans settings.json
PortéeBascule globale d’écran (prompt ↔ transcript)Bascule de rendu par composant
Instantané figéAucun (concept inexistant)Aucun (supprimé)
Indice d’extension 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 composant :

┌──────────────────────────────────┐ │ AppState (Zustand) │ │ verbose: boolean (default: false)│ │ screen: 'prompt' | 'transcript' │ └──────────┬───────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ bascule le mode d'écran │ Handler │ PAS un indicateur de rendu └─────┬──────┘ ┌─────▼──────────────┐ │ REPL.tsx │ │ screen='prompt' → vue compacte (défaut) │ screen='transcript'→ vue détaillée └────────────────────┘

2.2 Fichiers source 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 d’étatsrc/state/AppStateStore.ts:472verbose: false (session uniquement)
Indice d’extensionsrc/components/CtrlOToExpand.tsx:29-46Texte « (ctrl+o to expand) » par outil
Filtre de messagessrc/components/Messages.tsx:93-151filterForBriefTool() pour la vue compacte
Permissionsrc/components/permissions/PermissionRequest.tsxRendu en couche de superposition, jamais masqué

2.3 Décisions de conception

  1. Le mode compact est le défaut. Les utilisateurs voient une interface épurée dès le départ ; l’affichage des détails est optionnel.
  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 la façon dont les composants s’affichent ; il bascule l’affichage complet entre un écran « prompt » (compact) et un écran « transcript » (détaillé).
  4. Pas d’instantané figé. Aucun concept de snapshot figé. Lors du basculement, l’affichage se met à jour immédiatement avec l’état actuel.
  5. Les dialogues de permission sont séparés. Les approbations d’outils sont rendues dans une couche de superposition dédiée qui n’est jamais affectée 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, masqué dans les sous-agents.

2.4 Parcours utilisateur

Début de session → mode compact (défaut) ├─ Les sorties d'outils sont résumées en une seule ligne ├─ Les sorties volumineuses affichent l'indice « (ctrl+o to expand) » ├─ L'utilisateur appuie sur Ctrl+O │ └─→ L'écran passe en mode transcript (vue détaillée) │ └─ L'utilisateur voit toutes les sorties, réflexions, etc. ├─ L'utilisateur appuie à nouveau sur Ctrl+O │ └─→ L'écran revient en mode prompt (compact) └─ Fin de session → verbose repasse à false

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

3.1 Architecture

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

┌─────────────────────────────────────┐ │ CompactModeContext │ │ compactMode: boolean (default: false)│ │ setCompactMode: (v) => void │ └──────────┬──────────────────────────┘ ┌─────┴──────┐ │ Ctrl+O │ bascule compactMode │ Handler │ persisté dans settings └─────┬──────┘ ┌─────▼──────────────────┐ │ Chaque composant lit │ │ compactMode et │ │ décide du rendu │ └────────────────────────┘ ┌─────▼──────────────────────────────┐ │ ToolGroupMessage │ │ showCompact = compactMode │ │ && !hasConfirmingTool │ │ && !hasErrorTool │ │ && !isEmbeddedShellFocused │ │ && !isUserInitiated │ └────────────────────────────────────┘

3.2 Fichiers source clés

ComposantFichierLogique clé
Gestionnaire de basculementAppContainer.tsx:1684-1690Bascule compactMode, persisté dans settings
ContexteCompactModeContext.tsxcompactMode, setCompactMode
Groupe d’outilsToolGroupMessage.tsx:105-110showCompact avec 4 conditions de force-expand
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 d’astuces au démarrage inclut l’indice du mode compact
Synchronisation des paramètresSettingsDialog.tsx:189-193Synchronisation avec CompactModeContext + refreshStatic
Contenu principalMainContent.tsx:60-76Affiche les pendingHistoryItems en direct
RéflexionHistoryItemDisplay.tsx:123-133Masque gemini_thought en mode compact

3.3 Décisions de conception

  1. Le mode verbeux est le défaut. Les utilisateurs voient toutes les sorties d’outils et réflexions par défaut.
  2. Préférence persistante. compactMode est sauvegardé dans settings.json et survit aux sessions.
  3. Rendu au niveau composant. Chaque composant lit compactMode depuis le contexte et ajuste son propre rendu.
  4. Protection Force-expand. Quatre conditions annulent le mode compact pour garantir que les éléments UI critiques sont toujours visibles (confirmations, erreurs, shell, actions initiées par l’utilisateur).
  5. Pas d’instantané figé. Le basculement affiche toujours la sortie en direct — pas d’instantanés figés.
  6. Synchronisation avec la boîte de dialogue des paramètres. Basculer le mode compact depuis les paramètres met à jour l’état React immédiatement via setCompactMode.
  7. Découverte non intrusive. Le mode compact est introduit via la rotation d’astuces au démarrage plutôt qu’un indicateur persistant en bas de page, évitant l’encombrement de l’interface.

3.4 Parcours utilisateur

Début de session → mode verbeux (défaut) ├─ Toutes les sorties d'outils, réflexions, détails visibles ├─ L'utilisateur appuie sur Ctrl+O (ou bascule dans les paramètres) │ └─→ compactMode = true, persisté │ ├─ Les groupes d'outils affichent un résumé sur une ligne │ ├─ Le contenu de réflexion/pensée est masqué │ └─ Les confirmations, erreurs, shell restent développés ├─ L'utilisateur appuie à nouveau sur Ctrl+O │ └─→ compactMode = false, persisté │ └─ Tous les détails sont à nouveau visibles └─ Session suivante → même mode que la dernière 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 impressionPropre, minimal — aspect professionnelRiche en informations — transparence totale
Courbe d’apprentissageL’utilisateur doit apprendre Ctrl+O pour voir les détailsL’utilisateur voit immédiatement tout
Public cibleUtilisateurs expérimentés qui font confiance à l’outilUtilisateurs qui veulent comprendre ce qui se passe
Surcharge d’informationsÉvitée par défautPossible pour les nouveaux utilisateurs
DécouverteIndices par outil « (ctrl+o to expand) »Rotation d’astuces au démarrage + ? raccourcis + /help

Analyse : Le mode compact par défaut de Claude Code fonctionne parce que 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 d’outil. Le mode verbeux par défaut de Qwen Code est approprié à son stade plus précoce où l’instauration de la confiance par la transparence est importante.

4.2 Modèle de persistance

AspectClaude CodeQwen Code
Persisté ?Non — session uniquementOui — dans settings.json
JustificationLe mode verbeux est un aperçu temporaireLe mode est une préférence utilisateur
Comportement au redémarrageToujours en mode compactDémarre avec le dernier mode utilisé

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

4.3 Protection des confirmations

AspectClaude CodeQwen Code
MécanismeCouche de superposition/modal (structurellement séparée)Conditions Force-expand dans showCompact
CouvertureComplète — les approbations ne peuvent jamais être masquéesComplète — 4 conditions couvrent tous les états interactifs
UI de confirmation compacteN/A (la superposition est toujours pleine)Sélection simplifiée à 3 options avec RadioButtonSelect

Analyse : La séparation architecturale de Claude Code (couche de superposition) est plus robuste. L’approche Force-expand de Qwen Code est efficace mais nécessite que chaque nouvel état interactif soit explicitement ajouté à 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 — bascule globaleÉlevée — les composants peuvent outrepasser
CohérenceGarantieDépend de l’implémentation de chaque composant

Analyse : L’approche au niveau composant de Qwen Code est plus flexible (par exemple, le force-expand pour des conditions spécifiques) mais nécessite plus de discipline pour maintenir la cohérence. L’approche au niveau écran de Claude Code est plus simple et garantit un comportement cohérent.

5. Recommandations d’optimisation

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

Le mode verbeux par défaut de Qwen Code est le bon choix pour son stade actuel. Les utilisateurs novices ont besoin de transparence pour établir la confiance. À mesure que le produit mature, envisagez de faire du mode compact le défaut (comme Claude Code).

5.2 [P1] Extension par outil pour les sorties volumineuses

Claude Code affiche « (ctrl+o to expand) » sur les outils individuels qui produisent une sortie volumineuse. Qwen Code n’a actuellement qu’un basculement global. Envisagez :

  • Lorsqu’un seul outil produit une sortie dépassant N lignes, afficher un indice d’extension par outil en mode compact.
  • Portée : amélioration future, pas une priorité actuelle.

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

Certains utilisateurs peuvent préférer le mode compact par défaut mais avoir besoin occasionnellement du mode verbeux pour une session spécifique. Envisagez de supporter les deux :

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

Cela offre le meilleur des deux mondes. L’implémentation nécessiterait de séparer l’état « 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 :

  • Afficher les confirmations dans une couche séparée (comme l’approche de superposition de Claude Code).
  • Cela rendrait architecturalement impossible pour le mode compact d’affecter les confirmations.
  • Priorité plus faible car l’approche actuelle de force-expand fonctionne correctement.

6. État actuel de l’implémentation

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

FonctionnalitéStatutRemarques
Indice dans les astuces de démarrageFaitAstuce du mode compact dans la rotation Tips (non intrusive)
Ctrl+O dans les raccourcis clavier (?)FaitAjouté au composant KeyboardShortcuts
Ctrl+O dans /helpFaitAjouté au composant Help
Synchronisation avec les paramètresFaitSynchronise compactMode avec CompactModeContext
Pas d’instantané figéFaitLe basculement affiche toujours la sortie en direct
Protection des confirmationsFaitForce-expand + garde WaitingForConfirmation
Protection du shellFaitForce-expand via !isEmbeddedShellFocused
Protection des erreursFaitForce-expand via !hasErrorTool
Documentation utilisateur mise à jourFaitsettings.md, keyboard-shortcuts.md

7. Référence des fichiers

Qwen Code

FichierObjectif
packages/cli/src/ui/AppContainer.tsxGestionnaire de basculement, initialisation d’état, fournisseur de contexte
packages/cli/src/ui/contexts/CompactModeContext.tsxDéfinition du contexte
packages/cli/src/ui/components/messages/ToolGroupMessage.tsxLogique Force-expand
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 de démarrage avec indice du mode compact
packages/cli/src/ui/components/Help.tsxEntrée du raccourci /help
packages/cli/src/ui/components/KeyboardShortcuts.tsxEntrée du 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.tsLiaison Ctrl+O

Claude Code (Référence)

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