# dudu — Claude 项目约定

五端语音输入法：Go 后端 + 桌面(Tauri 2)/Android/iOS/官网。按住快捷键说话 → 流式识别 → 上屏；时长计费，微信/邮箱登录。

## 本地联调启动（两个终端）

前置：`cd server && docker compose up -d`（起 pg/redis）；`rbw unlock`（取 DashScope key）。

```bash
# 终端 A — 后端 API（有 DashScope key 走真实 gummy，无则 mock；mock 邮件固定验证码 888888）
cd server && ./run-dev.sh

# 终端 B — 桌面端（必须从你自己的终端前台跑，麦克风权限才归属该终端）
cd desktop && ./run-dev.sh
```

- dudu 是**托盘应用无主窗口**：菜单栏找蓝底声纹图标，设置/登录从托盘菜单点出。
- **麦克风**：dev 跑裸二进制 `target/debug/dudu-desktop`，权限归属父终端。首次没声音 → 系统设置 → 隐私与安全性 → 麦克风 勾选你的终端 → 完全退出 dudu 重启（TCC 变更需重启进程）。打包版由 `src-tauri/Info.plist` 的 `NSMicrophoneUsageDescription` 触发系统授权框。
- **邮箱登录**：登录窗切「邮箱登录」→ 任意邮箱 → 发送验证码 → 填 **888888**（仅 `AUTH_EMAIL_DEV_CODE` 设置时固定，`run-dev.sh` 已设；生产随机）。

## 真相源（改前必读）

- **协议**：只改 `server/pkg/protocol`，五端对照实现。
- **界面**：`design/` 是唯一真相源，改 UI 前读登记簿 `design/index.html`。新颜色/组件/图标先登记 `design/tokens` | `components`+`index.html` | `icons.js`+`icon-map.json`，再写端代码。业务代码禁字面色（用 `var(--*)`/`DuduTheme`）、禁内联 `<path>`（走 `Icon`）、禁 emoji。
- **令牌 codegen**：`design/tokens` 变更后 `node design-pipeline/export-tokens.mjs`（直写 ios/android/web 消费位置）并提交产物。
- **组件源码变更后**：`node design-pipeline/bundle-components.mjs` 重建原型运行时 `design/_ds_bundle.js` 并提交。
- **防漂移闸**（pre-commit + CI，启用：`git config core.hooksPath .githooks`）：
  `node design-pipeline/check-ds.mjs`（真相源自检）· `check-code.mjs`（代码侧单源）· `export-tokens.mjs --check`（产物零 diff）。
- 全景说明：`doc/frontend-overview.html`；改窗口先看 `design/ui_kits/desktop/`（原型先行）。

## 窗口范式（桌面）

透明无边框窗口共用 `desktop/src/shared/WindowFrame.jsx`：`transparent` + `titleBarStyle:Overlay` + `hiddenTitle` + `trafficLightPosition {18,18}` + macOS 原生阴影；页面自绘圆角边框。识别浮层/托盘/设置/登录均为此范式。**必须开 `macOSPrivateApi:true`**，否则透明窗口画白底。

## TODO

经全局 `/todo` skill 管理（看板 `todo/todo.html`），状态 open→doing→done→(用户)accepted。**禁用内置 TodoWrite。**
