qwen-code/design/qwen-code-electron-desktop-implementation-plan.md

5.3 KiB

Qwen Code Electron Desktop Implementation Plan

This plan tracks the incremental MVP implementation for the Electron desktop client described in docs/design/qwen-code-electron-desktop/qwen-code-electron-desktop-architecture.md. The architecture document remains the source of truth; this file records execution order, verification, decisions, and remaining work.

Ground Rules

  • Use Electron only; do not introduce Tauri.
  • Keep Electron main thin: windows, native IPC, local server lifecycle, and ACP process lifecycle.
  • Reuse Qwen Code ACP, core configuration/auth/session/permission behavior, and shared web UI surfaces where practical.
  • Renderer must use nodeIntegration: false, context isolation, and a preload whitelist.
  • The local server must bind only 127.0.0.1, use a random token, and reject unauthorized requests.
  • Every completed slice must leave targeted verification and a conventional commit.

Codex Alignment Progress

Active Slice: Composer-First Thread Creation Alignment

Status: completed in iteration 2.

Goal: let a user open a project and type immediately, without first learning that they must create or select a session.

User-visible value: the default path becomes Open project -> type request -> agent works; the composer explains the active project context and creates the backing desktop session on first send.

Expected files:

  • packages/desktop/src/renderer/App.tsx
  • packages/desktop/src/renderer/components/layout/WorkspacePage.tsx
  • packages/desktop/src/renderer/components/layout/ChatThread.tsx
  • packages/desktop/src/renderer/components/layout/WorkspacePage.test.tsx
  • packages/desktop/src/renderer/styles.css
  • packages/desktop/scripts/e2e-cdp-smoke.mjs
  • .qwen/e2e-tests/electron-desktop/composer-first-thread-creation.md

Acceptance criteria:

  • Composer is enabled whenever a project is active, even when no session is selected.
  • With no project, composer remains disabled and gives a clear disabled reason.
  • First send from a project with no selected session creates a desktop session, sends the message, clears the composer, and publishes the created thread.
  • Existing explicit New Thread behavior continues to work.
  • The composer visibly carries compact project/branch, permission, and model context so it reads as the task control center rather than a plain textarea.
  • Enter send and Shift+Enter newline behavior are preserved.

Verification:

  • Unit/component test command: cd packages/desktop && SHELL=/bin/bash npx vitest run src/renderer/components/layout/WorkspacePage.test.tsx
  • Build/typecheck/lint commands: cd packages/desktop && npm run typecheck && npm run lint && npm run build
  • Real Electron harness: cd packages/desktop && npm run e2e:cdp
  • Harness path: packages/desktop/scripts/e2e-cdp-smoke.mjs
  • E2E scenario steps: launch real Electron with isolated HOME/runtime/user-data and fake ACP, open the fake Git project, type a prompt into the project-scoped composer without clicking New Thread, send it, approve the fake command request, and assert the created thread/message/response appear.
  • E2E assertions: first viewport landmarks stay present; composer is enabled after project open; no New Thread click is required; fake ACP response is received; console errors and failed local requests are absent.
  • Diagnostic artifacts: CDP screenshots, layout JSON, DOM text, Electron log, summary JSON under .qwen/e2e-tests/electron-desktop/artifacts/.
  • Required skills applied: frontend-design for composer layout/control hierarchy with the prototype as the strict visual contract; electron-desktop-dev for renderer changes and real Electron CDP verification.

Notes and decisions:

  • The prototype wins over earlier tab/dashboard guidance. This slice keeps the conversation as the default surface and upgrades the bottom composer without opening review, terminal, or settings by default.
  • Model and permission controls are compact context controls in the composer. They use existing session runtime state when available and safe fallback labels before a session exists; changing values still requires a live session until the server API supports project-level defaults.
  • Implementation changed first-send behavior so any active project with no active session creates a session on submit. The explicit New Thread button still creates a draft thread for users who want to start intentionally from the sidebar.
  • CDP smoke now sends the first prompt immediately after opening the fake project and before clicking Changes, proving the New Thread click is no longer required.

Verification results:

  • cd packages/desktop && SHELL=/bin/bash npx vitest run src/renderer/components/layout/WorkspacePage.test.tsx passed with 4 tests.
  • cd packages/desktop && npm run typecheck passed.
  • cd packages/desktop && npm run lint passed.
  • cd packages/desktop && npm run build passed.
  • cd packages/desktop && npm run e2e:cdp passed.
  • Passing artifacts: .qwen/e2e-tests/electron-desktop/artifacts/2026-04-25T16-41-09-752Z/.

Next work:

  • Continue prototype fidelity by reducing topbar tab weight and moving review access toward compact icon/drawer behavior.
  • Follow-up model configuration work should make composer model/permission controls editable before a session exists by persisting project-level defaults, rather than only reflecting live session runtime state.