mirror of
https://github.com/yynxxxxx/Codex-X.git
synced 2026-10-18 05:59:23 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
964151d479 | ||
|
|
5f1c510dd2 | ||
|
|
686f2b4e18 | ||
|
|
7cd783b786 |
@@ -16,7 +16,13 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [macos-latest, ubuntu-22.04, windows-latest]
|
||||
include:
|
||||
- platform: macos-latest
|
||||
args: --bundles dmg
|
||||
- platform: ubuntu-22.04
|
||||
args: --bundles deb,rpm
|
||||
- platform: windows-latest
|
||||
args: --bundles msi
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -47,6 +53,11 @@ jobs:
|
||||
- name: Setup Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
|
||||
- name: Rust cache
|
||||
uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: apps/desktop/src-tauri
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
@@ -62,9 +73,10 @@ jobs:
|
||||
Codex-X desktop release.
|
||||
|
||||
- macOS: `.dmg`
|
||||
- Windows: `.msi` / `.exe`
|
||||
- Linux: `.AppImage` / `.deb` / `.rpm`
|
||||
- Windows: `.msi`
|
||||
- Linux: `.deb` / `.rpm`
|
||||
|
||||
GitHub 会自动附带 Source code (zip/tar.gz)。
|
||||
releaseDraft: false
|
||||
prerelease: false
|
||||
args: ${{ matrix.args }}
|
||||
|
||||
@@ -1,22 +1,120 @@
|
||||
# Codex-X
|
||||
<div align="center">
|
||||
<img src="apps/desktop/src-tauri/icons/icon.png" alt="Codex-X Logo" width="160" />
|
||||
|
||||
Codex-X 是一个面向 OpenAI Codex / Codex CLI 的跨平台桌面配置管理器,用来可视化管理 Codex 的供应商、`config.toml`、`auth.json` 和指令提示词。
|
||||
# Codex-X
|
||||
|
||||
> 当前桌面端基于 **Tauri 2 + React + TypeScript + Rust + SQLite**。
|
||||
**Codex 提示词注入与配置切换管理器**
|
||||
|
||||
## 功能
|
||||
一款面向 **OpenAI Codex / Codex CLI** 的跨平台桌面工具,重点提供 `gpt5.5-unrestricted.md` 指令提示词注入、Provider 切换、官方 Auth 管理与 TOML 可视化编辑。
|
||||
|
||||
- **供应商管理**:添加、编辑、切换 Codex 第三方 API Provider。
|
||||
- **官方配置**:查看/编辑 OpenAI Official 的 `auth.json` 与官方模型配置。
|
||||
- **TOML 编辑**:在供应商编辑页直接编辑并保存完整 `config.toml`。
|
||||
- **指令提示词管理**:管理多个 `model_instructions_file` 模板,支持自定义提示词、启用、禁用。
|
||||
- **cc-switch 导入**:从本机 cc-switch SQLite 数据库导入 Codex Provider。
|
||||
- **跨平台路径**:默认读取 `CODEX_HOME`,否则使用用户目录下的 `.codex`。
|
||||
- **更新检查**:通过 GitHub Releases 检测最新版本。
|
||||
<p>
|
||||
<img src="https://img.shields.io/github/v/release/yynxxxxx/Codex-X?label=version&color=blue" alt="version" />
|
||||
<img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-555" alt="platform" />
|
||||
<img src="https://img.shields.io/badge/built%20with-Tauri%202-24C8DB" alt="tauri" />
|
||||
<img src="https://img.shields.io/badge/license-MIT-green" alt="license" />
|
||||
</p>
|
||||
|
||||
## 配置文件位置
|
||||
<p>
|
||||
<img src="https://img.shields.io/badge/React-18-61DAFB?logo=react&logoColor=white" />
|
||||
<img src="https://img.shields.io/badge/TypeScript-5-3178C6?logo=typescript&logoColor=white" />
|
||||
<img src="https://img.shields.io/badge/Rust-stable-000000?logo=rust&logoColor=white" />
|
||||
<img src="https://img.shields.io/badge/SQLite-Ready-003B57?logo=sqlite&logoColor=white" />
|
||||
<img src="https://img.shields.io/badge/Vite-Ready-646CFF?logo=vite&logoColor=white" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
Codex-X 默认读写:
|
||||
---
|
||||
|
||||
## Codex-X 是什么?
|
||||
|
||||
Codex-X 不是单纯的配置文件编辑器,而是一个更偏向「Codex 增强启动器」的桌面管理工具。
|
||||
|
||||
它可以把预设或自定义的 **指令提示词模板** 写入 Codex 配置,例如项目内置的:
|
||||
|
||||
```text
|
||||
examples/gpt5.5-unrestricted.md
|
||||
```
|
||||
|
||||
你可以在 UI 中直接启用、禁用、切换多个提示词模板,也可以同时管理不同第三方供应商 API 和官方 OpenAI Codex 登录配置。
|
||||
|
||||
## 核心亮点
|
||||
|
||||
### 1. 指令提示词注入
|
||||
|
||||
- 一键启用 `gpt5.5-unrestricted.md`
|
||||
- 支持多个提示词模板并存
|
||||
- 启用前自动记录状态,方便回退
|
||||
- 支持禁用当前提示词,让 Codex 恢复普通配置
|
||||
|
||||
### 2. Provider 可视化切换
|
||||
|
||||
- 添加第三方 Codex API Provider
|
||||
- 编辑 Base URL / API Key / Model / TOML 配置
|
||||
- 当前 Provider 状态清晰可见
|
||||
- 支持从 cc-switch 数据库导入 Codex Provider
|
||||
|
||||
### 3. 官方 Codex 配置管理
|
||||
|
||||
- 读取 Codex 官方 `auth.json`
|
||||
- 支持官方 ChatGPT 登录态 Auth 查看与编辑
|
||||
- 区分官方 Auth 与第三方 API Key,不混在一起
|
||||
|
||||
### 4. TOML 配置编辑
|
||||
|
||||
- 可视化查看当前 Codex `config.toml`
|
||||
- 在 Provider 编辑页直接编辑完整 TOML
|
||||
- 保存后立即同步到 Codex 配置目录
|
||||
|
||||
### 5. 跨平台桌面软件
|
||||
|
||||
- macOS `.dmg`
|
||||
- Windows `.msi`
|
||||
- Linux `.deb` / `.rpm`
|
||||
- GitHub Releases 自动构建发布
|
||||
|
||||
## 软件预览
|
||||
|
||||
<details open>
|
||||
<summary><b>主界面 / Provider / TOML / Auth 截图</b></summary>
|
||||
|
||||
> 这里可以放软件主界面、供应商切换页面、TOML 编辑页面、官方 Auth 页面截图。
|
||||
|
||||
<!-- 示例:
|
||||
<p align="center">
|
||||
<img src="docs/screenshots/overview.png" width="760" />
|
||||
</p>
|
||||
-->
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>提示词注入前后效果图</b></summary>
|
||||
|
||||
> 这里可以放启用 `gpt5.5-unrestricted.md` 前后的 Codex 效果对比图。
|
||||
|
||||
<!-- 示例:
|
||||
<p align="center">
|
||||
<img src="docs/screenshots/prompt-before.png" width="760" />
|
||||
<img src="docs/screenshots/prompt-after.png" width="760" />
|
||||
</p>
|
||||
-->
|
||||
|
||||
</details>
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 类型 | 技术 |
|
||||
| --- | --- |
|
||||
| 桌面框架 | Tauri 2 |
|
||||
| 前端 | React 18 / TypeScript / Vite |
|
||||
| 后端 | Rust |
|
||||
| 本地数据 | SQLite / rusqlite |
|
||||
| 配置编辑 | TOML / JSON |
|
||||
| 发布 | GitHub Actions / GitHub Releases |
|
||||
|
||||
## 配置路径
|
||||
|
||||
Codex-X 默认读取 Codex 配置目录:
|
||||
|
||||
```text
|
||||
~/.codex/config.toml
|
||||
@@ -31,71 +129,43 @@ CODEXX_HOME=/path/to/codex-x-data
|
||||
CC_SWITCH_HOME=/path/to/.cc-switch
|
||||
```
|
||||
|
||||
Codex-X 自身数据默认存放在:
|
||||
Codex-X 自身数据库默认位于:
|
||||
|
||||
```text
|
||||
~/.codexx/codexx.db
|
||||
```
|
||||
|
||||
## Windows 权限说明
|
||||
## 下载
|
||||
|
||||
Windows 正常情况下 Codex 配置位于:
|
||||
请前往 Releases 页面下载:
|
||||
|
||||
```text
|
||||
%USERPROFILE%\.codex
|
||||
```
|
||||
https://github.com/yynxxxxx/Codex-X/releases
|
||||
|
||||
这是用户目录,不需要管理员权限。只有当你手动把 `CODEX_HOME` 指向 `C:\Program Files`、`C:\Windows`、系统盘根目录等受保护目录时,写入才可能因为权限不足失败。Codex-X 不会静默提权,会直接显示具体 IO 错误。
|
||||
|
||||
## 开发
|
||||
## 开发运行
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
类型检查:
|
||||
|
||||
```bash
|
||||
pnpm typecheck
|
||||
```
|
||||
|
||||
构建桌面端:
|
||||
|
||||
```bash
|
||||
pnpm --dir apps/desktop tauri build
|
||||
```
|
||||
|
||||
## Release
|
||||
|
||||
本仓库使用 GitHub Actions 在打 tag 时自动构建三平台安装包:
|
||||
|
||||
```bash
|
||||
git tag v0.2.0
|
||||
git push origin v0.2.0
|
||||
```
|
||||
|
||||
Release 页面会包含:
|
||||
|
||||
- macOS `.dmg`
|
||||
- Windows `.msi` / `.exe`
|
||||
- Linux `.AppImage` / `.deb` / `.rpm`
|
||||
- GitHub 自动生成的 Source code `.zip` / `.tar.gz`
|
||||
|
||||
## 技术栈
|
||||
|
||||
- Tauri 2
|
||||
- React 18
|
||||
- TypeScript
|
||||
- Vite
|
||||
- Rust
|
||||
- SQLite / rusqlite
|
||||
- toml_edit
|
||||
|
||||
## 项目地址
|
||||
|
||||
<https://github.com/yynxxxxx/Codex-X>
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
MIT © yynxxxxx
|
||||
|
||||
|
||||
## macOS 安装说明
|
||||
|
||||
如果你在未签名/未公证的 DMG 中看到“软件已损坏”提示,这是 macOS Gatekeeper 的正常行为。
|
||||
|
||||
- 最佳方式:使用 Apple Developer ID 签名并 notarize
|
||||
- 仅本地测试:可手动移除 quarantine 属性
|
||||
|
||||
```bash
|
||||
xattr -dr com.apple.quarantine /Applications/Codex-X.app
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "codex-x",
|
||||
"version": "0.2.1",
|
||||
"version": "0.2.4",
|
||||
"private": true,
|
||||
"description": "Codex Switch & Instruct desktop manager",
|
||||
"type": "module",
|
||||
|
||||
Generated
+1
-1
@@ -337,7 +337,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "codex-x"
|
||||
version = "0.2.0"
|
||||
version = "0.2.3"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"dirs 5.0.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "codex-x"
|
||||
version = "0.2.1"
|
||||
version = "0.2.4"
|
||||
description = "Codex Switch & Instruct desktop manager"
|
||||
authors = ["yynxxxxx"]
|
||||
license = "MIT"
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 451 KiB |
@@ -1445,6 +1445,28 @@ fn restore_backup(config_dir: Option<String>, backup_id: String) -> Result<Actio
|
||||
})
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn open_url(url: String) -> std::result::Result<(), String> {
|
||||
let trimmed = url.trim();
|
||||
if trimmed.is_empty() {
|
||||
return Err("URL 为空".to_string());
|
||||
}
|
||||
|
||||
let status = if cfg!(target_os = "macos") {
|
||||
Command::new("open").arg(trimmed).status()
|
||||
} else if cfg!(target_os = "windows") {
|
||||
Command::new("cmd").args(["/C", "start", "", trimmed]).status()
|
||||
} else {
|
||||
Command::new("xdg-open").arg(trimmed).status()
|
||||
};
|
||||
|
||||
match status {
|
||||
Ok(s) if s.success() => Ok(()),
|
||||
Ok(s) => Err(format!("打开失败,退出码: {:?}", s.code())),
|
||||
Err(e) => Err(format!("打开失败: {e}")),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
@@ -1468,6 +1490,7 @@ pub fn run() {
|
||||
save_provider_toml_config,
|
||||
list_backups,
|
||||
restore_backup,
|
||||
open_url,
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running Codex-X");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "Codex-X",
|
||||
"version": "0.2.1",
|
||||
"version": "0.2.4",
|
||||
"identifier": "com.yynxxxxx.codexx",
|
||||
"build": {
|
||||
"frontendDist": "../dist",
|
||||
@@ -28,6 +28,19 @@
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all"
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
],
|
||||
"targets": "all",
|
||||
"windows": {
|
||||
"wix": {
|
||||
"bannerPath": "icons/wix/banner.bmp",
|
||||
"dialogImagePath": "icons/wix/dialog.bmp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1475,8 +1475,8 @@ function App() {
|
||||
<div><span>{lang === "zh" ? "项目地址" : "Project"}</span><code>{aboutInfo?.projectUrl || `https://github.com/${FALLBACK_GITHUB_REPO}`}</code></div>
|
||||
</div>
|
||||
<div className="about-actions">
|
||||
<button className="secondary-btn" onClick={() => window.open(aboutInfo?.projectUrl || `https://github.com/${FALLBACK_GITHUB_REPO}`, "_blank")}><ExternalLink size={16} /> {lang === "zh" ? "打开项目主页" : "Open project"}</button>
|
||||
<button className="ghost-btn" onClick={() => window.open(`${aboutInfo?.projectUrl || `https://github.com/${FALLBACK_GITHUB_REPO}`}/issues`, "_blank")}><ExternalLink size={16} /> {lang === "zh" ? "反馈问题" : "Issues"}</button>
|
||||
<button className="secondary-btn" onClick={() => void invoke("open_url", { url: aboutInfo?.projectUrl || `https://github.com/${FALLBACK_GITHUB_REPO}` })}><ExternalLink size={16} /> {lang === "zh" ? "打开项目主页" : "Open project"}</button>
|
||||
<button className="ghost-btn" onClick={() => void invoke("open_url", { url: `${aboutInfo?.projectUrl || `https://github.com/${FALLBACK_GITHUB_REPO}`}/issues` })}><ExternalLink size={16} /> {lang === "zh" ? "反馈问题" : "Issues"}</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1494,7 +1494,7 @@ function App() {
|
||||
{releaseInfo.body && <pre className="release-notes">{releaseInfo.body}</pre>}
|
||||
<div className="about-actions">
|
||||
<button className="primary-btn" onClick={checkForUpdates} disabled={releaseInfo.status === "checking"}><RefreshCw size={16} className={cx(releaseInfo.status === "checking" && "spin")} /> {lang === "zh" ? "检查更新" : "Check updates"}</button>
|
||||
<button className="secondary-btn" onClick={() => releaseInfo.htmlUrl && window.open(releaseInfo.htmlUrl, "_blank")} disabled={!releaseInfo.htmlUrl}><Download size={16} /> {lang === "zh" ? "打开下载页" : "Open download"}</button>
|
||||
<button className="secondary-btn" onClick={() => releaseInfo.htmlUrl && void invoke("open_url", { url: releaseInfo.htmlUrl })} disabled={!releaseInfo.htmlUrl}><Download size={16} /> {lang === "zh" ? "打开下载页" : "Open download"}</button>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "codex-x-workspace",
|
||||
"private": true,
|
||||
"version": "0.2.1",
|
||||
"version": "0.2.4",
|
||||
"scripts": {
|
||||
"dev": "pnpm --dir apps/desktop tauri dev",
|
||||
"build": "pnpm --dir apps/desktop tauri build",
|
||||
|
||||
Reference in New Issue
Block a user