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

114 lines
5.3 KiB
Markdown

# 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.