Plan de refonte du module Qwen Code Command
1. Définition des objectifs
Ce plan repose sur l’unique principe suivant :
- L’architecture du code peut ne pas copier Claude Code
- Mais les fonctionnalités principales, l’expérience utilisateur et l’interaction du système de commandes doivent être alignées à 95 % avec Claude Code
Par « alignement », on entend les capacités directement perceptibles par l’utilisateur, notamment :
- Couverture des sources de commandes
- Aide et découvrabilité des commandes
- Autocomplétion des commandes et expérience de saisie slash en milieu de champ
- Disponibilité ACP / non interactive
- Capacité d’appel des commandes prompt / compétences (skills) par le modèle
Cette refonte ne consiste pas à ajouter quelques champs ni à bricoler l’actuel SlashCommand, mais à faire évoluer le module de commandes d’une « capacité annexe de l’interface interactive » vers une « plateforme unifiée de commandes, transverse aux modes interactif / ACP / non interactif / modèle ».
2. Conclusion après réécriture
Les problèmes du système de commandes actuel de Qwen ne sont pas une absence totale de capacités, mais :
- Une complétude seulement sur le chemin principal interactif
- Un modèle de types trop léger pour porter l’envergure produit de Claude
- Une dépendance aux listes blanches (whitelist) en ACP / non interactif, avec une extensibilité très limitée
- Des sources de commandes existantes mais sans unifier un modèle mental visible pour l’utilisateur
- Une dissociation entre les commandes prompt et l’exposition des compétences du modèle
Le nouveau plan doit donc résoudre quatre choses simultanément :
- Combler le périmètre fonctionnel de Claude Code
- Conserver l’avantage architectural du modèle de résultat unifié de Qwen
- Établir une architecture unifiée registry / resolver / executor / adapter
- Faire en sorte que l’aide, l’autocomplétion, les commandes disponibles ACP et la documentation partagent les mêmes métadonnées
3. Principes de refonte
3.1 Priorité à l’alignement fonctionnel plutôt qu’à l’alignement d’implémentation
Ce qui peut différer :
- Noms de classes internes
- Découpage des modules
- Implémentation des exécuteurs (executor)
- Structure effect / outcome
Ce qui ne peut pas différer :
- Couverture des sources de commandes sensiblement réduite
- Expérience d’aide et d’autocomplétion sensiblement dégradée
- Disponibilité ACP / non interactif sensiblement dégradée
- Intégration des commandes prompt et des capacités du modèle sensiblement réduite
En cas d’arbitrage, la priorité est :
- Alignement de l’expérience utilisateur
- Alignement de la couverture fonctionnelle des commandes
- Alignement de la cohérence des modes
- Simplicité de l’implémentation interne
3.2 Conserver le modèle de résultat unifié de Qwen
Il n’est pas recommandé de copier mécaniquement l’implémentation d’exécution de Claude.
Le modèle de résultat unifié actuel de Qwen mérite d’être conservé car il est naturellement adapté à :
- La prise en main par l’interface utilisateur (UI)
- L’approbation / confirmation
- L’orchestration des outils (tool scheduling)
- La soumission de prompts
- L’adaptation entre modes
Mais il doit être mis à niveau pour porter des capacités de commandes au niveau de Claude, et non plus rester un cadre de commandes simplifié pour l’interface utilisateur.
3.3 Découpler complètement type, source, mode et visibilité
Le nouveau modèle de commandes doit au minimum séparer les dimensions suivantes :
- Type : comment la commande s’exécute
- Source : d’où vient la commande
- Capacité de mode : dans quels environnements d’exécution elle est disponible
- Visibilité : visible pour l’utilisateur ou pour le modèle
4. Capacités de Claude Code à aligner
4.1 Types de commandes
Qwen doit prendre en charge explicitement trois types de commandes :
promptlocallocal-jsx
4.2 Sources de commandes
Le schéma de commandes de Qwen doit couvrir les sources suivantes dès la première phase :
- built-in commands
- bundled skills
- skill dir commands
- workflow commands
- plugin commands
- plugin skills
- dynamic skills
- mcp prompts
- mcp skills
Il ne faut plus reculer en disant « on ne supporte d’abord que les quelques catégories actuelles ».
4.3 Métadonnées des commandes
Au minimum, ajouter les champs suivants :
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 Capacités d’expérience
Au minimum, ajouter les expériences suivantes :
- Complétion par alias
- Badge de source
- Indication des paramètres
- Tri par utilisation récente
- Détection et complétion de slash en milieu de champ
- Aide par catalogue des commandes
- Expression complète des commandes disponibles ACP
5. Nouveau modèle de commandes
5.1 Structure centrale
Il est recommandé d’introduire un CommandDescriptor unifié, comme format d’enregistrement de toutes les commandes.
Il comprend au moins quatre parties :
identitymetadatacapabilitieshandler
identity
idnamealtNamescanonicalPath
metadata
descriptionargumentHintwhenToUseexamplesgroupsourcesourceLabeluserFacingNamehidden
capabilities
type:prompt | local | local-jsxsupportedModes:interactive | acp | non_interactiverequiresUisupportsDialogsupportsStreamingsupportsToolInvocationsupportsConfirmationremoteSafereadOnlyimmediateisSensitiveuserInvocablemodelInvocable
handler
resolveArgs()execute()completion()fallback()
5.2 Responsabilités des trois types de commandes
prompt
Utilisé pour :
- skills
- file commands
- workflow prompt commands
- plugin skills
- mcp prompt / skill
Caractéristiques :
- Produit des actifs de prompt / skill
- Supporte par défaut les modes interactif / ACP / non interactif
- Peut être invoqué par l’utilisateur ou par le modèle
local
Utilisé pour :
- Commandes de requête
- Commandes de configuration
- Commandes d’état exécutables en mode headless
- Point d’entrée principal de la plupart des commandes built-in
Caractéristiques :
- Ne dépend pas de l’interface utilisateur
- Doit devenir le principal type porteur pour l’ACP et le non interactif
local-jsx
Utilisé pour :
- Picker
- Panels
- Wizard
- Shell interactif de l’interface utilisateur
Caractéristiques :
- Ne traite que l’interface utilisateur interactive
- Ne peut plus être le seul point d’entrée d’exécution
- Doit fournir un fallback ou une sous-commande
localcorrespondante
6. Modèle de source des commandes
6.1 Modèle de source externe
C’est le modèle de source présenté à l’utilisateur, qui doit être aussi cohérent que possible avec le modèle mental de Claude Code :
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
Cet ensemble de champs sera utilisé directement pour :
- Les groupes d’aide
- Le badge de source dans l’autocomplétion
- Les commandes disponibles ACP
- L’exportation de documentation
6.2 Modèle de normalisation interne
Pour ne pas être lié par les noms externes, on ajoute une couche de champs d’implémentation en interne :
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace
Cela permet de :
- Aligner l’expérience externe sur Claude
- Conserver en interne une maintenabilité Qwen
6.3 Stratégie de conflit
Gestion unifiée par id stable, avec séparation du nom d’affichage et du nom de saisie :
id: identifiant unique stablename: nom principal de saisieuserFacingName: nom d’affichage dans l’aide / l’autocomplétion
Priorité de conflit suggérée :
- built-in
- bundled / skill-dir / workflow
- plugin / builtin-plugin
- dynamic
- mcp (namespace indépendant)
7. Architecture d’exécution unifiée
7.1 CommandRegistry
Responsabilités :
- Agréger tous les chargeurs (loader) / fournisseurs (provider)
- Construire un index multidimensionnel
- Produire les vues d’aide, d’autocomplétion, d’ACP et de documentation
- Fournir des vues séparées des commandes visibles pour l’utilisateur et des commandes visibles pour le modèle
Fournisseurs obligatoirement supportés :
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Même si certains fournisseurs ne sont pas complètement mis en œuvre dans la première phase, le schéma et l’API doivent les supporter dès le départ.
7.2 CommandResolver
Responsabilités :
- Résoudre les commandes slash
- Résoudre les alias
- Résoudre les chemins de sous-commandes
- Identifier les tokens slash en milieu de champ
- Produire une commande résolue canonique
7.3 CommandExecutor
Responsabilités :
- Effectuer les vérifications de capacité (capability)
- Exécuter
prompt | local | local-jsx - Produire un outcome unifié
- Gérer le fallback / le non supporté
7.4 ModeAdapter
Trois adaptateurs doivent être extraits :
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Ainsi, les trois modes peuvent partager le même registry et le même executor de commandes, au lieu d’avoir des implémentations codées en dur séparément.
8. Principes de refonte des commandes UI : séparation commandes principales et coquille interactive
C’est la clé pour que l’ACP et le mode non interactif soient réellement utilisables.
Toute commande qui est actuellement par essence « ouvre un dialogue » doit être transformée en :
- Un shell interactif
- Un ensemble de sous-commandes
local
Première liste de commandes à décomposer
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Exemple de forme cible
/model
/model/model show/model list/model set <id>
/permissions
/permissions/permissions show/permissions set <mode>/permissions allow <tool>/permissions deny <tool>
/mcp
/mcp/mcp list/mcp show <server>/mcp enable <server>/mcp disable <server>
9. Conception unifiée des commandes prompt / skills
C’est le P0 de la refonte, pas une capacité à ajouter après coup.
9.1 Objectif
Établir un registre unifié des commandes prompt invocables par le modèle, fusionnant les actifs suivants en une seule vue invocable par le modèle :
- bundled skills
- file commands
- workflow prompt commands
- plugin skills
- mcp prompts / mcp skills
9.2 Champs clés
À ajouter obligatoirement :
userInvocablemodelInvocableallowedToolswhenToUseargSchemaou description minimale des paramètrescontextMode: inline | forkagenteffort
9.3 Relation avec SkillTool
Après la refonte, SkillTool ne doit plus consommer uniquement les skills au sens étroit.
Il faut plutôt :
CommandRegistry.getModelInvocablePromptCommands()produit une vue unifiéeSkillTool(ou un futur outil de commande unifié) consomme cette vue- Les commandes slash de l’utilisateur et l’invocation de skills par le modèle partagent le même pool d’actifs de commandes prompt
Ainsi Qwen peut s’approcher, en termes d’expérience, de la façon dont Claude traite des commandes comme /review, /commit, /openspec-apply.
10. Refonte de l’aide / autocomplétion / découvrabilité
10.1 Autocomplétion
Les éléments d’autocomplétion doivent au moins afficher :
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
Le tri doit au moins prendre en compte :
- Correspondance exacte
- Correspondance par alias
- Utilisation récente
- Correspondance par préfixe
- Correspondance floue (fuzzy)
10.2 Slash en milieu de champ
Doit être complété :
- Détection du token slash près du curseur
- Indication de texte fantôme (ghost text)
- Complétion par Tab
- Surbrillance des tokens de commande valides
La première phase aligne d’abord l’expérience de saisie ; l’introduction d’une « sémantique d’exécution de commande intégrée » plus forte pourra être traitée dans une itération ultérieure.
10.3 Aide
L’aide n’est plus une simple liste à plat, mais un catalogue complet de commandes.
Au moins, regrouper par :
- Built-in Commands
- Bundled Skills
- Skill Dir Commands
- Workflow Commands
- Plugin Commands
- Plugin Skills
- Dynamic Skills
- Builtin Plugin Skills
- MCP Commands / MCP Skills
Chaque commande affiche au moins :
- Nom
- Indication des paramètres
- Description
- Source
- Modes supportés
- Indication si invocable par le modèle
- Résumé des sous-commandes
11. Refonte ACP / Non interactif
11.1 Abandon complet de l’approche par liste blanche
Ancienne approche :
- Liste blanche built-in
- Traitement spécial pour FILE / SKILL
- Autres types de résultat non supportés
Nouvelle approche :
- Chaque commande déclare sa propre capacité (capability)
- Le registry se charge du filtrage
- L’adaptateur (adapter) se charge de l’exécution et du fallback
11.2 Support des outcomes
interactif
submit_promptmessagestream_messagestooldialogload_historyconfirm_actionconfirm_shell_commands
acp
submit_promptmessagestream_messagestoolconfirm_actionconfirm_shell_commandsdialog fallback
non_interactive
submit_promptmessagestream_messagestoolconfirm_actionconfirm_shell_commandsdialog fallback / structured failure
11.3 Sortie des commandes disponibles ACP
Doit au minimum contenir :
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable
12. Documentation, aide, autocomplétion partagent les mêmes métadonnées
Après la refonte, les éléments suivants doivent être exportés à partir d’une même vue du registre :
- Aide
- Autocomplétion
- Commandes disponibles ACP
- Exportation de documentation
Cela résout le problème actuel où « l’implémentation, l’aide et la documentation présentent trois ensembles de commandes incohérents ».
13. Phases de mise en œuvre
Phase 1 : Reconstruction des fondations
Livrables :
- Nouveau
CommandDescriptor - Schéma complet des sources
- Modèle de capabilities
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- Trois
ModeAdapter getModelInvocablePromptCommands()
Phase 2 : Migration des commandes principales
Livrables :
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Ces commandes doivent toutes avoir été transformées en « shell interactif + sous-commandes local ».
Phase 3 : Intégration des capacités du modèle
Livrables :
SkillToolconnecté à la vue unifiée du registre- File command / bundled skill / mcp prompt / plugin skill intégrés dans un ensemble unifié invocable par le modèle
- Commandes prompt et actifs skill complètement unifiés
Phase 4 : Alignement de l’expérience sur Claude
Livrables :
- Tri par utilisation récente
- Badge de source
- Indication des paramètres (argument hint)
- Badge de mode
- Catalogue d’aide complet
- Expérience de slash en milieu de champ
- Exportation ou validation automatique de la documentation
14. Critères de validation
Après la refonte, au moins :
- L’aide, l’autocomplétion, l’ACP et la documentation expriment toutes le modèle de source complet
- À l’exception des commandes purement UI, la plupart des commandes built-in sont utilisables en ACP / non interactif
- Les commandes prompt et l’invocation de skills par le modèle utilisent le même pool d’actifs
- L’expérience des commandes (aide, autocomplétion, expression des sources, indication des paramètres, expérience de slash en milieu de champ) atteint 95 % du niveau de Claude Code
- On ne dépend plus d’une liste blanche built-in pour maintenir les capacités de commandes en ACP / non interactif
15. Conclusion finale
L’essence de cette refonte n’est pas « d’ajouter quelques champs supplémentaires au SlashCommand actuel », mais :
- Livrer, avec le style architectural interne de Qwen, une plateforme de commandes dont l’expérience externe est alignée à 95 % avec Claude Code
S’il faut choisir entre les deux :
- Implémentation interne qui ressemble plus à Claude
- Expérience externe qui ressemble plus à Claude
Ce plan choisit clairement la seconde option.