Files
ai-terminal-assistant/packages/desktop/README.zh-CN.md
T
2025-12-12 15:31:38 +08:00

436 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# @ai-assistant/desktop
AI Terminal Assistant 的原生桌面应用 - 基于 Tauri 构建,实现跨平台支持。
## 📦 安装
```bash
# 安装依赖
pnpm install
# 开发
pnpm dev
# 构建当前平台版本
pnpm build
# 构建所有平台版本
pnpm build:all
```
## 🌟 功能特性
- **原生性能** - 使用 Rust 和 Tauri 构建,速度极快
- **跨平台** - 支持 Windows、macOS 和 Linux
- **小体积** - ~10MB 安装包,~30MB 安装后大小
- **系统集成** - 原生菜单、通知和系统托盘
- **默认安全** - 沙盒化,最小权限
- **自动更新** - 内置更新机制
- **本地存储** - 使用 SQLite 存储离线数据
- **基于 WebView** - 现代 Web UI 配合原生包装
- **全局快捷键** - 系统级键盘快捷键
- **文件系统访问** - 原生文件对话框和操作
## 🏗️ 架构
```
src-tauri/
├── src/
│ ├── main.rs # 主入口点
│ ├── app.rs # 应用设置
│ ├── commands/ # Tauri 命令
│ │ ├── chat.rs # 对话操作
│ │ ├── file.rs # 文件操作
│ │ ├── system.rs # 系统集成
│ │ └── window.rs # 窗口管理
│ ├── menu.rs # 原生菜单设置
│ ├── tray.rs # 系统托盘
│ ├── updater.rs # 自动更新逻辑
│ ├── store.rs # 本地数据存储
│ └── utils/ # 工具函数
├── Cargo.toml # Rust 依赖
├── tauri.conf.json # Tauri 配置
└── icons/ # 应用图标
src/
├── App.tsx # React 应用入口
├── components/ # UI 组件(与 web 共享)
├── hooks/ # 自定义 Hooks
├── services/ # 桌面特定服务
│ ├── ipc.ts # Tauri IPC 通信
│ ├── storage.ts # 本地存储
│ └── shortcuts.ts # 键盘快捷键
└── styles/ # 桌面特定样式
```
## 🚀 快速开始
### 前置要求
- **Node.js** 18+ 和 pnpm
- **Rust** 1.70+(从 [rustup.rs](https://rustup.rs) 安装)
- **平台工具**
- **Windows**Visual Studio C++ 生成工具
- **macOS**Xcode 命令行工具
- **Linux**`build-essential``libwebkit2gtk-4.0-dev``libssl-dev`
### 开发设置
```bash
# 克隆仓库
git clone <repository-url>
cd ai-terminal-assistant/packages/desktop
# 安装依赖
pnpm install
# 启动开发服务器
pnpm dev
# 应用将自动打开,支持热重载
```
### 生产构建
```bash
# 构建当前平台
pnpm build
# 构建特定平台
pnpm build:windows
pnpm build:mac
pnpm build:linux
# 构建 macOS 通用二进制文件
pnpm build:mac-universal
# 构建并签名(需要证书)
pnpm build:signed
```
## 🖥️ 平台功能
### Windows
- **安装程序类型**:MSI、NSIS、便携版
- **系统启动时自动启动**
- **Windows Store** 分发就绪
- **原生通知**
- **跳转列表**集成
### macOS
- **格式**DMG、App Bundle
- **代码签名**和公证
- **macOS App Store** 就绪
- **Touch Bar** 支持
- **原生菜单栏**
### Linux
- **包格式**AppImage、Deb、RPM
- **系统托盘**支持
- **桌面条目**创建
- **Snap/Flatpak** 就绪
- **Wayland/X11** 兼容
## ⚙️ 配置
### Tauri 配置
`src-tauri/tauri.conf.json`
```json
{
"package": {
"productName": "AI Terminal Assistant",
"version": "1.0.0"
},
"tauri": {
"allowlist": {
"all": false,
"shell": {
"execute": true,
"open": true
},
"fs": {
"all": true,
"scope": ["$HOME/**", "$RESOURCE/**"]
},
"http": {
"all": true,
"scope": ["http://localhost/*", "https://api.anthropic.com/*"]
},
"notification": {
"all": true
},
"globalShortcut": {
"all": true
}
},
"windows": [{
"title": "AI Terminal Assistant",
"width": 1200,
"height": 800,
"resizable": true,
"fullscreen": false
}],
"systemTray": {
"iconPath": "icons/icon.png",
"menuOnLeftClick": false
},
"updater": {
"active": true,
"endpoints": ["https://updates.example.com/check"]
}
}
}
```
## 🔌 Tauri 命令
### IPC 通信
```typescript
// 前端(TypeScript
import { invoke } from '@tauri-apps/api/tauri';
// 调用 Rust 命令
const result = await invoke('send_message', {
message: '来自前端的消息'
});
// 监听事件
import { listen } from '@tauri-apps/api/event';
const unlisten = await listen('chat-update', (event) => {
console.log('新消息:', event.payload);
});
```
```rust
// 后端(Rust
#[tauri::command]
fn send_message(message: String) -> Result<String, String> {
// 处理消息
Ok(format!("收到: {}", message))
}
// 发送事件
app.emit_all("chat-update", Payload {
message: "新更新"
}).unwrap();
```
## 🎨 原生功能
### 系统托盘
```typescript
import { createTray } from './services/tray';
const tray = await createTray({
icon: '/icons/tray.png',
menu: [
{ label: '显示', action: () => showWindow() },
{ label: '隐藏', action: () => hideWindow() },
{ separator: true },
{ label: '退出', action: () => app.quit() }
]
});
```
### 全局快捷键
```typescript
import { register } from '@tauri-apps/api/globalShortcut';
// 注册全局热键
await register('CommandOrControl+Shift+A', () => {
console.log('快捷键触发!');
window.show();
});
```
### 文件操作
```typescript
import { open, save } from '@tauri-apps/api/dialog';
import { readTextFile, writeFile } from '@tauri-apps/api/fs';
// 打开文件对话框
const selected = await open({
multiple: false,
filters: [{
name: '文本',
extensions: ['txt', 'md']
}]
});
// 读取文件
const content = await readTextFile(selected);
// 保存文件对话框
const savePath = await save({
filters: [{ name: '文本', extensions: ['txt'] }]
});
await writeFile(savePath, '内容');
```
### 通知
```typescript
import { sendNotification } from '@tauri-apps/api/notification';
await sendNotification({
title: 'AI Assistant',
body: '任务成功完成!',
icon: '/icons/icon.png'
});
```
## 🔐 安全
### 权限
- 最小权限模型
- 限定范围的文件系统访问
- 受控的 Shell 执行
- 强制 CSP 头
### 代码签名
```bash
# macOS
codesign --deep --force --verify --verbose \
--sign "Developer ID Application: Your Name" \
target/release/bundle/osx/AI\ Terminal\ Assistant.app
# Windows(使用 SignTool
signtool sign /a /tr http://timestamp.digicert.com \
/td SHA256 /fd SHA256 \
target/release/bundle/msi/AI_Terminal_Assistant.msi
```
## 🚢 分发
### 自动更新
```rust
// src-tauri/src/updater.rs
use tauri::updater::builder::UpdateBuilder;
pub fn check_for_updates(app: &tauri::App) {
let update = UpdateBuilder::new()
.current_version(&app.package_info().version)
.url("https://updates.example.com/check")
.build()
.unwrap();
if update.should_update {
update.download_and_install().unwrap();
}
}
```
### GitHub 发布
```yaml
# .github/workflows/release.yml
name: Release
on:
push:
tags: ['v*']
jobs:
release:
strategy:
matrix:
platform: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v3
- uses: tauri-apps/tauri-action@v0
with:
tagName: v__VERSION__
releaseName: 'v__VERSION__'
releaseBody: '查看 CHANGELOG.md'
releaseDraft: true
prerelease: false
```
## 🧪 测试
```bash
# 单元测试(Rust
cd src-tauri
cargo test
# 集成测试
pnpm test:integration
# 使用 WebDriver 的端到端测试
pnpm test:e2e
```
## 📊 性能
### 优化技巧
1. **懒加载** - 按需加载功能
2. **IPC 批处理** - 批量处理多个命令
3. **资源优化** - 压缩图片/字体
4. **内存管理** - 清理监听器
5. **后台任务** - 使用 Web Workers
### 基准测试
| 指标 | 值 |
|--------|-------|
| 启动时间 | < 500ms |
| 内存使用 | ~50MB 空闲 |
| 包大小 | ~10MB 压缩 |
| CPU 使用 | < 5% 空闲 |
## 🐛 调试
### 开发工具
```bash
# 启用开发工具
pnpm dev -- --features devtools
# Rust 调试
RUST_LOG=debug pnpm dev
# WebView 调试
# 在应用窗口中按 F12
```
### 日志记录
```rust
// Rust 日志
use log::{info, error};
info!("应用已启动");
error!("加载失败: {}", error);
```
```typescript
// 前端日志
import { info, error } from '@tauri-apps/api/log';
await info('应用已启动');
await error(`加载失败: ${error}`);
```
## 🤝 贡献
请查看主仓库的贡献指南了解详情。
## 📄 许可证
MIT 许可证 - 查看 [LICENSE](../../LICENSE) 了解详情。
## 🔗 链接
- [主仓库](https://github.com/username/ai-terminal-assistant)
- [Tauri 文档](https://tauri.app/v1/guides/)
- [下载发布版](https://github.com/username/ai-terminal-assistant/releases)