Qwen Code コマンドモジュールリファクタリング案
1. 目標定義
本案は以下の原則を唯一の前提とする:
- コードアーキテクチャは Claude Code をそのまま踏襲しなくてよい
- ただし、コマンドシステムのコア機能、使用体験、インタラクション体験は Claude Code に 95% 一致させる必要がある
ここでの「一致」とは、ユーザーが直接認識できる機能を指し、以下を含む:
- コマンドソースのカバレッジ
- コマンドヘルプとディスカバビリティ
- コマンド補完と mid-input slash command の体験
- ACP / non-interactive での可用性
- prompt command / skill のモデル呼び出し機能
今回のリファクタリングは、単にフィールドをいくつか追加したり、既存の SlashCommand を微調整したりするものではない。command モジュールを「interactive UI の付属機能」から「interactive / ACP / non-interactive / model を横断する統一コマンドプラットフォーム」へアップグレードするものである。
2. 再検討後の結論
Qwen の既存 command システムの問題は、機能が全くないことではなく、以下の点にある:
- interactive のメインパスでのみ比較的完結している
- 型モデルが薄く、Claude レベルの製品面を支えられない
- ACP / non-interactive がホワイトリストに依存しており、拡張性が極めて低い
- command ソースは存在するものの、ユーザーから見て統一されたメンタルモデルが形成されていない
- prompt command とモデル skill の公開体系が分断されている
したがって、新案は以下の 4 つを同時に解決する必要がある:
- Claude Code の機能面を補完する
- Qwen の統一 outcome モデルのエンジニアリング上の優位性を維持する
- 統一された registry / resolver / executor / adapter アーキテクチャを構築する
- ヘルプ、補完、ACP available commands、ドキュメントで同一のメタデータを共有させる
3. リファクタリング原則
3.1 機能の一致は実装の一致より優先する
差異を許容するもの:
- 内部クラス名
- モジュール分割方式
- エグゼキューターの実装
- effect / outcome 構造
差異を許容しないもの:
- コマンドソースのカバレッジが明らかに低下する
- コマンドヘルプと補完体験が明らかに低下する
- ACP / non-interactive の可用性が明らかに低下する
- prompt command とモデル機能の統合が明らかに低下する
トレードオフが生じた場合の優先順位は以下の通り:
- ユーザー体験の一致
- コマンド機能カバレッジの一致
- モードの一貫性の一致
- 内部実装の簡潔さ
3.2 Qwen の統一 outcome モデルを維持する
Claude の実行実装を機械的に複製することは推奨しない。
Qwen の現在の統一結果モデルは維持する価値がある。以下の用途に本質的に適しているためである:
- UI の制御
- 承認/確認
- tool のスケジューリング
- prompt の送信
- 複数モードへの適応
ただし、簡易版 UI コマンドフレームワークとして留まるのではなく、Claude レベルの command 機能を支えられるようアップグレードする必要がある。
3.3 型、ソース、モード、可視性は完全に分離する必要がある
新しい command モデルは、少なくとも以下の次元を分離する必要がある:
- 型:コマンドの実行方法
- ソース:コマンドの提供元
- モード機能:どの実行環境で利用可能か
- 可視性:ユーザー向けかモデル向けか
4. 一致させる必要がある Claude Code の機能面
4.1 コマンド型
Qwen は以下の 3 種類のコマンドを明示的にサポートする必要がある:
promptlocallocal-jsx
4.2 コマンドソース
Qwen の command スキーマは、第 1 フェーズから以下のソースをカバーする必要がある:
- 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 の検出と補完
- コマンドディレクトリ形式の Help
- ACP available commands の完全な表現
5. 新しい command モデル
5.1 コア構造
全コマンドの登録フォーマットとして、統一された CommandDescriptor の導入を推奨する。
少なくとも以下の 4 つのパートを含む:
identitymetadatacapabilitieshandler
identity
idnamealtNamescanonicalPath
metadata
descriptionargumentHintwhenToUseexamplesgroupsourcesourceLabeluserFacingNamehidden
capabilities
type:prompt | local | local-jsxsupportedModes:interactive | acp | non_interactiverequiresUisupportsDialogsupportsStreamingsupportsToolInvocationsupportsConfirmationremoteSafereadOnlyimmediateisSensitiveuserInvocablemodelInvocable
handler
resolveArgs()execute()completion()fallback()
5.2 3 種類のコマンド型の責務
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
- interactive UI shell
特徴:
- interactive UI のみ処理する
- 唯一の実行エントリポイントであってはならない
- fallback または対応する local サブコマンドを提供する必要がある
6. コマンドソースモデル
6.1 外部ソースモデル
これはユーザー向けのソースモデルであり、Claude Code のメンタルモデルと可能な限り一致させる必要がある:
builtin-commandbundled-skillskill-dir-commandworkflow-commandplugin-commandplugin-skilldynamic-skillbuiltin-plugin-skillmcp-promptmcp-skill
このフィールド群は以下に直接使用される:
- Help のグループ化
- 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 が第 1 フェーズで完全に実装されない場合でも、スキーマと API は事前にサポートする必要がある。
7.2 CommandResolver
責務:
- slash command の解決
- alias の解決
- subcommand path の解決
- mid-input slash token の識別
- canonical resolved command の出力
7.3 CommandExecutor
責務:
- capability のチェック
prompt | local | local-jsxの実行- 統一 outcome の生成
- fallback / unsupported の処理
7.4 ModeAdapter
以下の 3 種類の adapter を分離する必要がある:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
これにより、3 つのモードがそれぞれハードコードするのではなく、同一の command registry と executor を共有できるようになる。
8. UI コマンドリファクタリング原則:コアコマンドとインタラクションシェルの分離
これは ACP と non-interactive が実際に利用可能になるための鍵である。
現在本質的に「dialog を開く」コマンドは、すべて以下にリファクタリングする必要がある:
- 1 つの interactive shell
- 一連の local サブコマンド
第 1 弾で分離必須のコマンド
/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 が狭義の skill のみを消費する構成は避けるべきである。
以下のように変更する:
CommandRegistry.getModelInvocablePromptCommands()が統一ビューを出力するSkillToolまたは将来の統一 command tool が該ビューを消費する- ユーザーの slash command とモデルの skill invocation が同一の prompt-command アセットプールを共有する
これにより、Qwen は /review、/commit、/openspec-apply といった機能に対する Claude の処理方法に体験面で近づける。
10. Help / Completion / Discoverability の再構築
10.1 Completion
補完項目は少なくとも以下を表示する必要がある:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
ソートは少なくとも以下を考慮する:
- 完全一致
- alias 一致
- 最近使用
- prefix 一致
- fuzzy 一致
10.2 Mid-input slash command
以下の補完が必須:
- カーソル付近の slash token 検出
- ghost text の表示
- Tab による確定
- 有効なコマンド token のハイライト
第 1 フェーズではまず入力体験を一致させる。「埋め込みコマンド実行セマンティクス」の導入は後続のイテレーションで検討する。
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
新案:
- 各コマンドが自身の 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 ビューからエクスポートされる必要がある:
- Help
- Completion
- ACP available commands
- ドキュメントエクスポート
これは現在の問題である「実装、ヘルプ、ドキュメントでコマンドの表現が 3 通りに分かれている」状態を解消するためである。
13. 実施フェーズ
Phase 1:基盤再構築
成果物:
- 新しい
CommandDescriptor - 完全なソーススキーマ
- capability モデル
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- 3 種類の
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 一致
成果物:
- recently used ソート
- source badge
- argument hint
- mode badge
- 完全な help ディレクトリ
- mid-input slash command 体験
- ドキュメントの自動エクスポートまたは検証
14. 受け入れ基準
完了後、少なくとも以下を満たす必要がある:
- ヘルプ、補完、ACP、ドキュメントがすべて完全なソースモデルを表現できる
- 純粋な UI シェルコマンドを除き、大多数の built-in command が ACP / non-interactive で利用可能
- prompt command とモデル skill 呼び出しが同一のアセットプールを使用
- コマンド体験がヘルプ、補完、ソース表現、パラメータヒント、mid-input 体験において Claude Code の 95% レベルに到達
- ACP / non-interactive のコマンド機能維持のために built-in allowlist に依存しない
15. 最終判断
今回のリファクタリングの本質は「既存の SlashCommand にフィールドをいくつか追加する」ことではなく、以下の通りである:
- Qwen の内部アーキテクチャスタイルを用いて、外部体験が Claude Code に 95% 一致する command プラットフォームを提供する
二者択一を迫られた場合:
- 内部実装を Claude に近づける
- 外部体験を Claude に近づける
本案は明確に後者を選択する。