fix(qwen): translate Claude Code tool names so Qwen grants Read, Write and Bash (#965)

From @Hotragn. 17 agents list Claude Code tool names (Read, Write, Bash...). Qwen Code resolves subagent tools by exact name or display name, so those three matched nothing and were never granted. Traced in Qwen Code 0.24.7: resolveToolNames preserves unknown names, and getTool() is a plain lookup with no alias translation. Now mapped to read_file, write_file and run_shell_command; other names pass through unchanged. The manifest moves exactly those 17 agents.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hotragn PettuganiandClaude Opus 5.5 authored and GitHub committed 2026-10-01 14:35:39 -05:00
1 parent 33e8e55f3b
commit d3f71c4bb8
4 files changed
+107 -18

No files matched your search

+17 -17
View File
@@ -4,7 +4,7 @@ agent 3d-scene-developer cb46371b7ee6fa5fabfc5da1094a2b1a552e4adc1a76fcd44b604c2
agent accessibility-auditor f797a3000f39d0c91a1722c5e4004a6db7f1d665fd069ea9e8c16be32c9c8a13
agent account-strategist 474bd07c750f87c202f214dab515ab7fb9c82394c62b9d5752902d5eb7fbd8a2
agent accounts-payable-agent 5079310c10346460332645bdcaea34a303a8ee9e9092cbba930c1c9602bda3d3
agent ad-creative-strategist e288208090b93e5d5d9cb63412788b14f0c9aee796f8513458abb5496ff4b27f
agent ad-creative-strategist a314100345062626ecd88fc4ebd2131b56406096e830a43ce3c5303b462d4612
agent aeo-foundations-architect 79ccfd346753474f96948eea314909ce92f689ff1f54029092f90f676f6da3e8
agent agentic-identity-trust-architect 5d1e0cd0780d0e4abb26e4bb411d214594b579c0978c5cb308b37464af4feec3
agent agentic-search-optimizer 56a49834d0e57b564a5028fb829a45629f82ed3e55370e5e5ce73e1c121d7257
@@ -50,7 +50,7 @@ agent code-reviewer 43a29ff0f7e96405412d84c8a655f1f9947bdd2d26182ed579cedd8d2deb
agent codebase-archaeologist 56ffbf032397192d0b2c047a32c729b79214e056468f2de8812f4d598d6967cf
agent codebase-onboarding-engineer 8d198ea7a5a808f649a5639b9dc6c26645fad84e70ce0704913ef5567654114c
agent compliance-auditor 1450d2afbe550085a202a98691724754eb5f195b8368c2444ed3b809f63822e7
agent content-creator 8e8d47865b9b4900dcc4875bc70480a768aa98c62b4538910aa5e670e0646381
agent content-creator 5b6b8c80e048966c9d05d6c7acbc29709ecfbbffbaae8ad53d72b1b13f901488
agent corporate-training-designer 28a05ff37668dbd2cf871478dac2092b9830ab09d704f648da2bf84634f24447
agent cross-border-e-commerce-specialist ea88d02fad3ef352fd3ae2a7b2a725ee5e2c22779edcc1b444aeafd7f014e23a
agent cultural-intelligence-strategist a2fcfd37a164bc8aef96eb048f527498392322222f6d6b1f9864ced20c993ff5
@@ -84,7 +84,7 @@ agent evidence-collector 56f713c696453f6e631a34dff50f82e1b7d81b609602ba8943ace59
agent executive-summary-generator b4a4ceb9ba860e223076a0144df62b8a25a4528b948e06020185e93c264e240a
agent experiment-tracker c5d3f07b835b7e2e10aad874ede6e7a3cc365d1700aa70794014758dd9738865
agent fedramp-rmf-compliance-engineer 48b72603d607cb425e0a2f25246e1d5c3a308c02a48289122bb546a5366c57eb
agent feedback-synthesizer e885f486a7c1dd17c4ec94263fae9a7b10021ec2ea31dccccc7ac2219f75a822
agent feedback-synthesizer f61d9ddca6f8e4ffcf6470f6f007495f758b5ed54d02daef2d8da5d6d0284e81
agent feishu-integration-developer d59f8216b2de9409013b93934e43ad763e743303f3f783510cc8b2694549c7b2
agent filament-optimization-specialist 11cabb3ba1f5325078e9d6871f6e40f32af94ca6c91cadbc494b2606a8b511ab
agent finance-tracker d82f098a2cf90fdcb42743bcac76416b379b7b8f5255a4643fb7c04f7b2cef6f
@@ -109,7 +109,7 @@ agent godot-multiplayer-engineer 3ef11d3a5cae9f42f12210f0737cac0ff0d6f40e80aa2b9
agent godot-shader-developer eb06837f6e7ec221f98f5176b8372b17314a0952ba0f6580385036418d5df1ba
agent government-digital-presales-consultant 129c7d17a83a4772c56dcf450ef4bacc3348ab2616449ff43d55cb06c0db08ec
agent grant-writer ffe546e0f54baaaff0d282cb5866d3b6dc23660f8b3040599ffaf74c6abf31b1
agent growth-hacker 8006d939efcfd9636a424d9199370a7adceeab77cc062dec367700da2c4b8aad
agent growth-hacker c92c9eb22847dce3d70335a103d9be8d2c81593deec294b5063570783e99cd17
agent healthcare-customer-service c96ba9e9438126657b4b43153fe0eda6428a3cf994869418fda4c2d5a5290a8f
agent healthcare-innovation-strategist 826cd3539aa8491f8e2d3c99ffbb24c4596cbfc909d42090e7708b581914f753
agent healthcare-marketing-compliance-specialist 5f2e709deff3066ee2e26a39211824962a48aeb2dedbd0e2808f496175415e83
@@ -148,7 +148,7 @@ agent macos-spatial-metal-engineer 459c44c093c14db20c3e26e11486faf1b51a2ed2f5ccf
agent master-plan-architect 181d5e2464dd1fb15e7951c2fff2c3b8feca97b1d066256ea9f26e27493c49e8
agent mcp-builder 436091e1d1e7701f41700efae56a36c27ceab7bcd517e0f1e951153c663e4797
agent medical-billing-coding-specialist 87637314fad64f8568209dcf95f00aac2374b9acddbb324b697d565029290cfd
agent meeting-notes-specialist 2abd4b0e4b5d84d36306b7a5a01d1cae280ac03183cbeb7dcb271b5890e5d172
agent meeting-notes-specialist 867b5bfd25f5780337119591fb352db2d05bfd502e3b6e1493e928778534e59b
agent minimal-change-engineer 3e712abbc8bf7e79ab4b7f955c95131bccd665efc064e439f47787dc7f27e23a
agent mobile-app-builder 6047ed573ead2b152ed01ec9d241a4e4a8fe60342aaee3213e6d21025f84afcb
agent mobile-release-engineer a36d473db28e070064d5f1ed75eff59cf36985a89b8985ee37bdc30ce47c0f24
@@ -163,8 +163,8 @@ agent operations-manager 8c9d12d028ced6846526774d978baeecfd53760aa2119a9d7a46590
agent organizational-psychologist 9c5c6a9f3aeeafd7ed563bb7d7573e5e3bd85c0ca5123556b81c3da9f89e08e0
agent orgscript-engineer a8cb7cea43d400f0c608aae00b4214419bdfc526f94075a55bd27dc494cabfca
agent outbound-strategist 3e28d6e7507f0c0c7c8b58ee1240458241d9dc25949f8bf9e95b2b0fab6ca181
agent paid-media-auditor 2ae7e56aa2f9a8b06bab19f6c8560878aa2469afc96a125dcd31c0250515733a
agent paid-social-strategist 76157e6b683ab4072f42834ea7d7f3f66c834f504e9178802a0be5fd955d5eb9
agent paid-media-auditor e75a87d1869c19fef5c2fbee03fa877a6a89b451d2cc179b87d7dcf642bdc115
agent paid-social-strategist 75a15564cf8baade008bb4ddc9c77f89d628cc4d5f8c7cd0781c58e47e855d48
agent payments-billing-engineer 92932901363c3d7e784bdef19e04a13faef5b2cd4173170910526e2bf434a578
agent pdf-engine-architect 04d7366e40373caa669a09fa8cf7c5327e48a122d1ff3e2f78b40f8a327fa0fd
agent penetration-tester 56d7934b013b2e11c4290d1316248c097122e092ebef5de76f62ed60b91ed5ba
@@ -174,13 +174,13 @@ agent personal-growth-mentor 11a0955f8343b5ffb9c389e02c21e7101f6d21cea98ac294871
agent pipeline-analyst d2a3af6fa137fc02ff9910976d708390546be2aba772b3c15072d11f1e4356e1
agent platform-engineer df3e5df68792e09ab2acc253d851fe1d8e28a9747c0c10b84d7439a9cbe131f2
agent podcast-strategist 3e70343ba56d46e735201e87529365addd8c539052dd8a5b140c4102593d1950
agent ppc-campaign-strategist a42cd854b9a33697b702b5f179f3efeef0d0c753349e81747233338c485162ed
agent ppc-campaign-strategist 7533eedb3e46643b434e24202b0958247a8f7fb88386d97b8d27104bc6f3160b
agent pr-communications-manager 1c7f5100ac1715bdce69d6687312f3f7c646aebd9a5eab4c9b0682c4e2810b4c
agent pricing-analyst e5d024baa61db63956c676d85d2b34050166458bd03b20a13719dab1a1379f74
agent pricing-analyst 0f4931c6b66fad4d2370e839c7052fa276bd0f9475fd950251e8a8f0368fdf83
agent privacy-engineer d40cc0d2606e7a08222eed29669c8b66697a24c7dac8656bc8633f88d59bead5
agent private-domain-operator 35553198dfef9a4d676d8d480e783a9f3a105f07a685e0f62aeab11329f07480
agent product-manager 29133dd6d39ac473bdc59212dac7c2aa21a1163939c9f90b54a12266cccedbd6
agent programmatic-display-buyer 37e94a0f43fc6093928001436b50ae8cb0a95ab678b0ec8b8271277a6aaae0ea
agent product-manager e70952ec5497b6948f9af7c16c8b67ba17babd3e1e62907d950a16e8528bacec
agent programmatic-display-buyer 54d174820ec3e089831ac4e76f61f100003d24bf75cb77c2f7e833fcf6850f91
agent project-shepherd f366e437da8f1334948793965ff6de6b8bb00ca6a46814a22193463656d58877
agent prompt-engineer 5100207414ee407bfcc99520edfcc4cf71205b357ee771d6ec41dd39de1b1a31
agent proposal-strategist 8586fd4d88a2dc4d865aed1a0b001772a6e414d85021ccae3b9493402d65024d
@@ -205,7 +205,7 @@ agent sales-data-extraction-agent 8ee3f4533a543a6627844e1dac6d33eb2fd9403735e377
agent sales-engineer 53a16476e3e1ecc4de53c6dcc9d7dd67e38227b96790c37b1f32bd064a7ca089
agent sales-outreach 625b0a5bfd7d0a0e2c3b85c0c3e3e8473da57c2e628b360a458e40952109b830
agent salesforce-architect ca346376db8042f68861affa71dd4cade7c8c7b791351e0c8be0e2dc6781c531
agent search-query-analyst fa26d7b5c018c13b3bec59887857a1a28c3c285ea419b963ce3dc43477af821e
agent search-query-analyst 4f386a500876aea799262f0d9b6f05e57d1dace570985a903955107e42d0e0a2
agent search-relevance-engineer d6ed38705708af22fd4d1b6ec817e9f46c897553ab132f70742bc72d92cc0435
agent secrets-credential-hygiene-engineer 574645c70294f161642e0ba2cd2e5bc9aefcc6b7ddc0b4e20cf8a741b2203ba4
agent section-508-accessibility-specialist 1907cdc7cbd412401523a96fa940e86d9ee1966dc5e0cc38defefc901b11b392
@@ -213,17 +213,17 @@ agent security-architect 9b339a90ac4f3e26fc40a6ce32911ba8db62a15b56ff5d10a3fb90c
agent senior-developer 697c44f1593cfa31b81a52596f01bd6d52170e1f8ba640a45c8fd668bed75b74
agent senior-project-manager 55a75c74945bf1714aba04e22dba136d8e675079764c9761f44d32d94f449781
agent senior-secops-engineer c1b4c4184528bce8ce522c2b8d173ffbde348a53aef3a99ead641144f7ca6825
agent seo-specialist 3a9c85b65452929ab7fe259d90f569d68861f8b0432d44f465ca04dd6d6a95ac
agent seo-specialist fab0be884539a89b6f0ee2f8b267493845119ac55b76d84533cc72c00482cd8d
agent servicenow-developer-mentor cfaca672e2ea962cdb783cf3dc7179d77ba974a47da0fafd91380b32fc4b90fb
agent short-video-editing-coach 8bf400fa3423788fcb65938a1a0808fbcd49606ae9a289a6cb8887530c0644a1
agent social-media-strategist 856ec12e4a3abc323593d0526b2c024162f4bb8790dbbe9046745d2065cc01a9
agent social-media-strategist 0abffdacebc955a16bd654f702673f8a0b615bcec19305009a7bc768493d00b7
agent software-architect 29d67ef8649ae8c558de15262ff24cb428aff6a3c6ee397cc82c7b48988b018e
agent solidity-smart-contract-engineer d6b9eec257773621a28d5c403e968e11ecdc0c9a9af5a66fbfa73baba275b99a
agent solution-engineer 6f5c989e9b5eafde81eac31be5f9e36c050cf9a3eb9599cf31d8aaff07330f64
agent sovereign-health-systems-agent 2039a19af8b538d0a383bb54e60d553d87ec8250c7e4c2071e8a981041f31927
agent spatial-data-engineer 53038692cbe4c7596b40c41dbc208f3e2f577db438f87a2e5f712ed704a49cb5
agent spatial-data-scientist cde6d37e6a267cdb890a5261cb72fae6556a229cda95fb22350aefd933a64f91
agent sprint-prioritizer 19c3d3b06b4963b624aed7d0da0d67cce46c8f6a492bd580009b218cc9e07f98
agent sprint-prioritizer 17da25c46f175f415db9ac7525d240d1f6d4bf0c6d8334d7db73cab10e7a7b2c
agent sre-site-reliability-engineer baf43af959f100e3ee72283196d49acf9b2681add1998a8cef527491f47c7691
agent statistician e1acda68183166f6efc4c597347c22670fa4111948bd2e73786c4fd4bb5ec152
agent strategy-duel-agent fd32ae607b72e8c71b4dcff656b500063f30c20db0f1b0ecac4198b97d71a142
@@ -243,8 +243,8 @@ agent threat-detection-engineer ce4188addbb8f4a32c3912bf98b59e9bc9a81f692ef0a4f9
agent threat-intelligence-analyst 8137c504d3ba085151e4554e869696090544f710425c0155a36b3938e2c0d210
agent tiktok-strategist 7e0c79b1196e61545706236b429c5520627b4f5d9a04b369f56877fd6802483e
agent tool-evaluator 35be3ea9f0fe799c702225d7c09c1856eeb7909c95d9d0aeba4435b6ef0043dd
agent tracking-measurement-specialist bebc505d4de96c2d4930a07e25a6711ae2a85828dfed2757472fe6cbd91d1101
agent trend-researcher 4e08e0a2dfade8cdc57b1f5e03907765d3ee3a857c96dd25075b51e944352f9d
agent tracking-measurement-specialist 09c1f0d9760e8310a455d89d398177fd7050a976391ca70e6b16aa46629d525b
agent trend-researcher fcde67f60e23b7cfe5deb0ad6c6f7b9533401eead6eb3e81d161762939c2b7f0
agent twitter-engager 5ce27bac317c54b180865f30dbc76bfed1d258460e401401632cd1f736ab33e7
agent ui-designer 814564acb8ca190cbbcc6f4ee6ee361cb57a1b4b64d656a9f230d8406e5d460d
agent ui-finish-gate-reviewer 694081e99239a3ba84f081f4b7221209088dfbf1757fb1baf0e280af535afd4a
+43 -1
View File
@@ -470,13 +470,55 @@ HEREDOC
fi
}
# qwen_tools <claude-tools> — the source's Claude Code tool list, renamed to the
# tools Qwen Code registers.
#
# Sources list tools by Claude Code name ("WebFetch, WebSearch, Read, Write,
# Edit"). Qwen resolves each entry against its own registry by tool name or
# display name, and keeps an entry that matches neither as-is, so it matches
# no tool (subagent-manager.ts resolveToolNames). Edit, WebFetch, WebSearch,
# Grep and Glob happen to be Qwen display names too. Read, Write and Bash are
# not (Qwen's are ReadFile, WriteFile and Shell), and `tools:` is an
# allow-list, so those agents came up in Qwen able to edit files but not read
# or create them, and the seven that list Bash with no shell.
#
# Names are mapped to Qwen's canonical tool names (tools/tool-names.ts); an
# entry with no Qwen equivalent passes through unchanged.
qwen_tools() {
local out="" t q
local IFS=','
for t in $1; do
t="${t#"${t%%[![:space:]]*}"}"; t="${t%"${t##*[![:space:]]}"}"
[[ -n "$t" ]] || continue
case "$t" in
Read) q="read_file" ;;
Write) q="write_file" ;;
Edit) q="edit" ;;
MultiEdit) q="edit" ;;
Bash) q="run_shell_command" ;;
Grep) q="grep_search" ;;
Glob) q="glob" ;;
LS) q="list_directory" ;;
WebFetch) q="web_fetch" ;;
WebSearch) q="web_search" ;;
TodoWrite) q="todo_write" ;;
NotebookEdit) q="notebook_edit" ;;
Task) q="agent" ;;
*) q="$t" ;;
esac
case ", $out, " in *", $q, "*) continue ;; esac # MultiEdit + Edit -> one edit
out="${out:+$out, }$q"
done
printf '%s' "$out"
}
convert_qwen() {
local file="$1"
local name description tools slug outfile body
name="$(get_field "name" "$file")"
description="$(get_field "description" "$file")"
tools="$(get_field "tools" "$file")"
tools="$(qwen_tools "$(get_field "tools" "$file")")"
slug="$(slugify "$name")"
body="$(get_body "$file")"
+9
View File
@@ -56,6 +56,15 @@ assert_quoted \
"$OUTPUT_DIR/qwen/agents/programmatic-display-buyer.md" \
tools
# Qwen resolves tools by its own names and silently keeps one it does not know,
# so Claude Code's Read/Write/Bash have to arrive as read_file/write_file/
# run_shell_command or the agent cannot read, create files, or run a shell.
qwen_tools_line="$(grep -m1 '^tools:' "$OUTPUT_DIR/qwen/agents/programmatic-display-buyer.md")"
[[ "$qwen_tools_line" == "tools: 'web_fetch, web_search, read_file, write_file, edit, run_shell_command'" ]] || {
printf 'Expected Qwen tool names in programmatic-display-buyer, got: %s\n' "$qwen_tools_line" >&2
exit 1
}
# A present but empty required field is unusable discovery metadata. Check the
# source linter directly, including YAML's quoted empty-string form.
cat > "$OUTPUT_DIR/agent.md" <<'EOF'
+38
View File
@@ -414,6 +414,44 @@ if os.path.isfile(aider_index):
elif len(text) <= AIDER_INDEX_CEILING:
ok(f"aider: index is {len(text):,} characters and all {N} agent paths resolve")
# --- Layer A (tool names): Qwen only grants tools it can name ---------------
# A Qwen subagent's `tools:` is an allow-list resolved against Qwen's registry
# by tool name or display name; an entry matching neither is kept as-is and
# grants nothing. Sources list Claude Code names, and Read/Write/Bash are not
# Qwen names, so they have to be translated (convert.sh qwen_tools). Every
# entry must be a Qwen built-in by a spelling Qwen resolves (tool name, display
# name or legacy alias; packages/core/src/tools/tool-names.ts) or an MCP tool.
QWEN_TOOLS = {
# tool names
"read_file", "write_file", "edit", "run_shell_command", "grep_search", "glob",
"list_directory", "web_fetch", "web_search", "todo_write", "notebook_edit", "agent",
# display names
"ReadFile", "WriteFile", "Edit", "Shell", "Grep", "Glob", "ListFiles", "WebFetch",
"WebSearch", "TodoList", "NotebookEdit", "Agent",
# legacy aliases
"SearchFiles", "FindFiles", "ReadFolder", "Task", "TodoWrite",
"search_file_content", "replace", "task",
}
qwen_bad = []
for f in sorted(glob.glob(os.path.join(OUT, "qwen", "agents", "*.md"))):
try:
tools = (frontmatter(open(f, encoding="utf-8").read()) or {}).get("tools")
except Exception:
continue # the strict-parse pass already reported this
if tools is None:
continue
entries = tools if isinstance(tools, list) else [t.strip() for t in str(tools).split(",")]
unknown = [t for t in entries if t and t not in QWEN_TOOLS and not t.startswith("mcp__")]
if unknown:
qwen_bad.append((os.path.basename(f)[:-3], unknown))
for slug, unknown in qwen_bad[:3]:
bad(f"qwen: {slug} lists {', '.join(unknown)} — Qwen Code has no tool by that "
f"name, so the allow-list grants nothing for it")
if len(qwen_bad) > 3:
bad(f"qwen: ...and {len(qwen_bad)-3} more agents with unknown tool names")
if not qwen_bad:
ok("qwen: every tools: entry names a Qwen Code tool")
# --- Layer A (app-facing): every SOURCE frontmatter strict-parsed above -------
for m in src_bad[:5]: bad(m)
if len(src_bad) > 5: bad(f"...and {len(src_bad)-5} more source frontmatter problems")