Plan de refonte du module Command de Qwen Code
1. Définition des objectifs
Ce plan repose sur un seul principe fondamental :
- L’architecture du code ne doit pas nécessairement copier celle de Claude Code
- Mais les fonctionnalités principales, l’expérience d’utilisation et l’interactivité du système de commandes doivent atteindre 95 % de parité avec Claude Code
Ici, « parité » désigne les capacités directement perceptibles par l’utilisateur, notamment :
- Couverture des sources de commandes
- Aide et découvrabilité des commandes
- Complétion des commandes et expérience des
mid-input slash command - Disponibilité en mode ACP /
non-interactive - Capacité d’invocation par le modèle pour les
prompt command/skill
Cette refonte ne consiste pas à ajouter quelques champs ni à retoucher légèrement l’actuel SlashCommand. Il s’agit de faire évoluer le module command d’une « fonctionnalité annexe de l’UI interactive » vers une « plateforme de commandes unifiée pour les modes interactive / ACP / non-interactive / model ».
2. Conclusions après réécriture
Les problèmes du système command actuel de Qwen ne résident pas dans une absence totale de capacités, mais dans le fait que :
- Il n’est complet que sur le chemin principal
interactive - Le modèle de types est trop léger pour supporter un produit au niveau de Claude
- Les modes ACP /
non-interactivedépendent d’uneallowlist, ce qui limite fortement l’extensibilité - Bien que les sources de commandes existent, elles ne forment pas une vision unifiée et visible pour l’utilisateur
- Les
prompt commandet le système d’exposition desskilldu modèle sont cloisonnés
La nouvelle approche doit donc résoudre simultanément quatre points :
- Combler les écarts de fonctionnalités avec Claude Code
- Conserver les avantages techniques du modèle
outcomeunifié de Qwen - Mettre en place une architecture unifiée
registry/resolver/executor/adapter - Faire partager les mêmes métadonnées à l’aide, la complétion, les
ACP available commandset la documentation
3. Principes de refonte
3.1 La parité fonctionnelle prime sur la parité d’implémentation
Différences autorisées :
- Noms des classes internes
- Découpage des modules
- Implémentation des exécuteurs
- Structure
effect/outcome
Différences non autorisées :
- Réduction notable de la couverture des sources de commandes
- Dégradation notable de l’aide et de la complétion des commandes
- Réduction notable de la disponibilité en mode ACP /
non-interactive - Diminution notable de l’intégration entre
prompt commandet les capacités du modèle
En cas de compromis, les priorités sont les suivantes :
- Parité de l’expérience utilisateur
- Parité de la couverture des capacités de commandes
- Cohérence des modes
- Simplicité de l’implémentation interne
3.2 Conserver le modèle outcome unifié de Qwen
Il est déconseillé 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é à :
- Prise en charge par l’UI
- Approbation / confirmation
- Orchestration des
tool - Soumission de
prompt - Adaptation inter-modes
Il doit cependant être évolué pour supporter des capacités de commandes au niveau de Claude, au lieu de rester un framework de commandes UI simplifié.
3.3 Découplage strict du type, de la source, du mode et de la visibilité
Le nouveau modèle command doit au minimum séparer les dimensions suivantes :
- Type : comment la commande est exécutée
- Source : d’où provient la commande
- Capacités par 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 command de Qwen doit couvrir dès la première phase les sources suivantes :
- built-in commands
- bundled skills
- skill dir commands
- workflow commands
- plugin commands
- plugin skills
- dynamic skills
- mcp prompts
- mcp skills
Il n’est plus question de revenir à « ne supporter que les catégories déjà existantes pour commencer ».
4.3 Métadonnées des commandes
Au minimum, les champs suivants doivent être ajoutés :
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 Capacités UX
Au minimum, les expériences suivantes doivent être implémentées :
- Complétion sur correspondance d’
alias - Badge de source
- Indication des paramètres
- Tri par
recently used - Détection et complétion des
mid-input slash command - Aide sous forme de catalogue de commandes
- Expression complète des
ACP available commands
5. Nouveau modèle command
5.1 Structure principale
Il est recommandé d’introduire un CommandDescriptor unifié, servant de format d’enregistrement pour toutes les commandes.
Il doit au minimum comporter 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 :
- Génère des assets
prompt/skill - Prend en charge par défaut
interactive/ ACP /non-interactive - 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 d’exécution principal pour la plupart des
built-in commands
Caractéristiques :
- Ne dépend pas de l’UI
- Doit devenir le type principal pour ACP /
non-interactive
local-jsx
Utilisé pour :
picker- Panneaux
wizard- Shell UI
interactive
Caractéristiques :
- Gère uniquement l’UI
interactive - Ne peut plus être le seul point d’entrée d’exécution
- Doit fournir un
fallbackou des sous-commandeslocalcorrespondantes
6. Modèle de sources de commandes
6.1 Modèle de sources externes
Ce modèle de sources, destiné aux utilisateurs, doit s’aligner autant que possible sur la logique de Claude Code :
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
Ces champs seront directement utilisés pour :
- Le regroupement dans l’aide
- Le badge de source dans la complétion
- Les
ACP available commands - L’export de documentation
6.2 Modèle de normalisation interne
Pour ne pas être contraint par les noms externes, une couche supplémentaire de champs d’implémentation est ajoutée en interne :
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace
Cela permet de :
- Aligner l’expérience externe sur Claude
- Conserver la maintenabilité interne propre à Qwen
6.3 Stratégie de résolution des conflits
Gestion unifiée via un id stable, avec séparation du nom d’affichage et du nom de saisie :
id: identifiant unique stablename: nom principal de saisieuserFacingName: nom affiché dans l’aide/la complétion
Priorités recommandées en cas de conflit :
- built-in
- bundled / skill-dir / workflow
- plugin / builtin-plugin
- dynamic
namespaceMCP isolé
7. Architecture d’exécution unifiée
7.1 CommandRegistry
Responsabilités :
- Agréger tous les
loader/provider - Construire des index multidimensionnels
- Générer les vues pour l’aide, la complétion, ACP et la documentation
- Fournir des vues distinctes pour les commandes visibles par l’utilisateur et par le modèle
provider obligatoires à supporter :
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Même si certains provider ne sont pas entièrement opérationnels dès la première phase, le schéma et l’API doivent les prendre en charge dès le départ.
7.2 CommandResolver
Responsabilités :
- Résoudre les
slash command - Résoudre les
alias - Résoudre les chemins de sous-commandes
- Identifier les
mid-input slash token - Produire la commande résolue canonique
7.3 CommandExecutor
Responsabilités :
- Vérifier les
capabilities - Exécuter
prompt | local | local-jsx - Générer un
outcomeunifié - Gérer les
fallback/ cas non supportés
7.4 ModeAdapter
Trois adapter doivent être créés :
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Cela permet aux trois modes de partager le même command registry et executor, au lieu d’être codés en dur séparément.
8. Principes de refonte des commandes UI : séparation des commandes principales et du shell interactif
C’est la clé pour rendre ACP et non-interactive véritablement utilisables.
Toute commande dont la nature actuelle est « ouvrir un dialog » doit être transformée en :
- Un shell
interactive - Un ensemble de sous-commandes
local
Première vague de commandes à découpler
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Exemple de structure 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 Prompt Command / Skill
Il s’agit d’une priorité P0 dans cette refonte, et non d’une fonctionnalité à ajouter ultérieurement.
9.1 Objectif
Créer un Model-Invocable Prompt Command Registry unifié, fusionnant les assets 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
Champs obligatoires à ajouter :
userInvocablemodelInvocableallowedToolswhenToUseargSchemaou description minimale des paramètrescontextMode: inline | forkagenteffort
9.3 Relation avec SkillTool
Après la refonte, SkillTool ne doit plus consommer uniquement des skill au sens strict.
Il faut plutôt :
CommandRegistry.getModelInvocablePromptCommands()génère une vue unifiéeSkillToolou un futurcommand toolunifié consomme cette vue- Les
slash commandutilisateur et l’invocation deskillpar le modèle partagent le même pool d’assetsprompt-command
Cela permettra à Qwen de s’approcher de l’expérience offerte par Claude pour des capacités comme /review, /commit ou /openspec-apply.
10. Refonte de l’aide / de la complétion / de la découvrabilité
10.1 Completion
Les éléments de complétion doivent au minimum afficher :
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
Le tri doit au minimum prendre en compte :
- Correspondance exacte
- Correspondance d’
alias - Utilisation récente
- Correspondance par préfixe
- Correspondance
fuzzy
10.2 Mid-input slash command
Les éléments suivants doivent être implémentés :
- Détection des
slash tokenprès du curseur - Affichage du
ghost text - Validation via
Tab - Mise en surbrillance des
tokende commande valides
La première phase alignera l’expérience de saisie ; l’introduction d’une « sémantique d’exécution de commande intégrée » plus poussée pourra être envisagée lors d’itérations ultérieures.
10.3 Help
L’aide ne sera plus une simple liste à plat, mais un catalogue complet de commandes.
Regroupement minimum :
- 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 doit au minimum afficher :
- Nom
- Indication des paramètres
- Description
- Source
- Modes supportés
- Invocable par le modèle (oui/non)
- Résumé des sous-commandes
11. Refonte ACP / Non-Interactive
11.1 Abandon définitif de l’approche par allowlist
Ancienne approche :
allowlistintégrée- Cas spéciaux
FILE/SKILL - Autres types de résultats non supportés
Nouvelle approche :
- Chaque commande déclare ses propres
capabilities - Le
registrygère le filtrage - L’
adaptergère l’exécution et lefallback
11.2 Objectifs de support des outcome
interactive
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 ACP available commands
Doit au minimum inclure :
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable
12. Métadonnées partagées pour la documentation, l’aide et la complétion
Après la refonte, les éléments suivants doivent être exportés depuis une seule et même vue du registry :
- Help
- Completion
- ACP available commands
- Export de documentation
Cela vise à résoudre le problème actuel d’incohérence entre les trois représentations des commandes (implémentation, aide, documentation).
13. Phasage de l’implémentation
Phase 1 : Refonte 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
Toutes ces commandes doivent subir la refonte « shell interactive + sous-commandes local ».
Phase 3 : Intégration des capacités du modèle
Livrables :
- Intégration de
SkillToolà la vue unifiée duregistry - Inclusion des
file command/bundled skill/mcp prompt/plugin skilldans l’ensemble unifié invocable par le modèle - Unification totale des assets
prompt commandetskill
Phase 4 : Alignement de la couche UX sur Claude
Livrables :
- Tri par
recently used - Badge de source
- Indication des paramètres
- Badge de mode
- Catalogue d’aide complet
- Expérience
mid-input slash command - Export ou validation automatique de la documentation
14. Critères d’acceptation
À l’issue du projet, les critères suivants doivent être remplis :
- L’aide, la complétion, ACP et la documentation doivent toutes refléter le modèle complet des sources
- À l’exception des commandes purement UI, la plupart des
built-in commanddoivent être utilisables en mode ACP /non-interactive - Les
prompt commandet l’invocation deskillpar le modèle doivent utiliser le même pool d’assets - L’expérience des commandes doit atteindre 95 % du niveau de Claude Code en termes d’aide, de complétion, d’expression des sources, d’indication des paramètres et d’expérience
mid-input - Ne plus dépendre d’une
built-in allowlistpour maintenir les capacités de commandes en mode ACP /non-interactive
15. Verdict final
L’essence de cette refonte n’est pas « d’ajouter quelques champs à l’actuel SlashCommand », mais plutôt :
- Livrer, avec le style architectural interne de Qwen, une plateforme de commandes offrant 95 % de parité avec Claude Code sur le plan de l’expérience externe
Si un choix s’impose entre :
- Une implémentation interne plus proche de Claude
- Une expérience externe plus proche de Claude
Ce plan choisit explicitement la seconde option.