Plano de Refatoração do Módulo Command do Qwen Code
1. Definição do Objetivo
Este plano tem como única premissa os seguintes princípios:
- A arquitetura do código não precisa copiar o Claude Code
- Mas as funcionalidades principais, a experiência de uso e a interação do sistema de comandos devem estar 95% alinhadas com o Claude Code
“Alinhamento” aqui se refere às capacidades diretamente perceptíveis pelo usuário, incluindo:
- Cobertura das fontes de comando
- Ajuda e descoberta de comandos
- Autocompletar comandos e experiência de slash command no meio da entrada
- Usabilidade em ACP / modo não interativo
- Capacidade de invocação de modelo para prompt command / skill
Esta refatoração não é sobre adicionar alguns campos, nem sobre fazer pequenos ajustes no SlashCommand existente. O objetivo é atualizar o módulo de comando de uma “capacidade auxiliar da UI interativa” para uma “plataforma unificada de comandos que funciona em modo interativo, ACP, não interativo e modelo”.
2. Conclusão Após a Reescrita
O problema do sistema de comandos atual do Qwen não é uma falta total de capacidade, mas sim:
- Ele é completo apenas no caminho principal interativo
- O modelo de tipos é muito raso para suportar o nível de produto do Claude
- ACP / modo não interativo dependem de uma lista de permissões, com péssima escalabilidade
- Embora existam fontes de comando, elas não formam uma mentalidade unificada visível para o usuário
- O prompt command e o sistema de exposição de skills do modelo são separados
Portanto, o novo plano deve resolver quatro coisas simultaneamente:
- Complementar a superfície de capacidades do Claude Code
- Preservar as vantagens de engenharia do modelo de outcome unificado do Qwen
- Estabelecer uma arquitetura unificada de registry / resolver / executor / adapter
- Fazer com que ajuda, autocompletar, comandos disponíveis no ACP e documentação compartilhem o mesmo conjunto de metadados
3. Princípios da Refatoração
3.1 Priorizar o Alinhamento de Funcionalidades em vez do Alinhamento de Implementação
Diferenças são permitidas em:
- Nomes de classes internas
- Forma de divisão dos módulos
- Implementação do executor
- Estrutura de effect / outcome
Diferenças não são permitidas em:
- Cobertura de fontes de comando visivelmente reduzida
- Experiência de ajuda e autocompletar de comandos visivelmente reduzida
- Usabilidade em ACP / modo não interativo visivelmente reduzida
- Integração do prompt command com a capacidade do modelo visivelmente reduzida
Se houver trade-offs, a prioridade deve ser:
- Alinhamento da experiência do usuário
- Alinhamento da cobertura de capacidades dos comandos
- Alinhamento da consistência do modo
- Simplicidade da implementação interna
3.2 Preservar o Modelo de Outcome Unificado do Qwen
Não é recomendado copiar mecanicamente a implementação de execução do Claude.
O modelo de resultado unificado atual do Qwen ainda vale a pena ser preservado, pois ele é naturalmente adequado para:
- Assunção de controle pela UI
- Aprovação/confirmação
- Agendamento de ferramentas
- Envio de prompts
- Adaptação entre modos
Mas ele deve ser atualizado para suportar as capacidades de comando do nível do Claude, em vez de continuar sendo um framework de comando de UI simplificado.
3.3 Tipo, Fonte, Modo e Visibilidade Devem Ser Totalmente Desacoplados
O novo modelo de comando deve, no mínimo, separar as seguintes dimensões:
- Tipo: como o comando é executado
- Fonte: de onde o comando vem
- Capacidade de Modo: em quais ambientes de execução está disponível
- Visibilidade: visível para o usuário ou para o modelo
4. Superfície de Capacidades do Claude Code que Precisam ser Alinhadas
4.1 Tipos de Comando
O Qwen precisa suportar explicitamente três tipos de comando:
promptlocallocal-jsx
4.2 Fontes de Comando
O schema de comando do Qwen deve cobrir as seguintes fontes desde a primeira fase:
- Comandos internos (built-in)
- Skills empacotadas (bundled)
- Comandos do diretório de skills (skill dir)
- Comandos de workflow
- Comandos de plugin
- Skills de plugin
- Skills dinâmicas
- Prompts MCP
- Skills MCP
Não se pode voltar atrás para “suportar apenas os tipos que já existem atualmente”.
4.3 Metadados do Comando
No mínimo, complementar os seguintes campos:
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 Capacidades de Experiência
No mínimo, complementar as seguintes experiências:
- Autocompletar por alias
- Badge de origem (source badge)
- Dica de argumento
- Ordenação por uso recente
- Detecção e autocompletar de slash command no meio da entrada
- Ajuda no formato de diretório de comandos
- Expressão completa dos comandos disponíveis no ACP
5. Novo Modelo de Comando
5.1 Estrutura Central
É recomendado introduzir um CommandDescriptor unificado como formato de registro para todos os comandos.
Ele deve conter, no mínimo, quatro partes:
identitymetadatacapabilitieshandler
identity
idnamealtNamescanonicalPath
metadata
descriptionargumentHintwhenToUseexamplesgroupsourcesourceLabeluserFacingNamehidden
capabilities
type:prompt | local | local-jsxsupportedModes:interactive | acp | non_interactiverequiresUisupportsDialogsupportsStreamingsupportsToolInvocationsupportsConfirmationremoteSafereadOnlyimmediateisSensitiveuserInvocablemodelInvocable
handler
resolveArgs()execute()completion()fallback()
5.2 Responsabilidades dos Três Tipos de Comando
prompt
Usado para:
- Skills
- File commands
- Comandos prompt de workflow
- Skills de plugin
- Prompt / skill MCP
Características:
- Gera ativos de prompt / skill
- Suporta interactive / ACP / non-interactive por padrão
- Pode ser invocado pelo usuário ou pelo modelo
local
Usado para:
- Comandos de consulta
- Comandos de configuração
- Comandos de estado executáveis headless
- Ponto de entrada de execução central para a maioria dos comandos internos
Características:
- Não depende de UI
- Deve se tornar o principal tipo portador para ACP / modo não interativo
local-jsx
Usado para:
- Picker
- Painéis
- Wizard
- Shell de UI interativa
Características:
- Processa apenas UI interativa
- Não pode mais ser o único ponto de entrada de execução
- Deve fornecer um fallback ou um subcomando
localcorrespondente
6. Modelo de Fonte de Comando
6.1 Modelo de Fonte Externa
Este é o modelo de fonte mostrado ao usuário e deve ser o mais consistente possível com a mentalidade do Claude Code:
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
Este conjunto de campos será usado diretamente para:
- Agrupamento da Ajuda
- Badge de origem no autocompletar
- Comandos disponíveis no ACP
- Exportação de documentação
6.2 Modelo de Normalização Interna
Para não ficar preso aos nomes externos, adicione uma camada interna de campos de implementação:
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace
Isso permite:
- Experiência externa alinhada com o Claude
- Implementação interna mantendo a facilidade de manutenção do Qwen
6.3 Estratégia de Conflitos
Gerenciar uniformemente pelo id estável, separando o nome de exibição do nome de entrada:
id: Identificador único estávelname: Nome principal de entradauserFacingName: Nome de exibição na ajuda/autocompletar
Prioridade de conflito sugerida:
- built-in
- bundled / skill-dir / workflow
- plugin / builtin-plugin
- dynamic
- mcp (namespace independente)
7. Arquitetura de Execução Unificada
7.1 CommandRegistry
Responsabilidades:
- Agregar todos os loaders/providers
- Estabelecer um índice multidimensional
- Fornecer visões de ajuda, autocompletar, ACP e documentação
- Fornecer visões independentes de comandos visíveis para o usuário e comandos visíveis para o modelo
Providers que devem ser suportados:
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Mesmo que alguns providers não sejam totalmente implementados na primeira fase, o schema e a API devem suportá-los desde o início.
7.2 CommandResolver
Responsabilidades:
- Resolver slash commands
- Resolver aliases
- Resolver caminhos de subcomandos
- Identificar tokens de slash no meio da entrada
- Produzir o comando resolvido canônico
7.3 CommandExecutor
Responsabilidades:
- Verificar capacidades
- Executar
prompt | local | local-jsx - Produzir outcome unificado
- Lidar com fallback / não suportado
7.4 ModeAdapter
Três adapters devem ser criados:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Dessa forma, os três modos podem compartilhar o mesmo registry e executor de comando, em vez de terem implementações codificadas separadamente.
8. Princípio de Refatoração de Comandos de UI: Separação do Comando Central do Shell Interativo
Esta é a chave para que ACP e modo não interativo sejam realmente utilizáveis.
Todos os comandos cuja natureza atual é “abrir um diálogo” devem ser transformados em:
- Um shell interativo
- Um conjunto de subcomandos
local
Primeiro lote de comandos que devem ser separados
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Exemplo de Formato Alvo
/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. Design Unificado de Prompt Command / Skill
Este é o P0 da refatoração, não uma capacidade a ser adicionada depois.
9.1 Objetivo
Estabelecer um Registry de Prompt Command Invocável por Modelo unificado, combinando os seguintes ativos em uma única visão invocável pelo modelo:
- Skills empacotadas (bundled)
- File commands
- Comandos prompt de workflow
- Skills de plugin
- Prompts MCP / Skills MCP
9.2 Campos Chave
Novos campos que devem ser adicionados:
userInvocablemodelInvocableallowedToolswhenToUseargSchemaou descrição mínima de argumentocontextMode: inline | forkagenteffort
9.3 Relação com SkillTool
Após a refatoração, SkillTool não deve mais consumir apenas skills em sentido estrito.
Deve ser alterado para:
CommandRegistry.getModelInvocablePromptCommands()produz uma visão unificadaSkillToolou um futuro command tool unificado consome essa visão- O slash command do usuário e a invocação de skill pelo modelo compartilham o mesmo pool de ativos de prompt-command
Dessa forma, o Qwen pode se aproximar da experiência do Claude ao lidar com capacidades como /review, /commit, /openspec-apply.
10. Refazer Ajuda / Autocompletar / Descoberta
10.1 Autocompletar
Os itens de autocompletar devem, no mínimo, exibir:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
A ordenação deve considerar, no mínimo:
- Correspondência exata
- Correspondência por alias
- Uso recente
- Correspondência por prefixo
- Correspondência fuzzy
10.2 Slash Command no Meio da Entrada
Deve ser complementado:
- Detecção de token de slash próximo ao cursor
- Dica de texto fantasma (ghost text)
- Conclusão com Tab
- Destaque de token de comando válido
Na primeira fase, alinhar a experiência de entrada; a introdução de uma “semântica de execução de comando embutido” mais forte pode ser feita em iterações subsequentes.
10.3 Ajuda
A Ajuda não deve ser mais uma lista plana, mas um diretório completo de comandos.
No mínimo, agrupar em:
- Comandos Internos (Built-in)
- Skills Empacotadas (Bundled)
- Comandos do Diretório de Skills (Skill Dir)
- Comandos de Workflow
- Comandos de Plugin
- Skills de Plugin
- Skills Dinâmicas
- Skills de Plugin Internas (Builtin Plugin)
- Comandos MCP / Skills MCP
Cada comando deve, no mínimo, exibir:
- Nome
- Dica de argumento
- Descrição
- Origem
- Modos suportados
- Se é invocável pelo modelo
- Resumo dos subcomandos
11. Refatoração de ACP / Não Interativo
11.1 Abandonar Completamente a Abordagem de Lista de Permissões
Esquema antigo:
- Lista de permissões interna (built-in allowlist)
- Caso especial para FILE / SKILL
- Outros tipos de resultado como não suportados
Novo esquema:
- Cada comando declara sua própria capacidade
- O registry é responsável por filtrar
- O adapter é responsável por executar e fazer fallback
11.2 Suporte a Outcome por Modo
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 Saída de Comandos Disponíveis no ACP
Deve conter, no mínimo:
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable
12. Documentação, Ajuda e Autocompletar Compartilham os Mesmos Metadados
Após a refatoração, os seguintes itens devem ser exportados a partir da mesma visão do registry:
- Ajuda
- Autocompletar
- Comandos disponíveis no ACP
- Exportação de documentação
Isso resolve o problema atual de “implementação, ajuda e documentação terem superfícies de comando inconsistentes”.
13. Fases de Implementação
Fase 1: Reconstrução da Base
Entregas:
- Novo
CommandDescriptor - Schema completo de fontes
- Modelo de capabilities
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- Três
ModeAdapter getModelInvocablePromptCommands()
Fase 2: Migração de Comandos Centrais
Entregas:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Estes comandos devem ser refatorados para o formato “shell interativo + subcomando local”.
Fase 3: Integração da Capacidade do Modelo
Entregas:
SkillToolconecta-se à visão unificada do registry- File command / skill empacotada / prompt MCP / skill de plugin entram no conjunto unificado invocável pelo modelo
- Prompt command e ativos de skill são completamente unificados
Fase 4: Alinhamento da Camada de Experiência com o Claude
Entregas:
- Ordenação por uso recente
- Badge de origem (source badge)
- Dica de argumento (argument hint)
- Badge de modo (mode badge)
- Diretório de ajuda completo
- Experiência de slash command no meio da entrada
- Exportação ou validação automatizada de documentação
14. Critérios de Aceitação
Após a conclusão, deve atender, no mínimo, a:
- Ajuda, autocompletar, ACP e documentação podem expressar o modelo completo de fontes
- Exceto comandos de shell puramente de UI, a maioria dos comandos internos pode ser usada em ACP / modo não interativo
- Prompt command e invocação de skill pelo modelo usam o mesmo pool de ativos
- A experiência do comando atinge 95% do nível do Claude Code em ajuda, autocompletar, expressão de origem, dica de argumento e experiência mid-input
- Não depende mais de uma lista de permissões interna para manter as capacidades de comando em ACP / modo não interativo
15. Julgamento Final
A essência desta refatoração não é “adicionar mais alguns campos ao SlashCommand existente”, mas sim:
- Usar o estilo de arquitetura interna do Qwen para entregar uma plataforma de comando que, na experiência externa, esteja 95% alinhada com o Claude Code
Se for necessário escolher entre:
- Implementação interna mais parecida com o Claude
- Experiência externa mais parecida com o Claude
Este plano escolhe claramente a segunda opção.