План рефакторинга модуля Qwen Code Command
1. Определение целей
Данный план основан на единственном принципе:
- Архитектура кода может не копировать Claude Code
- Но основные функции, пользовательский опыт и взаимодействие с системой команд должны быть на 95% выровнены с Claude Code
Под “выравниванием” здесь понимаются возможность, непосредственно воспринимаемая пользователем, включая:
- Охват источников команд
- Справка и обнаруживаемость команд
- Автодополнение команд и опыт использования slash-команд в середине ввода
- Доступность в ACP / non-interactive режимах
- Возможность вызова prompt command / skill моделью
Данный рефакторинг — это не добавление нескольких полей и не мелкий ремонт существующего SlashCommand, а повышение модуля команд с “вспомогательной возможности интерактивного UI” до “унифицированной платформы команд, работающей поверх interactive / ACP / non-interactive / model”.
2. Выводы после переосмысления
Проблемы текущей системы команд Qwen заключаются не в полном отсутствии возможностей, а в следующем:
- Относительная полнота только на основном пути interactive
- Модель типов слишком “тонкая”, чтобы выдержать уровень продукта Claude
- ACP / non-interactive зависят от белого списка, что крайне плохо для расширяемости
- Источники команд хоть и существуют, но не формируют единого, видимого пользователю ментального представления
- Prompt command и система раскрытия skill модели разрознены
Поэтому новый план должен одновременно решить четыре задачи:
- Дополнить возможности Claude Code
- Сохранить инженерные преимущества унифицированной outcome-модели Qwen
- Создать унифицированную архитектуру registry / resolver / executor / adapter
- Заставить справку, автодополнение, ACP available commands и документацию использовать один и тот же набор метаданных
3. Принципы рефакторинга
3.1 Приоритет функционального выравнивания над реализационным
Допускаются различия в:
- Внутренних именах классов
- Способах разделения модулей
- Реализации исполнителя
- Структуре effect / outcome
Не допускаются различия, при которых:
- Заметно ухудшается охват источников команд
- Заметно ухудшается справка и автодополнение команд
- Заметно ухудшается доступность в ACP / non-interactive
- Заметно ухудшается интеграция prompt command с возможностями модели
При возникновении компромиссов приоритет должен быть следующим:
- Выравнивание пользовательского опыта
- Выравнивание охвата возможностей команд
- Выравнивание согласованности режимов
- Простота внутренней реализации
3.2 Сохранение унифицированной outcome-модели Qwen
Механическое копирование реализации выполнения Claude не рекомендуется.
Текущая унифицированная модель результатов Qwen все еще заслуживает сохранения, поскольку она естественно подходит для:
- Перехвата управления UI
- Утверждения/подтверждения
- Диспетчеризации tool
- Отправки prompt
- Адаптации между режимами
Но она должна быть модернизирована, чтобы нести возможности уровня команд 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)
- Подсказки по аргументам
- Сортировка по недавно использованным
- Обнаружение и автодополнение slash-команд в середине ввода
- Справка в виде каталога команд
- Полное представление 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 режиме
- Основной точки входа выполнения для большинства built-in commands
Характеристики:
- Не зависит от UI
- Должен стать основным承载ющим типом для ACP / non-interactive
local-jsx
Используется для:
- picker
- панелей
- wizard
- интерактивных UI оболочек (shell)
Характеристики:
- Обрабатывает только interactive UI
- Больше не может быть единственной точкой входа
- Должен предоставлять fallback или соответствующую local подкоманду
6. Модель источников команд
6.1 Модель внешних источников
Это модель источников, видимая пользователю, и она должна максимально соответствовать ментальной модели Claude Code:
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
Этот набор полей будет напрямую использоваться для:
- Группировки в справке
- Значка источника в автодополнении
- 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, отдельное пространство имен
7. Унифицированная архитектура выполнения
7.1 CommandRegistry
Обязанности:
- Агрегировать все загрузчики/провайдеры
- Строить многомерные индексы
- Предоставлять представления для справки, автодополнения, ACP и документации
- Предоставлять отдельные представления для команд, видимых пользователю, и команд, видимых модели
Обязательно поддерживаемые провайдеры:
BuiltinCommandLoaderBundledSkillLoaderFileCommandLoaderMcpPromptLoaderWorkflowCommandLoaderPluginCommandLoaderPluginSkillLoaderDynamicSkillProviderBuiltinPluginSkillLoader
Даже если некоторые провайдеры не будут полностью реализованы в первом выпуске, схема и API должны их поддерживать заранее.
7.2 CommandResolver
Обязанности:
- Разрешать slash command
- Разрешать alias
- Разрешать путь подкоманды
- Распознавать slash-токен в середине ввода
- Выдавать каноническую разрешенную команду
7.3 CommandExecutor
Обязанности:
- Выполнять проверку возможностей (capability check)
- Выполнять
prompt | local | local-jsx - Унифицированно создавать outcome
- Обрабатывать fallback / unsupported
7.4 ModeAdapter
Необходимо выделить три типа адаптеров:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
Только так три режима смогут использовать один и тот же registry и executor команд, а не каждый свою жестко закодированную логику.
8. Принципы рефакторинга UI-команд: разделение основных команд и интерактивной оболочки
Это ключ к реальной работоспособности ACP и non-interactive.
Все команды, которые по своей сути являются “открыть диалог”, должны быть преобразованы в:
- Интерактивную оболочку (interactive shell)
- Набор local подкоманд
Первая партия команд, подлежащих разделению
/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-команды и вызовы skill моделью используют один и тот же пул ресурсов 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-токена рядом с курсором
- Подсказка ghost text
- Завершение по Tab
- Подсветка валидных токенов команд
На первом этапе достаточно выровнять опыт ввода; можно ли внедрить более сильную “семантику встроенного выполнения команд” — решать на последующих итерациях.
10.3 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
Новый план:
- Каждая команда сама объявляет свои возможности (capability)
- 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:
- Справка
- Автодополнение
- ACP available commands
- Экспорт документации
Это необходимо для решения текущей проблемы несоответствия между “реализацией, справкой и документацией” для набора команд.
13. Этапы внедрения
Phase 1: Перестройка фундамента
Результат:
- Новый
CommandDescriptor - Полная схема источников
- Модель возможностей (capability)
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- Три типа
ModeAdapter getModelInvocablePromptCommands()
Phase 2: Миграция основных команд
Результат:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
Все эти команды должны пройти рефакторинг “interactive shell + local подкоманды”.
Phase 3: Интеграция возможностей модели
Результат:
SkillToolподключается к унифицированному представлению registry- file command / bundled skill / mcp prompt / plugin skill попадают в единый набор model-invocable
- prompt command и ресурсы skill полностью унифицированы
Phase 4: Выравнивание пользовательского опыта с Claude
Результат:
- Сортировка по недавно использованным
- Значок источника (source badge)
- Подсказка по аргументам
- Значок режима (mode badge)
- Полный каталог справки
- Опыт использования slash-команд в середине ввода
- Автоматический экспорт или проверка документации
14. Критерии приемки
После завершения должно быть выполнено как минимум:
- Справка, автодополнение, ACP и документация могут отражать полную модель источников
- За исключением чистых UI-оболочек, большинство built-in command доступны в ACP / non-interactive
- Prompt command и вызовы skill моделью используют один и тот же пул ресурсов
- Пользовательский опыт работы с командами (справка, автодополнение, отображение источника, подсказки по аргументам, опыт mid-input) достигает 95% уровня Claude Code
- Больше нет зависимости от built-in allowlist для поддержки команд в ACP / non-interactive
15. Итоговое заключение
Суть данного рефакторинга — не “добавить несколько полей в существующий SlashCommand”, а:
- Используя внутренний архитектурный стиль Qwen, предоставить платформу команд, которая на 95% выровнена по внешнему опыту с Claude Code
Если необходимо выбирать из двух вариантов:
- Внутренняя реализация больше похожа на Claude
- Внешний опыт больше похож на Claude
Данный план однозначно выбирает последнее.