qwen-code/docs/users/features/memory.md
Shaojin Wen b004450d7f
Some checks are pending
Qwen Code CI / Lint (push) Waiting to run
Qwen Code CI / Test (push) Blocked by required conditions
Qwen Code CI / Test-1 (push) Blocked by required conditions
Qwen Code CI / Test-2 (push) Blocked by required conditions
Qwen Code CI / Test-3 (push) Blocked by required conditions
Qwen Code CI / Test-4 (push) Blocked by required conditions
Qwen Code CI / Test-5 (push) Blocked by required conditions
Qwen Code CI / Test-6 (push) Blocked by required conditions
Qwen Code CI / Test-7 (push) Blocked by required conditions
Qwen Code CI / Test-8 (push) Blocked by required conditions
Qwen Code CI / Post Coverage Comment (push) Blocked by required conditions
Qwen Code CI / CodeQL (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none (push) Waiting to run
E2E Tests / E2E Test - macOS (push) Waiting to run
feat(cli): support multi-line status line output (#3311)
* feat(cli): support multi-line status line output (#3211)

Remove the single-line hard limit (.split('\n')[0]) from the status line
hook so user scripts can output multiple rows. Footer renders each line
as a separate <Text wrap="truncate"> element, preserving per-line
horizontal truncation. Ink's virtual DOM handles re-rendering without
manual ANSI cursor management.

* feat(cli): cap status line output at 3 lines

Prevent runaway scripts from flooding the footer — lines beyond the
third are silently discarded.

* docs: mention 3-line cap in status line docs and agent prompt

* fix(cli): cap status line at 2 lines to keep footer within 3 rows

Footer has a fixed bottom row (hint/mode indicator), so status line
gets at most 2 lines to keep the total footer height at 3 rows max.

* test(cli): improve useStatusLine coverage to 100% lines

Add tests for: per-model metrics payload, contextWindowSize/version/
model fallbacks, config removal with pending debounce, command change
cancelling pending debounce.

* docs: update status line ASCII diagram for multi-line layouts

Also fix TS error in test (null → null as never for mock return).

* refactor(cli): return string[] from useStatusLine, filter empty lines

Address review feedback:
- Hook returns `lines: string[]` instead of `text: string | null`,
  eliminating the join/split round-trip with Footer.
- Filter empty lines before slicing so leading blanks don't eat real
  content (e.g. "\n\nreal content" no longer yields ["", ""]).
- Export MAX_STATUS_LINES with comment explaining the 3-row constraint.
- Use `status-line-${i}` as React key for clarity.

* test(cli): add Footer multi-line rendering, \r\n, and pure-newline tests

Address remaining review feedback:
- Footer test: mock useStatusLine, verify multi-line rendering and
  hint suppression.
- useStatusLine test: add \r\n line ending and pure-newline edge case.

* fix(cli): align right footer indicators to top

When the status line has multiple rows, the left column becomes taller
than the right section. The outer Box defaults to `alignItems: stretch`
which caused the indicators to visually center; add `alignItems="flex-start"`
on the right Box so they stay anchored to the top row.

Reported via e2e test in #3311.
2026-04-17 12:44:30 +08:00

6.3 KiB

Memory

Every Qwen Code session starts with a fresh context window. Two mechanisms carry knowledge across sessions so you don't have to re-explain yourself every time:

  • QWEN.md — instructions you write once and Qwen reads every session
  • Auto-memory — notes Qwen writes itself based on what it learns from you

QWEN.md: your instructions to Qwen

QWEN.md is a plain text file where you write things Qwen should always know about your project or your preferences. Think of it as a permanent briefing that loads at the start of every conversation.

What to put in QWEN.md

Add things you'd otherwise have to repeat every session:

  • Build and test commands (npm run test, make build)
  • Coding conventions your team follows ("all new files must have JSDoc comments")
  • Architectural decisions ("we use the repository pattern, never call the database directly from controllers")
  • Personal preferences ("always use pnpm, not npm")

Don't include things Qwen can figure out by reading your code. QWEN.md works best when it's short and specific — the longer it gets, the less reliably Qwen follows it.

Where to create QWEN.md

File Who it applies to
~/.qwen/QWEN.md You, across all your projects
QWEN.md in the project root Your whole team (commit it to source control)

You can have both. Qwen loads all QWEN.md files it finds when you start a session — your personal one plus any in the project.

If your repository already has an AGENTS.md file for other AI tools, Qwen reads that too. No need to duplicate instructions.

Generate one automatically with /init

Run /init and Qwen will analyze your codebase to create a starter QWEN.md with build commands, test instructions, and conventions it finds. If one already exists, it suggests additions instead of overwriting.

Reference other files

You can point QWEN.md at other files so Qwen reads them too:

See @README.md for project overview.

# Conventions

- Git workflow: @docs/git-workflow.md

Use @path/to/file anywhere in QWEN.md. Relative paths resolve from the QWEN.md file itself.


Auto-memory: what Qwen learns about you

Auto-memory runs in the background. After each of your conversations, Qwen quietly saves useful things it learned — your preferences, feedback you gave, project context — so it can use them in future sessions without you repeating yourself.

This is different from QWEN.md: you don't write it, Qwen does.

What Qwen saves

Qwen looks for four kinds of things worth remembering:

What Examples
About you Your role, background, how you like to work
Your feedback Corrections you made, approaches you confirmed
Project context Ongoing work, decisions, goals not obvious from the code
External references Dashboards, ticket trackers, docs links you mentioned

Qwen doesn't save everything — only things that would actually be useful next time.

Where it's stored

Auto-memory files live at ~/.qwen/projects/<project>/memory/. All branches and worktrees of the same repository share the same memory folder, so what Qwen learns in one branch is available in others.

Everything saved is plain markdown — you can open, edit, or delete any file at any time.

Periodic cleanup

Qwen periodically goes through its saved memories to remove duplicates and clean up outdated entries. This runs automatically in the background once a day after enough sessions have accumulated. You can trigger it manually with /dream if you want it to run now.

While cleanup is running, ✦ dreaming appears in the corner of the screen. Your session continues normally.

Turning it on or off

Auto-memory is on by default. To toggle it, open /memory and use the switches at the top. You can turn off just the automatic saving, just the periodic cleanup, or both.

You can also set them in ~/.qwen/settings.json (applies to all projects) or .qwen/settings.json (this project only):

{
  "memory": {
    "enableManagedAutoMemory": true,
    "enableManagedAutoDream": true
  }
}

Commands

/memory

Opens the Memory panel. From here you can:

  • Turn auto-memory saving on or off
  • Turn periodic cleanup (dream) on or off
  • Open your personal QWEN.md (~/.qwen/QWEN.md)
  • Open the project QWEN.md
  • Browse the auto-memory folder

/init

Generates a starter QWEN.md for your project. Qwen reads your codebase and fills in build commands, test instructions, and conventions it discovers.

/remember <text>

Immediately saves something to auto-memory without waiting for Qwen to pick it up automatically:

/remember always use snake_case for Python variable names
/remember the staging environment is at staging.example.com

/forget <text>

Removes auto-memory entries that match your description:

/forget old workaround for the login bug

/dream

Runs the memory cleanup now instead of waiting for the automatic schedule:

/dream

Troubleshooting

Qwen isn't following my QWEN.md

Open /memory to see which files are loaded. If your file isn't listed, Qwen can't see it — make sure it's in the project root or ~/.qwen/.

Instructions work better when they're specific:

  • Use 2-space indentation for TypeScript files
  • Format code nicely

If you have multiple QWEN.md files with conflicting instructions, Qwen may behave inconsistently. Review them and remove any contradictions.

I want to see what Qwen has saved

Run /memory and select Open auto-memory folder. All saved memories are readable markdown files you can browse, edit, or delete.

Qwen keeps forgetting things

If auto-memory is on but Qwen doesn't seem to remember things across sessions, try running /dream to force a cleanup pass. Also check /memory to confirm both toggles are enabled.

For things you always want Qwen to remember, add them to QWEN.md instead — auto-memory is best-effort, QWEN.md is guaranteed.