# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Structure - **Backend**: `worker/` — Cloudflare Workers API using Hono framework. Entry: `worker/src/worker.ts`, APIs under `worker/src/*_api/`. - **Frontend**: `frontend/` — Vue 3 + Naive UI app deployed to Cloudflare Pages. Routes in `frontend/src/router/`. - **Pages middleware**: `pages/functions/_middleware.js` — Routes API calls to Worker backend. - **Mail parser**: `mail-parser-wasm/` — Rust WASM email parser. - **SMTP/IMAP proxy**: `smtp_proxy_server/` — Python proxy server. - **DB schema/migrations**: `db/` — SQLite via Cloudflare D1, dated migration patches. - **Docs**: `vitepress-docs/` — VitePress documentation site (zh + en). - **E2E tests**: `e2e/` — Playwright tests in Docker Compose (API, browser, SMTP proxy). - **Changelogs**: `CHANGELOG.md` (中文) + `CHANGELOG_EN.md` (English). ## Build & Dev Commands Run inside each subfolder with `pnpm`: | Folder | Dev | Build | Lint | Deploy | |--------|-----|-------|------|--------| | `worker/` | `pnpm dev` | `pnpm build` | `pnpm lint` | `pnpm deploy` | | `frontend/` | `pnpm dev` | `pnpm build` | — | `pnpm deploy` | | `vitepress-docs/` | `pnpm dev` | `pnpm build` | — | — | | `mail-parser-wasm/` | — | `wasm-pack build --release` | — | — | SMTP proxy: `pip install -r smtp_proxy_server/requirements.txt` then `python smtp_proxy_server/main.py`. ## E2E Tests Tests run in Docker Compose with Playwright. From `e2e/`: ```bash npm test # Build, run all tests, exit npm run test:down # Clean up containers ``` Test categories: `tests/api/` (API tests), `tests/browser/` (UI tests with Chromium), `tests/smtp-proxy/` (SMTP/IMAP proxy tests). The Docker frontend serves over **HTTPS** (self-signed cert) with Vite proxy to worker — required for WebAuthn (`navigator.credentials`) and `crypto.subtle` which need a secure context. Browser tests use `ignoreHTTPSErrors: true`. Key patterns for browser tests: - Frontend hashes passwords with SHA-256 (`crypto.subtle`) before sending — API test registration must use pre-hashed passwords if UI login is needed. - VueUse `useStorage('key', '')` with string default uses **raw string** serialization — set localStorage with raw value, not `JSON.stringify()`. - WebAuthn browser tests use CDP virtual authenticator (`WebAuthn.enable` + `WebAuthn.addVirtualAuthenticator`). ## Architecture ### Worker Auth Flow (`worker/src/worker.ts`) Three auth layers applied via Hono middleware, each using different headers: | Path prefix | Header | Purpose | |-------------|--------|---------| | `/api/*` | `Authorization: Bearer ` | Address (mailbox) credential | | `/user_api/*` | `x-user-token` | User account JWT | | `/admin/*` | `x-admin-auth` | Admin password | | (any) | `x-user-access-token` | User role-based access token | | (any) | `x-custom-auth` | Optional global access password | | (any) | `x-lang` | Language preference (`en`/`zh`) | Public endpoints (no auth): `/open_api/*`, `/user_api/login`, `/user_api/register`, `/user_api/passkey/authenticate_*`, `/user_api/oauth2/*`. ### Worker Email Flow (`worker/src/email/`) Cloudflare Email Worker entry: `email()` in `worker/src/email/index.ts`. Processing pipeline: 1. Parse raw email → check junk → check address exists 2. Auto-reply if configured → forward if configured → webhook if enabled 3. Store in D1 database ### Frontend State (`frontend/src/store/index.js`, `frontend/src/api/index.js`) Global state via VueUse `useStorage` for persistence. The `api` module wraps axios with auto-attached auth headers and fingerprinting. API base URL comes from `VITE_API_BASE` env var (empty = same origin). ## Coding Style - `worker/` uses TypeScript + ESLint; `frontend/` uses Vue SFCs. - Keep existing naming patterns: `*_api/` folders, `utils/`, `models/`. - ESM imports only (`type: module`). ## Commits & PRs - Use Conventional Commits: `feat:`, `fix:`, `docs:`, `style:`, `refactor:`, `perf:`. - PRs should explain scope; add screenshots for UI changes. - Use squash merge for PRs. ## Post-Task Checklist (IMPORTANT) After completing any feature, bug fix, or improvement, **always check**: 1. **CHANGELOG.md** (中文) and **CHANGELOG_EN.md** (English) — both must be updated under the current `(main)` version section with the change entry. Follow the existing format: `- feat/fix/docs: |模块| 描述`. 2. **Documentation** — if the change involves new environment variables, new API endpoints, or configuration changes, update the corresponding docs in `vitepress-docs/docs/zh/` and `vitepress-docs/docs/en/`. Key files: - `guide/worker-vars.md` — Worker environment variables - `guide/ui/` — Frontend deployment docs - `guide/feature/` — Feature-specific docs - `api/` — API reference docs 3. **Both languages** — docs and changelogs exist in Chinese and English; always update both. ## Config - Worker settings in `worker/wrangler.toml` (see `wrangler.toml.template` for bindings). - Frontend uses `VITE_*` env vars. Don't commit secrets.