Skip to content

feat(framework+cli): fw-4.41.0 / cli-3.42.0 — Qwen Code agent surface - #410

Merged
montfort merged 1 commit into
mainfrom
feat/qwen-code-agent-surface
Aug 6, 2026
Merged

feat(framework+cli): fw-4.41.0 / cli-3.42.0 — Qwen Code agent surface#410
montfort merged 1 commit into
mainfrom
feat/qwen-code-agent-surface

Conversation

@montfort

@montfort montfort commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

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 init and at later update? The answer split:

  • Qoder — covered. Skills ship at dist/.qoder/skills/ (init / install-skills: Qoder CLI is not a supported skill target — .qoder/skills/ is never materialized #399), and rules arrive via AGENTS.md: the Qoder runtime file-searches **/AGENTS.md and injects each match as an instruction source.
  • Qwen Codenot covered at all. Verified against the installed @qwen-code/qwen-code: its context-filename resolver ends in ["QWEN.md"] : Array.isArray(configured) ? configured : [configured] — the default is QWEN.md alone. AGENTS.md occurs 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.md directive injection (template cloned from GEMINI.md — Qwen Code is a Gemini CLI fork — with a qwen-code-v{version} identity).
  • dist/.qwen/skills/ — 15 skills, byte-for-byte mirror of the Claude variants. Qwen Code parses allowed-tools and 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 own Storage.getGlobalQwenDir() resolves.
  • straymark validate --agent qwen, and remove cleanup.

Two defects surfaced by the review

  • update-framework never created newly-declared injection targets. It skipped every target absent from disk, so an agent surface added to the manifest after installation reached fresh inits only — while STRAYMARK.md § "Directive Injection Markers" documents that init, update-framework and repair all "create any missing target file". The code was the outlier. This is what makes QWEN.md land on existing installations via straymark update rather than requiring straymark repair.
  • The Qoder documentation asserted the opposite of the runtime. README + CLI-REFERENCE (3 languages) said Qoder reads skills from ~/.qoder/skills/ "not from the project tree". It resolves a Project scope (<projectRoot>/.qoder/skills/) and watches it. install-skills --agent qoder is a convenience; Codex remains the only agent for which it is mandatory.

Along the way

Verification

  • cargo test949 passed, 0 failed.
  • New tests: tree parity + install-skills e2e under QWEN_HOME + manifest surface + validate --agent acceptance (qwen_skills_test.rs); update_creates_injection_targets_that_are_missing_on_disk; inject_test extended from AGENTS.md-only to all seven targets plus template-on-disk.
  • Manual e2e against a simulated post-init tree: 15 skills installed into a temp $QWEN_HOME; validate --agent qwen clean with no allowed-tools false positives. This caught a real bugvalidate --agent's clap value_parser lives in main.rs, separate from the dispatch in validate.rs, so widening only the latter left the flag rejected at parse time. Fixed and pinned by a test.

straymark init downloads the published release ZIP, so it cannot exercise a local dist/. Confirming QWEN.md through a real init / update, and in the live qwen and qoder CLIs, is deferred to after the fw-4.41.0 tag lands — recorded as a follow-up.

Release

fw-4.40.0fw-4.41.0, cli-3.41.1cli-3.42.0. Governance footers, version tables (3 languages) and CHANGELOG.md updated. Decision in AIDEC-2026-08-05-001, work in AILOG-2026-08-05-003.

🤖 Generated with Claude Code

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>
@montfort
montfort merged commit 40c4e9c into main Aug 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant