* fix(review): stop shedding the convergence observation first The convergence paragraph is the only thing a posted review says about the SHAPE of the loop rather than about the diff, and it was rank 0 — the second block the body-budget ladder sheds, right after the mechanism-health note. The reasoning was that an advisory paragraph decides nothing, so it should yield before the deferral list and the not-reviewed disclosures. The arithmetic does not support that ordering. Rendered bilingually the paragraph is 603 characters when only the volume signal fired, 1,510 with three recurrence clusters, and 2,372 with the clusters, the evidence caveats and the land reading together — against a body budget of 56,830. Shed second it can pay for at most 4% of an overflow, so any overflow larger than the paragraph itself spent it and then went on to spend the deferral list and the disclosures anyway. On the rounds this fires on — the high-volume ones, which is the whole point — that is the normal case: the author lost the reminder AND the disclosures. It is rank 3 now, the last rank the ladder sheds. Still ranked, not untagged: a body that genuinely cannot hold its blockers must drop an advisory, and being ranked is what makes the trim notice name it when that happens. Ranked last because it is the cheapest block to keep and the only one whose reader is the pull request's author alone — the deferral list has a second durable copy in the findings artifact, the disclosures are restated in the terminal report, and the mechanism-health note above it is written for the operator, who has the `HEALTH:` line. The test that pinned the old order is replaced by two that pin the new one: one sized to the window where the ladder sheds the disclosures and stops, asserting the paragraph survives and the notice names what actually went; one sized a rung further, asserting the paragraph goes last and is named when it does, before the hard cut. Mutation-verified: restoring `trim: 0` reddens both; making the block untagged reddens the last-and-named test (and the existing terminal-copy test); removing the rank's name from RANK_NAMES reddens only the naming assertion. * test(review): finish the rank move in the comments, and re-centre a constant Two hygiene items the review caught on the trim-rank change. A test title and its comment still said the convergence paragraph is the first rank the ladder sheds — the sentence the change makes false. Three other copies of that wording were updated with the move; this one was missed. And `keeps the terminal copy on the round that actually sheds the paragraph` was sized at 55,850. Reaching a body that dropped the paragraph now means sizing past every other rank, and the window that does so without also truncating runs 55,825–56,350 — so the constant sat twenty-five characters above its own floor, with no note saying it was tuned at all. It is 56,100 now, near the middle, and carries the same retuning instruction as the two order tests. It also asserts the body was not truncated, so a future retune that overshoots reads as a failure rather than as a pass for the wrong reason. Measured, not guessed: sweeping the blocker size in 25-character steps puts the shed boundary between 55,800 and 55,825 and the truncation boundary between 56,350 and 56,375. Dropping the constant back below the window reddens the test, so it still reaches the case the terminal copy exists for. * docs(review): finish the rank move where the rationale actually lives Six comments still asserted that the convergence paragraph is the first thing the overflow ladder sheds. The reviewer named five; a sweep found a sixth, and two of the six were already inaccurate before this branch touched anything. Corrected: - the `convergence` result-field doc — "sheds this paragraph first" - the deferral block's own rank comment — "the first thing to yield", which ranks -1 and 0 had both preceded since before this branch - the not-reviewed disclosures — "and before nothing else" - the `CONVERGENCE:` stderr line's rationale — "the first thing the overflow ladder sheds" - `save-artifact.ts`'s allow-list — "the ONE clause the overflow ladder sheds first" - the body-budget suite's own statement of the policy under test, which listed two of the four ranks Left alone, and verified correct: every "sheds first" attached to the mechanism-health note, which is rank -1 and genuinely first (`save-artifact.ts`, `save-artifact.test.ts`, the health-note terminal-copy test), and the `keep`-ordering comment about the tail cut, which is not about `trim` at all. Each corrected site keeps its own reasoning — durability, the artifact, the terminal copy — and states the ordering only as far as that reasoning needs, rather than restating the whole argument a sixth time. Six copies of one fact is what let it drift; the argument for the ordering lives at the convergence block and the others point at it. The durability rationale gets stronger, not weaker, and the comments now say so: a body that sheds rank 3 has already shed every other rank, so the terminal and artifact copies are the only ones left exactly when they fire. |
||
|---|---|---|
| .github | ||
| .husky | ||
| .qwen | ||
| .vscode | ||
| docs | ||
| docs-site | ||
| eslint-rules | ||
| integration-tests | ||
| integrations/external-context | ||
| packages | ||
| patches | ||
| scripts | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitattributes | ||
| .gitignore | ||
| .npmrc | ||
| .nvmrc | ||
| .prettierignore | ||
| .prettierrc.json | ||
| .yamllint.yml | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| esbuild.config.js | ||
| eslint.config.js | ||
| eslint.legacy-filenames.mjs | ||
| LICENSE | ||
| Makefile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| SECURITY.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
The open-source AI coding agent that lives in your terminal.
中文 | Deutsch | français | 日本語 | Русский | Português (Brasil) | 한국어
Why Qwen Code?
- Agentic out of the box — Auto-Memory, Auto-Skills, SubAgents, Agent Teams, and MCP. Dynamic workflows, zero setup.
- Open-source, inside and out — The framework and the Qwen models are open-source. They evolve together. No vendor lock-in.
- Multi-protocol — Supports OpenAI, Anthropic, Gemini, and Qwen APIs. Any third-party provider or local model (Ollama / vLLM). Switch at runtime.
- Beyond the terminal — IDE plugins, Desktop app, daemon mode, SDKs, and IM bots (Telegram / DingTalk / WeChat / Feishu).
Tip
Qwen Code is actively iterating on itself — using its own agent and models to file issues, submit PRs, review code, and run tests. Powered by the community, driven by AI.
Installation
Linux / macOS:
curl -fsSL https://qwen-code-assets.oss-cn-hangzhou.aliyuncs.com/installation/install-qwen-standalone.sh | bash
Windows:
irm https://qwen-code-assets.oss-cn-hangzhou.aliyuncs.com/installation/install-qwen-standalone.ps1 | iex
Restart your terminal after installation to ensure environment variables take effect.
NPM / Homebrew
NPM (requires Node.js 22+):
npm install -g @qwen-code/qwen-code@latest
Homebrew (macOS / Linux):
brew install qwen-code
Quick Start
qwen # Launch interactive terminal UI
# Inside the session:
/auth # Configure your provider and API key
See the Authentication Guide and Settings Reference for detailed setup.
How to Use Qwen Code
| Mode | Command | Use Case |
|---|---|---|
| Interactive | qwen |
Terminal UI with rich rendering, @file references, slash commands |
| Headless | qwen -p "..." |
Scripts, CI/CD, batch processing — no UI |
| IDE | — | VS Code, Zed, JetBrains |
| Desktop | — | Qwen Code Desktop — GUI for macOS, Windows, Linux |
| Daemon | qwen serve |
Shared agent session over HTTP+SSE (ACP). Multiple clients, one agent. (experimental) Docs |
| SDK | — | TypeScript, Python, Java |
| IM Bot | qwen channel |
Connect to Telegram, DingTalk, WeChat, or Feishu |
SDK example (Python)
import asyncio
from qwen_code_sdk import is_sdk_result_message, query
async def main() -> None:
result = query(
"Summarize the repository layout.",
{
"cwd": "/path/to/project",
"path_to_qwen_executable": "qwen",
},
)
async for message in result:
if is_sdk_result_message(message):
print(message["result"])
asyncio.run(main())
Capabilities
If you know Claude Code, you already know Qwen Code — and then some. We've put significant effort into bringing Qwen Code to feature parity with Claude Code, improving both breadth and reliability across the board.
| Feature | Qwen Code | Claude Code |
|---|---|---|
| SubAgents, Agent Teams, Dynamic Workflows | ✓ | ✓ |
| Auto-Memory, Auto-Skills, Hooks | ✓ | ✓ |
| Built-in Skills (/review, /batch, /loop, /bugfix…) | ✓ | ✓ |
| MCP, Plan Mode, LSP Integration | ✓ | ✓ |
| Auto Mode, Sandbox, Git Worktrees | ✓ | ✓ |
| Computer Use (desktop automation) | ✓ | ✓ |
| IDE Plugins (VS Code / JetBrains / Zed) | ✓ | ✓ |
| SDK | ✓ | ✓ |
| Headless Mode, Session Management | ✓ | ✓ |
| Open-source — model and framework | ✓ | — |
| Multi-protocol (OpenAI / Anthropic / Gemini / Qwen + any provider) | ✓ | — |
| Agent Arena (multi-model head-to-head on same task) | ✓ | — |
Daemon Mode — qwen serve (multi-client shared agent) |
✓ | — |
| IM Channels (Telegram / DingTalk / WeChat / Feishu) | ✓ | — |
Ecosystem
-
Qwen Code Desktop — Official desktop app for macOS, Windows, and Linux
-
AionUi — A modern GUI for command-line AI tools including Qwen Code
-
Gemini CLI Desktop — A cross-platform desktop/web/mobile UI for Qwen Code
-
🦞 Qwen Code Claw — Let other agents (Claude, Codex, etc.) delegate coding tasks to Qwen Code via ACP. Paste this prompt into your agent:
Use Qwen Code as a coding agent. First, fetch and read this skill reference:
https://raw.githubusercontent.com/QwenLM/qwen-code/refs/heads/main/.qwen/skills/qwen-code-claw/SKILL.md
Then follow the instructions inside to install, authenticate, and use Qwen Code via acpx for all coding tasks.
- Aliyun Model Studio CLI — Official CLI for Aliyun's AI platform (
bailian-cli). Extends Qwen Code with image/video generation, knowledge retrieval, app orchestration, and model deployment
Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines.
Acknowledgments
This project was originally based on Google Gemini CLI v0.8.2. We gratefully acknowledge the Gemini CLI team's excellent work. Starting from Qwen Code v0.1, we stopped syncing with upstream and began independent development as a multi-protocol, multi-platform agent framework with deep integrations for Qwen models and beyond.
