Skip to content

Repository files navigation

Codex Linux Desktop

一个面向 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 → storage Rust 分层架构
  • 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,也可在应用标题栏切换为 systemdarkdata_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.toml

架构

codex-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 执行策略

应用按需启动一个长生命周期进程:

codex app-server --listen stdio://

Oxidex 通过 JSONL 双向协议使用 thread/startthread/resumeturn/startturn/steer。每个 Task 对应一个 Codex thread;所有 Task 共享 transport,但 turn、事件、审批和运行状态都按 Task 隔离。窗口退出时会中止活跃 turn 并关闭 transport,thread 仍由 Codex 保存,下一次启动可继续 resume。PTY 终端仍留待 Phase 2。

License

GPL-3.0-or-later. See LICENSE.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages