mirror of
https://github.com/msitarzewski/agency-agents.git
synced 2026-10-22 03:04:53 +00:00
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:
1 parent
33e8e55f3b
commit
d3f71c4bb8
4 files changed
+107
-18
No files matched your search
@@ -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
@@ -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")"
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in new issue
Block a user