Plano de Refatoração do Módulo de Comandos do Qwen Code
1. Definição de Objetivos
Este plano tem como única premissa os seguintes princípios:
- A arquitetura do código não precisa ser uma cópia do Claude Code
- Mas as funcionalidades centrais, a experiência de uso e a interação do sistema de comandos devem ter 95% de alinhamento com o Claude Code
Aqui, “alinhamento” refere-se às capacidades diretamente perceptíveis pelo usuário, incluindo:
- Cobertura de origens de comando
- Help e discoverability de comandos
- Autocomplete e experiência de mid-input slash command
- Disponibilidade em ACP / non-interactive
- Capacidade de invocação de modelo para prompt command / skill
Esta refatoração não se trata apenas de adicionar alguns campos ou fazer ajustes pontuais no SlashCommand existente, mas sim de elevar o módulo de comando de uma “capacidade anexa à UI interativa” para uma “plataforma unificada de comandos para interactive / ACP / non-interactive / model”.
2. Conclusão da Reescrita
O problema do sistema de comandos atual do Qwen não é a falta total de capacidade, mas sim:
- Funciona de forma mais completa apenas no fluxo principal interactive
- O modelo de tipos é muito superficial para suportar o nível de produto do Claude
- ACP / non-interactive depende de allowlist, com péssima extensibilidade
- Embora existam origens de comando, elas não formam um entendimento unificado e visível para o usuário
- O sistema de exposição de prompt command e skill do modelo é fragmentado
Portanto, a nova proposta deve resolver simultaneamente quatro questões:
- Completar as capacidades do Claude Code
- Manter a vantagem de engenharia do modelo unificado de outcome do Qwen
- Estabelecer uma arquitetura unificada de registry / resolver / executor / adapter
- Fazer com que help, autocomplete, ACP available commands e documentação compartilhem o mesmo conjunto de metadados
3. Princípios de Refatoração
3.1 Alinhamento funcional tem prioridade sobre alinhamento de implementação
Diferenças permitidas:
- Nomes de classes internas
- Forma de divisão de módulos
- Implementação do executor
- Estrutura de effect / outcome
Diferenças não permitidas:
- Redução perceptível na cobertura de origens de comando
- Degradação perceptível na experiência de help e autocomplete
- Degradação perceptível na disponibilidade para ACP / non-interactive
- Degradação perceptível na integração entre prompt command e capacidades do modelo
Em caso de trade-off, a prioridade deve ser:
- Alinhamento da experiência do usuário
- Alinhamento da cobertura de capacidades de comando
- Alinhamento da consistência de padrões
- Simplicidade da implementação interna
3.2 Manter o modelo unificado de outcome do Qwen
Não é recomendado replicar mecanicamente a implementação de execução do Claude.
O modelo de resultado unificado atual do Qwen ainda vale a pena ser mantido, pois é naturalmente adequado para:
- Controle pela UI
- Aprovação/confirmação
- Agendamento de tool
- Submissão de prompt
- Adaptação entre modos
No entanto, ele deve ser atualizado para suportar capacidades de comando no nível do Claude, em vez de continuar existindo como um framework simplificado de comandos de UI.
3.3 Tipo, origem, modo e visibilidade devem ser completamente desacoplados
O novo modelo de comando deve, no mínimo, separar as seguintes dimensões:
- Tipo: como o comando é executado
- Origem: de onde o comando vem
- Capacidade de modo: em quais ambientes de execução está disponível
- Visibilidade: se é visível para o usuário ou para o modelo
4. Capacidades do Claude Code que Precisam de Alinhamento
4.1 Tipos de Comando
O Qwen precisa suportar explicitamente três tipos de comando:
promptlocallocal-jsx
4.2 Origens de Comando
O schema de comando do Qwen deve cobrir as seguintes origens desde a primeira fase:
- built-in commands
- bundled skills
- skill dir commands
- workflow commands
- plugin commands
- plugin skills
- dynamic skills
- mcp prompts
- mcp skills
Não podemos mais recuar para “suportar apenas as categorias já existentes”.
4.3 Metadados de Comando
Adicionar, no mínimo, os seguintes campos:
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 Capacidades de Experiência (UX)
Adicionar, no mínimo, as seguintes experiências:
- Autocomplete com hit de alias
- Source badge
- Dica de parâmetros
- Ordenação por recently used
- Detecção e autocomplete de mid-input slash command
- Help em formato de diretório de comandos
- Expressão completa de ACP available commands
5. Novo Modelo de Comando
5.1 Estrutura Central
Recomenda-se 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
- workflow prompt commands
- plugin skills
- mcp prompt / skill
Características:
- Gera assets 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 em headless
- Ponto de entrada principal de execução para a maioria dos built-in commands
Características:
- Não depende de UI
- Deve ser o tipo principal para ACP / non-interactive
local-jsx
Usado para:
- picker
- painéis
- wizard
- interactive UI shell
Características:
- Lida apenas com interactive UI
- Não pode mais ser o único ponto de entrada de execução
- Deve fornecer fallback ou um subcomando local correspondente
6. Modelo de Origem de Comando
6.1 Modelo de Origem Externa
Este é o modelo de origem visível ao usuário e deve alinhar-se ao máximo 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 no Help
- Completion source badge
- ACP available commands
- Exportação de documentação
6.2 Modelo de Normalização Interna
Para não ficarmos presos a nomenclaturas externas, adicionamos uma camada interna de campos de implementação:
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace
Isso permite:
- Alinhar a experiência externa ao Claude
- Manter a manutenibilidade interna do Qwen
6.3 Estratégia de Conflito
Gerenciamento unificado por id estável, separando nome de exibição e nome de entrada:
id: identificador único estávelname: nome principal de entradauserFacingName: nome exibido no help/autocomplete
Prioridade sugerida para conflitos:
- built-in
- bundled / skill-dir / workflow
- plugin / builtin-plugin
- dynamic
- namespace independente do mcp
7. Arquitetura de Execução Unificada
7.1 CommandRegistry
Responsabilidades:
- Agregar todos os loader/provider
- Criar índices multidimensionais
- Exportar help, autocomplete, ACP e views de documentação
- Fornecer views independentes para comandos visíveis ao usuário e ao modelo
Providers obrigatórios:
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Mesmo que alguns providers não estejam totalmente implementados na primeira versão, o schema e a API já devem suportá-los.
7.2 CommandResolver
Responsabilidades:
- Resolver slash command
- Resolver alias
- Resolver subcommand path
- Identificar mid-input slash token
- Retornar canonical resolved command
7.3 CommandExecutor
Responsabilidades:
- Realizar verificação de capability
- Executar
prompt | local | local-jsx - Gerar outcome unificado
- Tratar fallback / unsupported
7.4 ModeAdapter
É necessário separar três adapters:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Dessa forma, os três modos podem compartilhar o mesmo command registry e executor, em vez de codificarem lógicas separadas.
8. Princípios de Refatoração de Comandos de UI: Separação entre Comando Central e Shell Interativo
Este é o ponto crucial para que ACP e non-interactive funcionem de verdade.
Qualquer comando que atualmente funcione essencialmente como “abrir um dialog” deve ser refatorado para:
- Um interactive shell
- Um conjunto de subcomandos local
Primeira leva de comandos a serem separados
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Exemplo da forma 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 para Prompt Command / Skill
Esta é a prioridade P0 da refatoração, não uma capacidade a ser adicionada depois.
9.1 Objetivo
Criar um Model-Invocable Prompt Command Registry unificado, consolidando os seguintes assets em uma view invocável pelo modelo:
- bundled skills
- file commands
- workflow prompt commands
- plugin skills
- mcp prompts / mcp skills
9.2 Campos Principais
Adicionar obrigatoriamente:
userInvocablemodelInvocableallowedToolswhenToUseargSchemaou descrição mínima de parâmetroscontextMode: inline | forkagenteffort
9.3 Relação com SkillTool
Após a refatoração, o SkillTool não deve mais consumir apenas skills estritas.
A mudança deve ser:
CommandRegistry.getModelInvocablePromptCommands()gera a view unificadaSkillToolou um futuro command tool unificado consome essa view- O slash command do usuário e a invocação de skill do modelo compartilham o mesmo pool de assets de prompt-command
Isso permitirá que o Qwen se aproxime da experiência do Claude ao lidar com capacidades como /review, /commit, /openspec-apply.
10. Reformulação de Help / Completion / Discoverability
10.1 Completion
Os itens de autocomplete devem exibir, no mínimo:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
A ordenação deve considerar, no mínimo:
- Hit exato
- Hit de alias
- Uso recente
- Hit por prefixo
- Hit fuzzy
10.2 Mid-input slash command
Adicionar obrigatoriamente:
- Detecção de slash token próximo ao cursor
- Ghost text hint
- Tab completion
- Highlight de token de comando válido
Na primeira fase, alinhamos a experiência de entrada; a introdução de uma “semântica de execução de comando embutida” mais robusta pode ficar para iterações futuras.
10.3 Help
O Help não será mais uma lista plana, mas um diretório completo de comandos.
Agrupamento mínimo:
- Built-in Commands
- Bundled Skills
- Skill Dir Commands
- Workflow Commands
- Plugin Commands
- Plugin Skills
- Dynamic Skills
- Builtin Plugin Skills
- MCP Commands / MCP Skills
Cada comando deve exibir, no mínimo:
- Nome
- Dica de parâmetros
- Descrição
- Origem
- Modos suportados
- Se é invocável pelo modelo
- Resumo de subcomandos
11. Refatoração para ACP / Non-Interactive
11.1 Abandonar Completamente a Abordagem de Allowlist
Abordagem antiga:
- built-in allowlist
- Tratamento especial para FILE / SKILL
- Outros tipos de resultado como unsupported
Nova abordagem:
- Cada comando declara sua própria capability
- O registry é responsável pelo filtro
- O adapter é responsável pela execução e fallback
11.2 Objetivos de Suporte para 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 Saída de ACP available commands
Deve incluir, no mínimo:
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable
12. Documentação, Help e Completion Compartilham os Mesmos Metadados
Após a refatoração, os seguintes itens devem ser exportados a partir da mesma view do registry:
- Help
- Completion
- ACP available commands
- Exportação de documentação
Isso resolve o problema atual de “implementação, help e documentação apresentarem três faces diferentes dos comandos”.
13. Fases de Implementação
Phase 1: Reconstrução da Base
Entregas:
- Novo
CommandDescriptor - Schema completo de origens
- Modelo de capability
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- Três
ModeAdapter getModelInvocablePromptCommands()
Phase 2: Migração de Comandos Centrais
Entregas:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Esses comandos devem concluir a refatoração para “interactive shell + subcomandos local”.
Phase 3: Integração de Capacidades do Modelo
Entregas:
SkillToolconectado à view unificada do registry- file command / bundled skill / mcp prompt / plugin skill integrados ao conjunto unificado model-invocable
- Unificação completa dos assets de prompt command e skill
Phase 4: Alinhamento da Camada de Experiência ao Claude
Entregas:
- Ordenação por recently used
- Source badge
- Argument hint
- Mode badge
- Diretório completo de help
- Experiência de mid-input slash command
- Exportação ou validação automática de documentação
14. Critérios de Aceitação
Após a conclusão, deve-se atender, no mínimo:
- Help, completion, ACP e documentação devem expressar o modelo completo de origens
- Exceto comandos de shell puramente de UI, a maioria dos built-in command deve funcionar em ACP / non-interactive
- A invocação de prompt command e skill do modelo deve usar o mesmo pool de assets
- A experiência do comando deve atingir 95% do nível do Claude Code em help, completion, expressão de origem, dicas de parâmetros e experiência mid-input
- Não depender mais de built-in allowlist para manter capacidades de comando em ACP / non-interactive
15. Conclusão Final
A essência desta refatoração não é “adicionar mais alguns campos ao SlashCommand existente”, mas sim:
- Entregar uma plataforma de comandos com 95% de alinhamento na experiência externa com o Claude Code, utilizando o estilo de arquitetura interna do Qwen
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 explicitamente a segunda opção.