План рефакторинга модуля команд Qwen Code
1. Определение целей
Данный план основан на единственном принципе:
- Архитектура кода не обязана копировать Claude Code
- Но основные функции, пользовательский опыт и интерактивность системы команд должны соответствовать Claude Code на 95%
Под «соответствием» здесь понимаются возможности, напрямую воспринимаемые пользователем, включая:
- Покрытие источников команд
- Справка по командам и их обнаруживаемость
- Автодополнение команд и опыт работы с mid-input slash command
- Доступность в режимах ACP / non-interactive
- Возможность вызова моделей через prompt command / skill
Этот рефакторинг — не просто добавление нескольких полей и не косметическая правка существующего SlashCommand. Это апгрейд модуля команд из «дополнительной функции интерактивного UI» до «единой платформы команд для interactive / ACP / non-interactive / model».
2. Выводы после пересмотра
Проблема текущей системы команд Qwen не в полном отсутствии функциональности, а в следующем:
- Полноценно работает только в основном interactive-пути
- Типизированная модель слишком упрощена и не поддерживает продуктовые возможности уровня Claude
- ACP / non-interactive зависят от белого списка, что крайне плохо масштабируется
- Источники команд существуют, но не формируют единого понятного представления для пользователя
- Разрозненность между prompt command и системой экспорта model skills
Поэтому новый план должен одновременно решить четыре задачи:
- Восполнить функциональные возможности Claude Code
- Сохранить инженерные преимущества единой модели outcome в Qwen
- Создать единую архитектуру registry / resolver / executor / adapter
- Обеспечить использование единого набора метаданных для справки, автодополнения, ACP available commands и документации
3. Принципы рефакторинга
3.1 Функциональное соответствие важнее соответствия реализации
Допускаются различия в:
- Именах внутренних классов
- Способе разделения модулей
- Реализации исполнителей (executors)
- Структуре effect / outcome
Не допускаются различия в:
- Заметном сокращении покрытия источников команд
- Заметном ухудшении опыта работы со справкой и автодополнением команд
- Заметном снижении доступности в режимах ACP / non-interactive
- Заметном ухудшении интеграции prompt command с возможностями моделей
При необходимости выбора приоритеты следующие:
- Соответствие пользовательского опыта
- Соответствие покрытия возможностей команд
- Соответствие согласованности режимов
- Простота внутренней реализации
3.2 Сохранение единой модели outcome в Qwen
Не рекомендуется механически копировать реализацию выполнения из Claude.
Текущая единая модель результатов Qwen по-прежнему заслуживает сохранения, так как она идеально подходит для:
- Управления UI
- Утверждения/подтверждения
- Диспетчеризации инструментов (tools)
- Отправки промптов
- Адаптации между режимами
Однако её необходимо обновить, чтобы она могла поддерживать возможности команд уровня Claude, а не оставаться упрощенным фреймворком UI-команд.
3.3 Полное разделение типов, источников, режимов и видимости
Новая модель команд должна как минимум разделять следующие аспекты:
- Тип: как выполняется команда
- Источник: откуда берется команда
- Возможности режимов: в каких средах выполнения доступна
- Видимость: видна пользователю или модели
4. Возможности Claude Code, требующие соответствия
4.1 Типы команд
Qwen должен явно поддерживать три типа команд:
promptlocallocal-jsx
4.2 Источники команд
Схема команд Qwen с первого этапа должна покрывать следующие источники:
- built-in commands
- bundled skills
- skill dir commands
- workflow commands
- plugin commands
- plugin skills
- dynamic skills
- mcp prompts
- mcp skills
Здесь нельзя откатываться к подходу «сначала поддержим только те, что уже есть».
4.3 Метаданные команд
Необходимо как минимум добавить следующие поля:
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 Возможности пользовательского опыта
Необходимо как минимум реализовать следующие элементы опыта:
- Автодополнение при совпадении с alias
- source badge
- Подсказки по аргументам
- Сортировка по recently used
- Обнаружение и автодополнение mid-input slash command
- Справка в виде каталога команд
- Полное представление ACP available commands
5. Новая модель команд
5.1 Базовая структура
Рекомендуется ввести единый CommandDescriptor в качестве формата регистрации для всех команд.
Он должен содержать как минимум четыре части:
identitymetadatacapabilitieshandler
identity
idnamealtNamescanonicalPath
metadata
descriptionargumentHintwhenToUseexamplesgroupsourcesourceLabeluserFacingNamehidden
capabilities
type:prompt | local | local-jsxsupportedModes:interactive | acp | non_interactiverequiresUisupportsDialogsupportsStreamingsupportsToolInvocationsupportsConfirmationremoteSafereadOnlyimmediateisSensitiveuserInvocablemodelInvocable
handler
resolveArgs()execute()completion()fallback()
5.2 Ответственность трех типов команд
prompt
Используется для:
- skills
- file commands
- workflow prompt commands
- plugin skills
- mcp prompt / skill
Особенности:
- Генерирует артефакты prompt / skill
- По умолчанию поддерживает interactive / ACP / non-interactive
- Может вызываться как пользователем, так и моделью
local
Используется для:
- Команд запросов
- Команд конфигурации
- Команд состояния, выполняемых в headless-режиме
- Основного entry point выполнения для большинства built-in commands
Особенности:
- Не зависит от UI
- Должен стать основным типом для ACP / non-interactive
local-jsx
Используется для:
- picker
- панелей
- wizard
- interactive UI shell
Особенности:
- Обрабатывает только interactive UI
- Больше не может быть единственным entry point выполнения
- Должен предоставлять fallback или соответствующую локальную подкоманду
6. Модель источников команд
6.1 Модель внешних источников
Это модель источников для пользователя, она должна максимально соответствовать ментальной модели Claude Code:
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
Этот набор полей будет напрямую использоваться для:
- Группировки в справке
- Completion source badge
- ACP available commands
- Экспорта документации
6.2 Модель внутренней нормализации
Чтобы не зависеть от внешних имен, добавим внутренний слой полей реализации:
providerTypeartifactTypeactivationModebuiltinProvidedoriginPathnamespace
Это позволит:
- Соответствовать внешнему опыту Claude
- Сохранить поддерживаемость внутренней реализации в Qwen
6.3 Стратегия разрешения конфликтов
Единое управление через стабильный id, разделение отображаемого и вводимого имени:
id: стабильный уникальный идентификаторname: основное имя для вводаuserFacingName: имя для отображения в справке/автодополнении
Рекомендуемые приоритеты при конфликтах:
- built-in
- bundled / skill-dir / workflow
- plugin / builtin-plugin
- dynamic
- mcp с отдельным namespace
7. Единая архитектура выполнения
7.1 CommandRegistry
Ответственность:
- Агрегация всех loader/provider
- Создание многомерных индексов
- Вывод представлений для справки, автодополнения, ACP и документации
- Предоставление отдельных представлений для команд, видимых пользователю, и команд, видимых модели
Обязательные для поддержки provider:
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Даже если некоторые provider не будут полностью реализованы на первом этапе, schema и API должны их поддерживать заранее.
7.2 CommandResolver
Ответственность:
- Парсинг slash command
- Парсинг alias
- Парсинг subcommand path
- Распознавание mid-input slash token
- Вывод canonical resolved command
7.3 CommandExecutor
Ответственность:
- Проверка capabilities
- Выполнение
prompt | local | local-jsx - Единая генерация outcome
- Обработка fallback / unsupported
7.4 ModeAdapter
Необходимо выделить три adapter:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Это позволит трем режимам использовать единые command registry и executor, вместо хардкода для каждого.
8. Принципы рефакторинга UI-команд: разделение ядра команды и интерактивной оболочки
Это ключевой момент для реальной доступности в ACP и non-interactive.
Все команды, которые по сути сейчас «открывают dialog», должны быть преобразованы в:
- Один interactive shell
- Набор локальных подкоманд
Первый набор команд, подлежащих разделению
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Пример целевой структуры
/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. Единый дизайн Prompt Command / Skill
Это задача P0 в рамках рефакторинга, а не дополнительная возможность.
9.1 Цель
Создать единый Model-Invocable Prompt Command Registry, объединяющий следующие артефакты в единое представление, вызываемое моделью:
- bundled skills
- file commands
- workflow prompt commands
- plugin skills
- mcp prompts / mcp skills
9.2 Ключевые поля
Обязательно добавить:
userInvocablemodelInvocableallowedToolswhenToUseargSchemaили минимальное описание параметровcontextMode: inline | forkagenteffort
9.3 Взаимосвязь с SkillTool
После рефакторинга SkillTool не должен потреблять только узкий набор skills.
Необходимо изменить на:
CommandRegistry.getModelInvocablePromptCommands()генерирует единое представлениеSkillToolили будущий единый command tool потребляет это представление- Пользовательские slash command и model skill invocation используют единый пул артефактов prompt-command
Только так Qwen сможет приблизиться к опыту Claude в обработке таких возможностей, как /review, /commit, /openspec-apply.
10. Переработка Help / Completion / Discoverability
10.1 Completion
Элементы автодополнения должны как минимум отображать:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
Сортировка должна как минимум учитывать:
- Точное совпадение
- Совпадение с alias
- Недавнее использование
- Совпадение по префиксу
- Нечеткое совпадение (fuzzy)
10.2 Mid-input slash command
Необходимо реализовать:
- Обнаружение slash token рядом с курсором
- Подсказки в ghost text
- Завершение по Tab
- Подсветка валидных command token
На первом этапе выравниваем опыт ввода; вопрос внедрения более мощной «семантики встроенного выполнения команд» можно рассмотреть в следующих итерациях.
10.3 Help
Help больше не будет плоским списком, а станет полным каталогом команд.
Минимальная группировка:
- Built-in Commands
- Bundled Skills
- Skill Dir Commands
- Workflow Commands
- Plugin Commands
- Plugin Skills
- Dynamic Skills
- Builtin Plugin Skills
- MCP Commands / MCP Skills
Для каждой команды как минимум отображать:
- Имя
- Подсказка по аргументам
- Описание
- Источник
- Поддерживаемые режимы
- Доступность для вызова моделью
- Сводка по подкомандам
11. Рефакторинг ACP / Non-Interactive
11.1 Полный отказ от подхода с белым списком
Старый подход:
- built-in allowlist
- Специальная обработка FILE / SKILL
- Остальные типы результатов unsupported
Новый подход:
- Каждая команда самостоятельно декларирует свои capabilities
- registry отвечает за фильтрацию
- adapter отвечает за выполнение и fallback
11.2 Целевые поддерживаемые 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 Вывод ACP available commands
Должен как минимум содержать:
namedescriptionargumentHintsourceexamplessupportedModesinteractiveOnlysubcommandsmodelInvocable
12. Документация, справка и автодополнение используют единые метаданные
После рефакторинга следующие элементы должны экспортироваться из одного представления registry:
- Help
- Completion
- ACP available commands
- Экспорт документации
Это решит текущую проблему «рассогласованности трех представлений команд: реализации, справки и документации».
13. Этапы реализации
Phase 1: Перестройка фундамента
Результаты:
- Новый
CommandDescriptor - Полная схема источников
- Модель capabilities
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- Три
ModeAdapter getModelInvocablePromptCommands()
Phase 2: Миграция основных команд
Результаты:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Все эти команды должны пройти рефакторинг по схеме «interactive shell + локальные подкоманды».
Phase 3: Интеграция возможностей моделей
Результаты:
- Подключение
SkillToolк единому представлению registry - Включение file command / bundled skill / mcp prompt / plugin skill в единое model-invocable множество
- Полное объединение артефактов prompt command и skill
Phase 4: Выравнивание уровня опыта с Claude
Результаты:
- Сортировка по recently used
- source badge
- argument hint
- mode badge
- Полный каталог help
- Опыт работы с mid-input slash command
- Автоматический экспорт или валидация документации
14. Критерии приемки
После завершения должны быть выполнены как минимум следующие условия:
- Help, Completion, ACP и документация должны полностью отражать модель источников
- За исключением чисто UI-оболочек, большинство built-in command должны быть доступны в ACP / non-interactive
- prompt command и вызов model skill должны использовать единый пул артефактов
- Опыт работы с командами (справка, автодополнение, отображение источников, подсказки аргументов, mid-input) должен соответствовать уровню Claude Code на 95%
- Поддержка возможностей команд в ACP / non-interactive больше не должна зависеть от built-in allowlist
15. Итоговое заключение
Суть этого рефакторинга не в том, чтобы «добавить несколько полей в существующий SlashCommand», а в следующем:
- Используя внутренний архитектурный стиль Qwen, создать платформу команд, внешний опыт которой соответствует Claude Code на 95%
Если придется выбирать между:
- Внутренней реализацией, более похожей на Claude
- Внешним опытом, более похожим на Claude
Данный план однозначно выбирает второе.