feat(framework+cli): fw-4.41.0 / cli-3.42.0 — Qwen Code agent surface - #410
Merged
Conversation
Qwen Code had zero integration. Verified against the installed runtime, its context-file resolver defaults to ["QWEN.md"] and AGENTS.md appears only in a system-prompt string listing files it must not modify — so a Qwen Code user received no StrayMark governance at all, a strictly worse position than Codex or Qoder, which are covered via AGENTS.md. Adds the surface: QWEN.md directive injection, dist/.qwen/skills/ (byte-for-byte mirror of the Claude variants — Qwen Code parses allowed-tools and resolves skills at both project and user scope), install-skills --agent qwen against $QWEN_HOME (the dir Storage.getGlobalQwenDir() resolves), validate --agent qwen, and remove cleanup. Two defects surfaced by the review are fixed alongside: - update-framework skipped every injection target absent from disk, so a new agent surface reached fresh inits only — while STRAYMARK.md § "Directive Injection Markers" documents that init, update-framework and repair all create missing targets. The code was the outlier; missing targets are now created, which is what makes QWEN.md land on existing installations. - README and CLI-REFERENCE (3 languages) claimed Qoder reads skills from ~/.qoder/skills/ "not from the project tree". The runtime resolves a Project scope and watches it, so install-skills --agent qoder is a convenience. Codex remains the only agent for which it is mandatory. Also: validate --agent generalized off its Codex-only shape (Qoder and Qwen legitimately carry allowed-tools, so the claude-only-key check is now conditional); new skill-mirror-parity CI job, since the .qoder mirror was guarded by a test the pipeline never ran; ADOPTION-GUIDE compatibility tables (3 languages) resynced with the README, which had been two releases ahead. Decision recorded in AIDEC-2026-08-05-001, work in AILOG-2026-08-05-003. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Qwen Code becomes a first-class agent surface, and the update path that would have withheld it from existing installations is fixed.
Why
The question was narrow — do the Qwen and Qoder CLIs get the same rules and configuration Claude Code gets, at
initand at laterupdate? The answer split:dist/.qoder/skills/(init / install-skills: Qoder CLI is not a supported skill target —.qoder/skills/is never materialized #399), and rules arrive viaAGENTS.md: the Qoder runtime file-searches**/AGENTS.mdand injects each match as an instruction source.@qwen-code/qwen-code: its context-filename resolver ends in["QWEN.md"] : Array.isArray(configured) ? configured : [configured]— the default isQWEN.mdalone.AGENTS.mdoccurs exactly once in the bundle, inside a system-prompt string enumerating files the agent must not modify without permission. Recognized, never loaded. So a Qwen Code user received no governance whatsoever, a strictly worse position than Codex or Qoder.Changes
New Qwen Code surface
QWEN.mddirective injection (template cloned fromGEMINI.md— Qwen Code is a Gemini CLI fork — with aqwen-code-v{version}identity).dist/.qwen/skills/— 15 skills, byte-for-byte mirror of the Claude variants. Qwen Code parsesallowed-toolsand resolves skills at both project and user scope, so the richer frontmatter is usable rather than merely tolerated.straymark install-skills --agent qwen→$QWEN_HOME/skills/, the directory Qwen Code's ownStorage.getGlobalQwenDir()resolves.straymark validate --agent qwen, andremovecleanup.Two defects surfaced by the review
update-frameworknever created newly-declared injection targets. It skipped every target absent from disk, so an agent surface added to the manifest after installation reached freshinits only — whileSTRAYMARK.md§ "Directive Injection Markers" documents thatinit,update-frameworkandrepairall "create any missing target file". The code was the outlier. This is what makesQWEN.mdland on existing installations viastraymark updaterather than requiringstraymark repair.~/.qoder/skills/"not from the project tree". It resolves aProjectscope (<projectRoot>/.qoder/skills/) and watches it.install-skills --agent qoderis a convenience; Codex remains the only agent for which it is mandatory.Along the way
validate --agentgeneralized off its Codex-only shape. Theclaude-only-keycheck is now conditional — Qoder and Qwen legitimately carryallowed-tools, so flagging it there would be a false positive by construction.skill-mirror-parityCI job. The.qodermirror had a parity test since init / install-skills: Qoder CLI is not a supported skill target —.qoder/skills/is never materialized #399, but the pipeline runs nocargo test, so.codexwas the only gated channel. The job runs exactly the two mirror suites — narrow enough not to reopen the deferred "no full suite in CI" decision.ADOPTION-GUIDE.mdcompatibility tables (3 languages) resynced with the README, which had been two releases ahead (no Codex, no Qoder).qoder-v1.0added to the agent identity lists, missing since init / install-skills: Qoder CLI is not a supported skill target —.qoder/skills/is never materialized #399.Verification
cargo test— 949 passed, 0 failed.install-skillse2e underQWEN_HOME+ manifest surface +validate --agentacceptance (qwen_skills_test.rs);update_creates_injection_targets_that_are_missing_on_disk;inject_testextended fromAGENTS.md-only to all seven targets plus template-on-disk.inittree: 15 skills installed into a temp$QWEN_HOME;validate --agent qwenclean with noallowed-toolsfalse positives. This caught a real bug —validate --agent's clapvalue_parserlives inmain.rs, separate from the dispatch invalidate.rs, so widening only the latter left the flag rejected at parse time. Fixed and pinned by a test.straymark initdownloads the published release ZIP, so it cannot exercise a localdist/. ConfirmingQWEN.mdthrough a realinit/update, and in the liveqwenandqoderCLIs, is deferred to after thefw-4.41.0tag lands — recorded as a follow-up.Release
fw-4.40.0→fw-4.41.0,cli-3.41.1→cli-3.42.0. Governance footers, version tables (3 languages) andCHANGELOG.mdupdated. Decision inAIDEC-2026-08-05-001, work inAILOG-2026-08-05-003.🤖 Generated with Claude Code