Qwen Code コマンドモジュール再構築計画
1. 目標定義
本計画は、以下の原則を唯一の前提とする:
- コードアーキテクチャは Claude Code を模倣する必要はない
- ただし、コマンドシステムの中核機能、ユーザー体験、インタラクション体験は Claude Code と 95% 一致させる
ここでの「一致」とは、ユーザーが直接認識できる能力を指す:
- コマンドソースのカバレッジ
- コマンドヘルプと発見性
- コマンド補完とミッドインプットスラッシュコマンド体験
- ACP / 非対話モードの可用性
- prompt command / skill のモデル呼び出し機能
今回の再構築は、フィールドをいくつか追加したり、既存の SlashCommand を小規模に修正したりするものではない。コマンドモジュールを「インタラクティブUIの付属機能」から「インタラクティブ / ACP / 非対話 / モデルを横断する統一コマンドプラットフォーム」へとアップグレードするものである。
2. 再構築後の結論
Qwen の既存コマンドシステムの問題は、まったく能力がないわけではない。問題は以下の通り:
- インタラクティブのメインパス上でのみ比較的完成している
- 型モデルが薄すぎて、Claude レベルのプロダクト面を支えられない
- ACP / 非対話モードがホワイトリストに依存しており、拡張性が極めて低い
- コマンドソースは存在するが、ユーザーから見える統一されたメンタルモデルが形成されていない
- prompt command とモデルスキルの公開体系が分断されている
したがって、新しい計画は以下の4つを同時に解決しなければならない:
- Claude Code の能力面を補完する
- Qwen の統一 outcome モデルというエンジニアリング上の強みを維持する
- 統一された registry / resolver / executor / adapter アーキテクチャを確立する
- ヘルプ、補完、ACP available commands、ドキュメントが同じメタデータを共有する
3. 再構築の原則
3.1 機能の一致を実装の一致より優先
以下の差異は許容する:
- 内部クラス名
- モジュール分割方法
- 実行エンジンの実装
- effect / outcome の構造
以下の差異は許容しない:
- コマンドソースのカバレッジが明らかに劣る
- コマンドヘルプと補完体験が明らかに劣る
- ACP / 非対話モードの可用性が明らかに劣る
- prompt command とモデル能力の統合が明らかに劣る
トレードオフが生じた場合の優先順位は以下の通り:
- ユーザー体験の一致
- コマンド能力カバレッジの一致
- モード一貫性の一致
- 内部実装のシンプルさ
3.2 Qwen の統一 outcome モデルを維持する
Claude の実行実装を機械的にコピーすることは推奨しない。
Qwen の現行の統一結果モデルは引き続き維持する価値がある。これは以下の用途に自然に適合するためである:
- UI による制御
- 承認・確認
- ツールディスパッチ
- プロンプト提出
- モード横断的な適応
ただし、このモデルは、簡略化された UI コマンドフレームワークとしてではなく、Claude レベルのコマンド能力を支えられるようにアップグレードされなければならない。
3.3 型、ソース、モード、可視性を完全に分離する
新しいコマンドモデルでは、少なくとも以下の次元を分割する:
- 型:コマンドの実行方法
- ソース:コマンドの出自
- モード能力:どの実行環境で利用可能か
- 可視性:ユーザーから見えるか、モデルから見えるか
4. 一致させる必要がある Claude Code の能力面
4.1 コマンドの型
Qwen は以下の3種類のコマンドを明示的にサポートする必要がある:
promptlocallocal-jsx
4.2 コマンドソース
Qwen のコマンドスキーマは、最初のフェーズから以下のソースをカバーしなければならない:
- ビルトインコマンド
- バンドルスキル
- スキルディレクトリコマンド
- ワークフローコマンド
- プラグインコマンド
- プラグインスキル
- 動的スキル
- MCP プロンプト
- MCP スキル
ここで「まずは今ある種類だけサポートすればよい」という後退は許されない。
4.3 コマンドメタデータ
少なくとも以下のフィールドを追加する:
argumentHintwhenToUseexamplessourceLabeluserFacingNamealiasimmediateisSensitiveuserInvocablemodelInvocablesupportedModesrequiresUi
4.4 体験能力
少なくとも以下の体験を追加する:
- エイリアスによる補完ヒット
- ソースバッジ
- パラメータヒント
- 最近使用順の並べ替え
- ミッドインプットスラッシュコマンドの検出と補完
- コマンドディレクトリ形式のヘルプ
- ACP の available commands の完全な表現
5. 新しいコマンドモデル
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
用途:
- スキル
- ファイルコマンド
- ワークフローのプロンプトコマンド
- プラグインスキル
- MCP プロンプト / スキル
特徴:
- プロンプト / スキルアセットを生成する
- デフォルトで interactive / ACP / non-interactive をサポートする
- ユーザーからも、モデルからも呼び出せる
local
用途:
- クエリ系コマンド
- 設定系コマンド
- ヘッドレスで実行可能な状態系コマンド
- ほとんどのビルトインコマンドの中核実行エントリ
特徴:
- UI に依存しない
- ACP / 非対話モードの主要な実行タイプとなる
local-jsx
用途:
- ピッカー
- パネル
- ウィザード
- インタラクティブ UI シェル
特徴:
- インタラクティブ UI のみを処理する
- これ以上唯一の実行エントリにしてはならない
- フォールバックまたは対応する 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
責務:
- スラッシュコマンドを解析する
- エイリアスを解析する
- サブコマンドパスを解析する
- ミッドインプットのスラッシュトークンを認識する
- 正規化された解決済みコマンドを出力する
7.3 CommandExecutor
責務:
- 機能(capability)チェックを行う
prompt | local | local-jsxを実行する- 統一的に outcome を生成する
- fallback / unsupported を処理する
7.4 ModeAdapter
以下の3つのアダプタに分割する必要がある:
InteractiveModeAdapterAcpModeAdapterNonInteractiveModeAdapter
これにより、3つのモードが同じコマンドレジストリとエグゼキュータを共有でき、それぞれがハードコードされることを防ぐ。
8. UI コマンド再構築の原則:中核コマンドとインタラクティブシェルの分離
これは ACP と非対話モードを真に利用可能にするための鍵である。
現在「ダイアログを開く」ことが本質であるコマンドは、すべて以下のように改造しなければならない:
- インタラクティブシェル
- 一連の 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) を確立し、以下のアセットを1つのモデル呼び出し可能ビューに統合する:
- バンドルスキル
- ファイルコマンド
- ワークフローのプロンプトコマンド
- プラグインスキル
- MCP プロンプト / MCP スキル
9.2 重要なフィールド
新たに追加する必要があるもの:
userInvocablemodelInvocableallowedToolswhenToUseargSchemaまたは最小限のパラメータ説明contextMode: inline | forkagenteffort
9.3 SkillTool との関係
再構築後は、SkillTool が狭義のスキルだけを消費するべきではない。
以下のように変更する:
CommandRegistry.getModelInvocablePromptCommands()が統合ビューを生成するSkillToolまたは将来の統一コマンドツールがそのビューを消費する- ユーザーのスラッシュコマンドとモデルのスキル呼び出しが、同じプロンプトコマンドアセットプールを共有する
これにより、Qwen は Claude が /review、/commit、/openspec-apply などの能力を扱う方法に近い体験を提供できるようになる。
10. ヘルプ / 補完 / 発見性の再設計
10.1 補完
補完候補には少なくとも以下を表示する:
labeldescriptionargumentHintsourceBadgemodeBadgesaliasHitrecentlyUsedScore
並べ替えでは少なくとも以下を考慮する:
- 完全一致
- エイリアス一致
- 最近使用
- 前方一致
- ファジー一致
10.2 ミッドインプットスラッシュコマンド
以下の機能を追加する必要がある:
- カーソル付近のスラッシュトークン検出
- ゴーストテキストヒント
- Tab キーによる補完
- 有効なコマンドトークンのハイライト
最初のフェーズではまず入力体験を合わせることを目標とする。より強力な「インラインコマンド実行セマンティクス」の導入は、今後の反復で検討する。
10.3 ヘルプ
ヘルプは単なる一覧リストではなく、完全なコマンドディレクトリとする。
少なくとも以下のグループに分ける:
- ビルトインコマンド
- バンドルスキル
- スキルディレクトリコマンド
- ワークフローコマンド
- プラグインコマンド
- プラグインスキル
- 動的スキル
- ビルトインプラグインスキル
- MCP コマンド / MCP スキル
各コマンドには少なくとも以下を表示する:
- 名前
- パラメータヒント
- 説明
- ソース
- サポートモード
- モデル呼び出しの可否
- サブコマンドの概要
11. ACP / 非対話モードの再構築
11.1 ホワイトリストの考え方を完全に廃止する
旧方式:
- ビルトイン allowlist
- FILE / SKILL の特殊判定
- その他の結果タイプは unsupported
新方式:
- 各コマンドが自身の capability を宣言する
- registry がフィルタリングを行う
- adapter が実行とフォールバックを担当する
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. 実施フェーズ
フェーズ 1:基盤の再構築
成果物:
- 新しい
CommandDescriptor - 完全なソーススキーマ
- 機能モデル (capability model)
userInvocable / modelInvocableCommandRegistryCommandResolverCommandExecutor- 3種類の
ModeAdapter getModelInvocablePromptCommands()
フェーズ 2:中核コマンドの移行
成果物:
/model/permissions/mcp/resume/hooks/extensions/agents/approval-mode
これらのコマンドはすべて「インタラクティブシェル + local サブコマンド」への再構築を完了する必要がある。
フェーズ 3:モデル能力の連携
成果物:
SkillToolが統一 registry ビューに接続される- file command / bundled skill / mcp prompt / plugin skill が統一されたモデル呼び出し可能な集合に統合される
- prompt command とスキルアセットが完全に統一される
フェーズ 4:体験レイヤーを Claude に合わせる
成果物:
- 最近使用順の並べ替え
- ソースバッジ
- パラメータヒント
- モードバッジ
- 完全なヘルプディレクトリ
- ミッドインプットスラッシュコマンド体験
- ドキュメントの自動エクスポートまたは検証
14. 受け入れ基準
完了後、少なくとも以下を満たす:
- ヘルプ、補完、ACP、ドキュメントが完全なソースモデルを表現できる
- 純粋な UI シェルコマンドを除き、ほとんどのビルトインコマンドが ACP / 非対話モードで使用できる
- prompt command とモデルスキル呼び出しが同じアセットプールを使用する
- コマンド体験がヘルプ、補完、ソース表現、パラメータヒント、ミッドインプット体験において Claude Code の 95% レベルに達する
- ACP / 非対話モードのコマンド能力を維持するためにビルトイン allowlist に依存しなくなる
15. 最終判断
今回の再構築の本質は、「既存の SlashCommand にフィールドをいくつか追加する」ことではない。むしろ:
- Qwen の内部アーキテクチャスタイルを用いて、外部体験において Claude Code と 95% 一致するコマンドプラットフォームを提供すること
もし二者択一を迫られた場合:
- 内部実装が Claude に近い
- 外部体験が Claude に近い
本計画は明確に後者を選択する。