{"repo": "camel-prince/translateapp", "files": {"PROMPT.md": {"b2ed16c9ba3dcab2d5e4aad3ae3780e782f13358": {"t": 1785746542.042506, "n": 2622, "h": "ada8eabf5ebdccac", "c": "# 项目启动 Prompt — 极简划词翻译工具\n\n## 项目概述\n\n构建一个 macOS 极简划词翻译工具,利用本地已部署的 DeepSeek HTTP 代理(`http://localhost:8765/v1/chat/completions`)实现全局划词翻译。要求能在 **任意应用**(WPS、VS Code、Chrome、Safari、Finder、Terminal 等)中通过全局快捷键触发翻译,并以浮窗形式展示结果。\n\n## 技术架构\n\n- **语言**: Swift + AppKit(原生 macOS,轻量无依赖)\n- **翻译后端**: 本地 DeepSeek 代理 `POST http://localhost:8765/v1/chat/completions`\n- **取词方式**: 模拟 Cmd+C 获取选中文本(通过 Pasteboard),无需 Accessibility API 权限\n- **展示方式**: 无边框悬浮 NSPanel,显示在鼠标附近\n- **交互方式**: 全局快捷键 `Option+D`(可自定义)触发翻译\n\n## API 调用规格\n\n```bash\ncurl -X POST http://localhost:8765/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer sk-placeholder\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [\n {\"role\": \"system\", \"content\": \"你是一个翻译助手。将用户输入翻译为中文(如果输入是中文则翻译为英文)。只输出翻译结果,不要解释。\"},\n {\"role\": \"user\", \"content\": \"要翻译的文本\"}\n ],\n \"max_tokens\": 2048,\n \"stream\": false\n }'\n```\n\n- Authorization header 中的 key 可以是任意值(代理会覆盖为真实 key)\n- `stream: false` 简化实现,一次性返回结果\n- 响应格式为标准 OpenAI `choices[0].message.content`\n\n## 核心功能需求\n\n### 1. 全局快捷键监听\n- 注册全局热键 `Option+D`\n- 使用 `CGEvent` tap 或 `NSEvent.addGlobalMonitorForEvents` 实现\n- 需要在 Info.plist 声明辅助功能权限(或引导用户授权)\n\n### 2. 获取选中文本\n- 触发快捷键后:\n 1. 保存当前剪贴板内容\n 2. 模拟 `Cmd+C`(使用 CGEvent 模拟按键)\n 3. 短暂延迟(50-100ms)后读取剪贴板\n 4. 恢复原始剪贴板内容\n- 如果剪贴板无变化(未选中文本),不做任何操作\n\n### 3. 翻译请求\n- 检测输入语言:纯 ASCII/拉丁字符 → 翻译为中文;含 CJK 字符 → 翻译为英文\n- 调用本地代理 API,超时 10 秒\n- 支持翻译中显示 loading 状态\n\n### 4. 结果展示浮窗\n- 无标题栏 NSPanel(`NSPanel.StyleMask = [.nonactivatingPanel, .borderless]`)\n- 圆角 + 阴影 + 半透明背景(vibrancy effect)\n- 显示位置:鼠标光标附近(避免超出屏幕)\n- 内容:原文(灰色小字)+ 译文(正常大小)\n- 点击浮窗外任意位置自动关闭\n- 按 Esc 关闭\n- 支持选中译文复制\n\n### 5. 菜单栏图标\n- 状态栏显示一个翻译图标(📖 或自定义 SF Symbol)\n- 右键菜单:「设置快捷键」「退出」\n- 左键单击:无操作或显示最近翻译\n\n## 项目结构\n\n```\ntranslate/\n├── TranslateApp/\n│ ├── AppDelegate.swift # 应用入口,菜单栏图标\n│ ├── HotkeyManager.swift # 全局快捷键注册与监听\n│ ├── TextGrabber.swift # 模拟 Cmd+C 获取选中文本\n│ ├── TranslateService.swift # 调用 DeepSeek API\n│ ├── PopupPanel.swift # 悬浮翻译结果窗口\n│ ├── Assets.xcassets/ # 图标资源\n│ └── Info.plist # 权限声明\n├── TranslateApp.xcodeproj/\n└── README.md\n```\n\n## 非功能需求\n\n- **极简**:无多余功能,启动即用,代码量控制在 500 行以内\n- **低资源占用**:常驻内存 < 20MB,无 Electron/WebView\n- **快速响应**:从按下快捷键到显示结果 < 2 秒(取决于 API 延迟)\n- **无需配置**:硬编码 `localhost:8765`,开箱即用\n- **macOS 13+**:使用现代 Swift 并发(async/await)\n\n## 注意事项\n\n1. 模拟按键需要「辅助功能」权限,首次启动需引导用户在系统设置中授权\n2. 浮窗使用 `.nonactivatingPanel` 确保不抢焦点(用户可以继续在原 App 操作)\n3. 剪贴板操作要做好 save/restore,避免覆盖用户正在使用的剪贴板内容\n4. API 请求失败时显示简短错误提示(如\"翻译服务不可用\")\n5. 应用应作为 LSUIElement(后台应用),不显示 Dock 图标\n\n## 启动指令\n\n请先创建完整的 Xcode 项目结构,实现上述所有功能。优先确保核心流程跑通(快捷键 → 取词 → 翻译 → 浮窗),再美化 UI。\n"}, "c6b0ce6b8f2af04a9fb0801e41beadb73762a778": {"t": 1785765475.1436963, "n": 2622, "h": "ada8eabf5ebdccac", "c": "# 项目启动 Prompt — 极简划词翻译工具\n\n## 项目概述\n\n构建一个 macOS 极简划词翻译工具,利用本地已部署的 DeepSeek HTTP 代理(`http://localhost:8765/v1/chat/completions`)实现全局划词翻译。要求能在 **任意应用**(WPS、VS Code、Chrome、Safari、Finder、Terminal 等)中通过全局快捷键触发翻译,并以浮窗形式展示结果。\n\n## 技术架构\n\n- **语言**: Swift + AppKit(原生 macOS,轻量无依赖)\n- **翻译后端**: 本地 DeepSeek 代理 `POST http://localhost:8765/v1/chat/completions`\n- **取词方式**: 模拟 Cmd+C 获取选中文本(通过 Pasteboard),无需 Accessibility API 权限\n- **展示方式**: 无边框悬浮 NSPanel,显示在鼠标附近\n- **交互方式**: 全局快捷键 `Option+D`(可自定义)触发翻译\n\n## API 调用规格\n\n```bash\ncurl -X POST http://localhost:8765/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer sk-placeholder\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [\n {\"role\": \"system\", \"content\": \"你是一个翻译助手。将用户输入翻译为中文(如果输入是中文则翻译为英文)。只输出翻译结果,不要解释。\"},\n {\"role\": \"user\", \"content\": \"要翻译的文本\"}\n ],\n \"max_tokens\": 2048,\n \"stream\": false\n }'\n```\n\n- Authorization header 中的 key 可以是任意值(代理会覆盖为真实 key)\n- `stream: false` 简化实现,一次性返回结果\n- 响应格式为标准 OpenAI `choices[0].message.content`\n\n## 核心功能需求\n\n### 1. 全局快捷键监听\n- 注册全局热键 `Option+D`\n- 使用 `CGEvent` tap 或 `NSEvent.addGlobalMonitorForEvents` 实现\n- 需要在 Info.plist 声明辅助功能权限(或引导用户授权)\n\n### 2. 获取选中文本\n- 触发快捷键后:\n 1. 保存当前剪贴板内容\n 2. 模拟 `Cmd+C`(使用 CGEvent 模拟按键)\n 3. 短暂延迟(50-100ms)后读取剪贴板\n 4. 恢复原始剪贴板内容\n- 如果剪贴板无变化(未选中文本),不做任何操作\n\n### 3. 翻译请求\n- 检测输入语言:纯 ASCII/拉丁字符 → 翻译为中文;含 CJK 字符 → 翻译为英文\n- 调用本地代理 API,超时 10 秒\n- 支持翻译中显示 loading 状态\n\n### 4. 结果展示浮窗\n- 无标题栏 NSPanel(`NSPanel.StyleMask = [.nonactivatingPanel, .borderless]`)\n- 圆角 + 阴影 + 半透明背景(vibrancy effect)\n- 显示位置:鼠标光标附近(避免超出屏幕)\n- 内容:原文(灰色小字)+ 译文(正常大小)\n- 点击浮窗外任意位置自动关闭\n- 按 Esc 关闭\n- 支持选中译文复制\n\n### 5. 菜单栏图标\n- 状态栏显示一个翻译图标(📖 或自定义 SF Symbol)\n- 右键菜单:「设置快捷键」「退出」\n- 左键单击:无操作或显示最近翻译\n\n## 项目结构\n\n```\ntranslate/\n├── TranslateApp/\n│ ├── AppDelegate.swift # 应用入口,菜单栏图标\n│ ├── HotkeyManager.swift # 全局快捷键注册与监听\n│ ├── TextGrabber.swift # 模拟 Cmd+C 获取选中文本\n│ ├── TranslateService.swift # 调用 DeepSeek API\n│ ├── PopupPanel.swift # 悬浮翻译结果窗口\n│ ├── Assets.xcassets/ # 图标资源\n│ └── Info.plist # 权限声明\n├── TranslateApp.xcodeproj/\n└── README.md\n```\n\n## 非功能需求\n\n- **极简**:无多余功能,启动即用,代码量控制在 500 行以内\n- **低资源占用**:常驻内存 < 20MB,无 Electron/WebView\n- **快速响应**:从按下快捷键到显示结果 < 2 秒(取决于 API 延迟)\n- **无需配置**:硬编码 `localhost:8765`,开箱即用\n- **macOS 13+**:使用现代 Swift 并发(async/await)\n\n## 注意事项\n\n1. 模拟按键需要「辅助功能」权限,首次启动需引导用户在系统设置中授权\n2. 浮窗使用 `.nonactivatingPanel` 确保不抢焦点(用户可以继续在原 App 操作)\n3. 剪贴板操作要做好 save/restore,避免覆盖用户正在使用的剪贴板内容\n4. API 请求失败时显示简短错误提示(如\"翻译服务不可用\")\n5. 应用应作为 LSUIElement(后台应用),不显示 Dock 图标\n\n## 启动指令\n\n请先创建完整的 Xcode 项目结构,实现上述所有功能。优先确保核心流程跑通(快捷键 → 取词 → 翻译 → 浮窗),再美化 UI。\n"}}}}