Compare commits

..
3 Commits
Author SHA1 Message Date
yyyyyynnn 964151d479 Polish Windows installer branding 2026-07-04 12:37:20 +08:00
yyyyyynnn 5f1c510dd2 Fix about page external links 2026-07-04 12:32:31 +08:00
yyyyyynnn 686f2b4e18 Fix macOS icon and speed up releases 2026-07-04 12:21:54 +08:00
11 changed files with 62 additions and 9 deletions
+5
View File
@@ -53,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
+12
View File
@@ -157,3 +157,15 @@ pnpm --dir apps/desktop tauri build
## License
MIT © yynxxxxx
## macOS 安装说明
如果你在未签名/未公证的 DMG 中看到“软件已损坏”提示,这是 macOS Gatekeeper 的正常行为。
- 最佳方式:使用 Apple Developer ID 签名并 notarize
- 仅本地测试:可手动移除 quarantine 属性
```bash
xattr -dr com.apple.quarantine /Applications/Codex-X.app
```
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "codex-x",
"version": "0.2.2",
"version": "0.2.4",
"private": true,
"description": "Codex Switch & Instruct desktop manager",
"type": "module",
+1 -1
View File
@@ -337,7 +337,7 @@ dependencies = [
[[package]]
name = "codex-x"
version = "0.2.2"
version = "0.2.3"
dependencies = [
"chrono",
"dirs 5.0.1",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "codex-x"
version = "0.2.2"
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

+23
View File
@@ -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");
+15 -2
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Codex-X",
"version": "0.2.2",
"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"
}
}
}
}
+3 -3
View File
@@ -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
View File
@@ -1,7 +1,7 @@
{
"name": "codex-x-workspace",
"private": true,
"version": "0.2.2",
"version": "0.2.4",
"scripts": {
"dev": "pnpm --dir apps/desktop tauri dev",
"build": "pnpm --dir apps/desktop tauri build",