diff --git a/scripts/convert-outputs.sha256 b/scripts/convert-outputs.sha256 index 78b19b26..49e35f55 100644 --- a/scripts/convert-outputs.sha256 +++ b/scripts/convert-outputs.sha256 @@ -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 diff --git a/scripts/convert.sh b/scripts/convert.sh index 1f7156fc..0d5455b7 100755 --- a/scripts/convert.sh +++ b/scripts/convert.sh @@ -470,13 +470,55 @@ HEREDOC fi } +# qwen_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")" diff --git a/scripts/test-convert-frontmatter.sh b/scripts/test-convert-frontmatter.sh index 75df39ff..89a84139 100755 --- a/scripts/test-convert-frontmatter.sh +++ b/scripts/test-convert-frontmatter.sh @@ -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' diff --git a/scripts/test-convert-outputs.sh b/scripts/test-convert-outputs.sh index 46e2dbbc..800c3377 100755 --- a/scripts/test-convert-outputs.sh +++ b/scripts/test-convert-outputs.sh @@ -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")