一个面向 Linux 的 Codex CLI 桌面客户端基础框架。项目使用 Tauri 2、React、TypeScript、Vite、Tailwind CSS 和 Rust 构建,当前 MVP 已打通项目、Task、SQLite 映射与 Codex App Server 长连接调用链路。
- 可运行的 Tauri 2 Linux 桌面窗口
- Oxidex 无边框桌面 UI,支持跟随系统、亮色和暗色主题
Ctrl +/Ctrl -全局缩放界面,Ctrl 0恢复 100%,缩放级别自动记忆- 项目/Task 树、HOME 临时 Task、标题搜索和前进/后退导航
commands → services → storageRust 分层架构- Linux 配置文件和 SQLite 数据库自动初始化
- 项目与 Task 映射持久化;对话上下文和历史由 Codex thread 维护
- 单个共享
codex app-server进程,每个 Task 独立 thread/resume,可并行执行 - 同一 Task 工作期间可通过
turn/steer继续补充要求 - 实时展示 thinking 摘要、命令、文件修改、工具与 Agent 状态;最终答复开始后自动折叠
- 命令、文件修改和额外权限的交互式审批
- 通过 GitHub CLI 聚合 PR、查看 diff/评审、检出分支,并管理本地 Git 变更
- 统一的 Rust/TypeScript 错误边界
- Rust 配置、数据库、进程测试和 React 组件渲染测试
本阶段不包含 Web UI、MCP、Worktree 自动化、多 Agent、PTY、Monaco 或 PR Merge。
- Node.js 20+
- pnpm 10+
- Rust stable
- 已安装并登录的 Codex CLI(
codex --version) - 使用 Pull requests 工作区时需安装并登录 GitHub CLI(
gh auth login) - Tauri 2 Linux 系统依赖
Debian、Ubuntu 和 Linux Mint 可安装:
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev其他发行版请参考 Tauri 2 Linux prerequisites。
corepack enable
pnpm install
pnpm tauri dev首次向 Codex 发送任务前,确认 CLI 已完成认证:
codex login
codex --version应用中的 “Add project” 会打开目录选择器。New task 是前端草稿,发送第一条消息时才会持久化并在项目目录创建 Codex thread;未选择项目时 Task 使用用户 HOME 目录。切换到其他 Task 不会中止当前工作,每个活跃 Task 都会独立更新状态和事件。
Pull requests 会聚合所有已注册 Git 项目。行级反馈只会创建本地 Codex Task,不会发布 GitHub 评论;检出 PR 时若工作区不干净会被阻止,应用不提供 Merge 操作。
应用首次启动时自动创建:
~/.config/codex-linux-desktop/
├── config.json
└── database.sqlite
默认配置:
{
"codex_path": "codex",
"theme": "light",
"data_dir": "/home/your-user/.config/codex-linux-desktop"
}When codex_path is a bare command such as codex, Oxidex searches the process PATH and common
Linux user installation directories including ~/.npm-global/bin, ~/.local/bin,
~/.local/share/pnpm, ~/.bun/bin, and ~/.cargo/bin. This keeps application-menu launches
working even when the desktop session has a smaller PATH than the user's interactive shell.
codex_path 可设为 CLI 的绝对路径;theme 默认为 light,也可在应用标题栏切换为 system 或 dark;data_dir 决定 SQLite 数据库位置。
SQLite 只保存 Project、Task 配置以及 task → Codex thread id 映射,不复制 Codex 对话正文,因此不存在两套上下文互相漂移的问题。升级到 App Server 架构时会先创建 database.sqlite.pre-app-server.bak,然后清理旧版 Task/message 行并保留 Project。
# Frontend
pnpm lint
pnpm test
pnpm build
# Rust core tests(不依赖 WebKitGTK,适合 CI)
cargo test --manifest-path apps/desktop/src-tauri/Cargo.toml \
--lib --no-default-features
# 完整桌面构建
pnpm tauri build代码格式:
pnpm format
cargo fmt --manifest-path apps/desktop/src-tauri/Cargo.tomlcodex-linux-desktop/
├── apps/
│ └── desktop/
│ ├── src/ # React renderer
│ │ ├── components/
│ │ ├── pages/
│ │ ├── hooks/
│ │ ├── stores/
│ │ └── utils/
│ └── src-tauri/
│ └── src/
│ ├── commands/ # Tauri IPC
│ ├── services/ # Business rules
│ ├── storage/ # SQLite repositories
│ ├── config/ # Linux configuration
│ └── codex/ # Codex process adapter
├── packages/
│ └── shared/ # Future desktop/web shared code
└── docs/
前端只通过 src/utils/desktop-api.ts 访问 Tauri IPC。Rust command 不直接编写数据库逻辑,而是调用 service,再由 service 使用 storage。更完整的设计说明见 docs/architecture.md。
应用按需启动一个长生命周期进程:
codex app-server --listen stdio://
Oxidex 通过 JSONL 双向协议使用 thread/start、thread/resume、turn/start 和 turn/steer。每个 Task 对应一个 Codex thread;所有 Task 共享 transport,但 turn、事件、审批和运行状态都按 Task 隔离。窗口退出时会中止活跃 turn 并关闭 transport,thread 仍由 Codex 保存,下一次启动可继续 resume。PTY 终端仍留待 Phase 2。
GPL-3.0-or-later. See LICENSE.