feat(#2092): migrate Qwen Code onto EoS imperative adapter + native subagents + SubagentStart (ADR-1239)
Fold all runtime==='qwen'/isQwen logic branches (skill-priority frontmatter, branding/path rewrites, legacy commands/gsd cleanup, hyphen-namespace normalization, RUNTIME_CONTENT_DISPATCH, hooks-surface label) into descriptor-driven runtime.hostBehaviors on capabilities/qwen/capability.json, read via _hostBehaviors(). Shared claude/qwen/hermes legacy-migration branches in install-engine.cts folded to descriptor flags (claude+hermes descriptors updated; FALLBACK_HOST_BEHAVIORS.claude floored). Byte-identical golden parity for qwen/hermes/claude(global+local). UPGRADE 1: native .qwen/agents/*.md subagent projection — new agents artifact-layout kind + convertClaudeAgentToQwenAgent converter (name + description + tools YAML block list; color/model dropped). qwen routed onto the descriptor-driven agents path (_DESCRIPTOR_AGENTS_RUNTIMES). UPGRADE 2: SubagentStart hook wired into extendedHookEvents + the descriptor-gated hook-writer loop (activates only for qwen). Tests: qwen-imperative-reference (adapter/axes/fail-closed/hostBehaviors + no runtime==='qwen' source-grep across 4 files) + qwen-upgrades (agents file validity + SubagentStart mirrors SubagentStop, descriptor-gated). Docs matrix + how-to updated; changeset added. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -193,19 +193,27 @@ function agentsKind(destSubpath: string, prefix: string, configDir: string): Art
|
||||
* Agent filenames are preserved verbatim (the prefix is already embedded in the
|
||||
* agent stem — e.g. `gsd-planner.md`).
|
||||
*
|
||||
* #1173 SCOPE — plumbing only (declarations deferred): this provides the
|
||||
* converter dispatch + `isGlobal` scope threading for the descriptor's `agents`
|
||||
* kind, but NO runtime currently declares a converted `agents` kind in its
|
||||
* `capability.json`. The descriptor declarations for the 8 non-Claude runtimes
|
||||
* (copilot/antigravity/cursor/windsurf/augment/trae/codebuddy/cline) are
|
||||
* DEFERRED to a follow-up that first ships the ADR-1235 §0 byte-for-byte parity
|
||||
* harness, because the second `layout.kinds` consumer — `applySurface` /
|
||||
* `/gsd:surface` / `--materialize` (`src/surface.cts`) — does not yet mirror the
|
||||
* legacy agent pipeline (Copilot's `.agent.md` filename rename, the cross-cutting
|
||||
* path-prefix rewrite + attribution, stale-file cleanup, config-reading steps),
|
||||
* so declaring the kind now would regress the surface path. Until then the legacy
|
||||
* `bin/install.js` agent loop remains authoritative for the real install, and
|
||||
* this `convertedAgentsKind` is exercised only by synthetic-descriptor seam tests.
|
||||
* #1173 SCOPE — plumbing only (real install still elsewhere): this provides
|
||||
* the converter dispatch + `isGlobal` scope threading for the descriptor's
|
||||
* `agents` kind. As of #2092, 8 non-Claude runtimes DO declare a converted
|
||||
* `agents` kind in their `capability.json` — qwen (`convertClaudeAgentToQwenAgent`)
|
||||
* plus the 7 that already declared one before it (antigravity, augment,
|
||||
* codebuddy, copilot, cursor, trae, windsurf) — so the descriptor-level
|
||||
* declaration is no longer deferred. What IS still deferred is wiring
|
||||
* `resolveRuntimeArtifactLayout`'s `agents` kind into the REAL install:
|
||||
* `bin/install.js`'s agent-staging loop does not consume this module's
|
||||
* `convertedAgentsKind` resolution at all — it dispatches the very same
|
||||
* converter functions directly via `_hostBehaviors(runtime)` checks
|
||||
* (`frontmatterDialect`, `brandingRewrites`, `isCopilot`/`isAntigravity`/…),
|
||||
* duplicating the mapping declared here. That duplication is deliberate until
|
||||
* the second `layout.kinds` consumer — `applySurface` / `/gsd:surface` /
|
||||
* `--materialize` (`src/surface.cts`) — mirrors the legacy agent pipeline
|
||||
* (Copilot's `.agent.md` filename rename, the cross-cutting path-prefix
|
||||
* rewrite + attribution, stale-file cleanup, config-reading steps); declaring
|
||||
* `bin/install.js` itself against this resolver before then would risk
|
||||
* regressing the surface path. Until that follow-up lands, `bin/install.js`
|
||||
* remains authoritative for the real install, and this `convertedAgentsKind`
|
||||
* is exercised only by `/gsd:surface` and synthetic-descriptor seam tests.
|
||||
*
|
||||
* Mirrors the `convertedCommandsKind` pattern (#785).
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user