feat: Add Qwen Code support

- Add Qwen Code target for converting Claude Code plugins
- Implement claude-to-qwen converter with agent/command/skill mapping
- Write qwen-extension.json config with MCP servers and settings
- Generate QWEN.md context file with plugin documentation
- Support nested commands with colon separator (workflows:plan)
- Extract MCP environment placeholders as settings
- Add --to qwen and --qwen-home CLI options
- Document Qwen installation in README

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
Raymond Lam
2026-02-28 11:51:28 -05:00
parent 9196ed8ad8
commit e1d5bdedb3
6 changed files with 417 additions and 3 deletions

View File

@@ -25,7 +25,7 @@ export default defineCommand({
to: {
type: "string",
default: "opencode",
description: "Target format (opencode | codex | droid | cursor | pi | copilot | gemini | kiro)",
description: "Target format (opencode | codex | droid | cursor | pi | copilot | gemini | kiro | qwen)",
},
output: {
type: "string",
@@ -42,6 +42,11 @@ export default defineCommand({
alias: "pi-home",
description: "Write Pi output to this Pi root (ex: ~/.pi/agent or ./.pi)",
},
qwenHome: {
type: "string",
alias: "qwen-home",
description: "Write Qwen output to this Qwen extensions root (ex: ~/.qwen/extensions/compound-engineering)",
},
also: {
type: "string",
description: "Comma-separated extra targets to generate (ex: codex)",
@@ -84,6 +89,7 @@ export default defineCommand({
const outputRoot = resolveOutputRoot(args.output)
const codexHome = resolveTargetHome(args.codexHome, path.join(os.homedir(), ".codex"))
const piHome = resolveTargetHome(args.piHome, path.join(os.homedir(), ".pi", "agent"))
const qwenHome = resolveTargetHome(args.qwenHome, path.join(os.homedir(), ".qwen", "extensions", "compound-engineering"))
const options = {
agentMode: String(args.agentMode) === "primary" ? "primary" : "subagent",
@@ -178,6 +184,10 @@ function resolveTargetOutputRoot(
): string {
if (targetName === "codex") return codexHome
if (targetName === "pi") return piHome
if (targetName === "qwen") {
const base = hasExplicitOutput ? outputRoot : path.join(os.homedir(), ".qwen", "extensions")
return path.join(base, "compound-engineering")
}
if (targetName === "droid") return path.join(os.homedir(), ".factory")
if (targetName === "cursor") {
const base = hasExplicitOutput ? outputRoot : process.cwd()