# 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`)、禁内联 ``(走 `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。**