Compare commits

..
Author SHA1 Message Date
yyyyyynnn bffeca53cc docs: refresh README for new UI 2026-07-16 18:07:20 +08:00
yyyyyynnn d381753be9 fix(release): use direct updater asset URLs 2026-07-16 14:15:41 +08:00
7 changed files with 130 additions and 89 deletions
+6 -3
View File
@@ -386,6 +386,7 @@ jobs:
env:
GH_TOKEN: ${{ github.token }}
RELEASE_ID: ${{ needs.prepare.outputs.release_id }}
RELEASE_TAG: ${{ needs.prepare.outputs.tag }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
set -euo pipefail
@@ -402,7 +403,9 @@ jobs:
python3 scripts/validate_updater_release.py \
--manifest latest.json \
--assets release-assets.json \
--version "$VERSION"
--version "$VERSION" \
--rewrite-download-urls
gh release upload "$RELEASE_TAG" latest.json --clobber
- name: Publish the verified release
env:
@@ -412,10 +415,11 @@ jobs:
- name: Verify published updater endpoint
env:
RELEASE_TAG: ${{ needs.prepare.outputs.tag }}
VERSION: ${{ needs.prepare.outputs.version }}
run: |
set -euo pipefail
endpoint="https://github.com/${GITHUB_REPOSITORY}/releases/latest/download/latest.json"
endpoint="https://github.com/${GITHUB_REPOSITORY}/releases/download/${RELEASE_TAG}/latest.json"
curl -fsSL \
--retry 12 \
--retry-delay 5 \
@@ -438,6 +442,5 @@ jobs:
--retry 5 \
--retry-delay 3 \
--retry-all-errors \
-H "Accept: application/octet-stream" \
"$url" >/dev/null
done
+70 -81
View File
@@ -8,9 +8,9 @@
# Codex-X
**Codex 提示词 · API / Provider · 会话 · Skills / MCP 一站式管理工具**
**Codex 可视化提示词注入 · Provider · 会话 · Skills / MCP 管理工具**
一款面向 **OpenAI Codex 桌面端 / Codex CLI** 的跨平台桌面工具。不用反复手改配置文件,就能管理提示词模板、切换第三方 API、整理 / 修复 / 永久删除本地会话、管理 Skills / MCP,并查看 TOML 与登录认证。
一款面向 **OpenAI Codex 桌面端 / Codex CLI** 的跨平台桌面工具。把提示词模板、自定义 Prompt、第三方 API 供应商、会话同步、Skills / MCP 和 TOML 配置都放进可视化界面里,不用反复手改文件。
<p>
<img src="https://img.shields.io/github/v/release/yynxxxxx/Codex-X?label=version&color=blue" alt="version" />
@@ -32,74 +32,50 @@
## Codex-X 是什么?
当你同时使用 Codex 桌面端、CLI、第三方 API 和多套提示词时,配置很容易散落在不同文件里。Codex-X 把这些高频操作集中到一个桌面界面中,让当前状态看得见、常用操作点一下就能完成。
当你同时使用 Codex 桌面端、CLI、第三方 API、Skills / MCP 和多套提示词时,配置很容易散落在不同文件里。Codex-X 把这些高频操作集中到一个桌面界面中,让当前状态看得见、常用操作点一下就能完成。
你可以用它:
- 从模板库选择提示词,也可以导入自己的 `.md`;支持保留原提示词或直接替换
- 像管理插件一样管理提示词:分类、导入 Markdown、自定义编辑、一键启用 / 禁用
- 内置 5 套提示词模板,同时支持用户把自己的提示词变成可视化模板库
- 保存、测试并切换 OpenAI Official 与第三方 API,还能从 cc-switch 导入现有供应商
- 搜索并按项目整理本地会话,检查 / 自动修复异常会话,精确删除不再需要的会话
- 同步、检查、搜索和删除本地会话,按项目路径整理 Codex 历史记录
- 集中管理 Skills 与 MCP,查看当前 `config.toml`、`auth.json` 和操作备份
## 软件预览
<details open>
<summary><b>应用界面预览</b>:主界面 / Provider / TOML / Auth</summary>
<summary><b>新版 UI:指令提示词管理中心</b></summary>
<p align="center">
<img src="docs/screenshots/app/preview.png" alt="Codex-X 应用界面预览:主界面、Provider、TOML、Auth" width="920" />
<img src="docs/screenshots/app/new-ui/prompts.png" alt="Codex-X 新版指令提示词管理界面" width="920" />
</p>
</details>
<details>
<summary><b>提示词注入效果:安全测试场景</b></summary>
<div align="center">
<table>
<tr>
<td align="center" width="50%">
<b>SQL 注入测试</b><br />
<sub>部署后测试:如何对目标进行 SQL 注入测试?</sub><br />
<img src="docs/screenshots/prompt-effects/security/sql-injection.png" alt="SQL 注入测试效果图" width="420" />
<b>分类管理</b><br />
<sub>把提示词按破甲 / 逆向、软件开发、写作辅助等分类维护</sub><br />
<img src="docs/screenshots/app/new-ui/prompt-categories.png" alt="Codex-X 提示词分类管理" width="420" />
</td>
<td align="center" width="50%">
<b>NSFW 响应测试</b><br />
<sub>用于观察提示词注入后的边界响应变化</sub><br />
<img src="docs/screenshots/prompt-effects/security/nsfw.png" alt="NSFW 响应测试效果图" width="420" />
<b>自定义提示词</b><br />
<sub>直接添加、编辑或导入自己的 Markdown 提示词</sub><br />
<img src="docs/screenshots/app/new-ui/prompt-form.png" alt="Codex-X 添加自定义提示词" width="420" />
</td>
</tr>
</table>
</div>
</details>
<details>
<summary><b>提示词注入效果:逆向工程场景</b></summary>
<summary><b>Skills / MCP 可视化管理</b></summary>
<div align="center">
<table>
<tr>
<td align="center" width="50%">
<b>APK 逆向分析</b><br />
<sub>Android APK 静态 / 动态分析思路</sub><br />
<img src="docs/screenshots/prompt-effects/reverse/apk-reverse-1.png" alt="APK 逆向分析效果图" width="420" />
</td>
<td align="center" width="50%">
<b>APK 逆向分析 2</b><br />
<sub>补充 APK 逆向流程与定位方式</sub><br />
<img src="docs/screenshots/prompt-effects/reverse/apk-reverse-2.png" alt="APK 逆向分析效果图 2" width="420" />
</td>
</tr>
<tr>
<td align="center" colspan="2">
<b>EXE 逆向分析</b><br />
<sub>Windows 可执行文件分析与调试方向</sub><br />
<img src="docs/screenshots/prompt-effects/reverse/exe-reverse.png" alt="EXE 逆向分析效果图" width="620" />
</td>
</tr>
</table>
</div>
<p align="center">
<img src="docs/screenshots/app/new-ui/skills-mcp.png" alt="Codex-X Skills 与 MCP 管理界面" width="920" />
</p>
</details>
@@ -112,27 +88,31 @@
<th align="center">Codex-X 能帮你</th>
</tr>
<tr>
<td align="center">🧩 <b>使用提示词模板</b></td>
<td align="left">当前模板库共 <b>5 套</b>,可一键启用 / 禁用,并选择“保留原提示词”或“替换原提示词”;支持 GitHub 自动同步、本地缓存,以及导入、编辑自己的 <code>.md</code>。</td>
<td align="center"><b>提示词注入管理</b></td>
<td align="left">内置 <b>5 套</b>提示词模板,支持分类、GitHub 同步、本地缓存、导入 <code>.md</code>、添加自定义提示词、编辑说明、一键启用 / 禁用。</td>
</tr>
<tr>
<td align="center">⚡ <b>切换 API / 中转</b></td>
<td align="left">保存、测试并启用多个第三方供应商,也可从 cc-switch 导入;相同地址和 Key 会自动合并。切换后新建或重新打开会话即可生效,无需重启整个 Codex 客户端。</td>
<td align="center"><b>启用方式切换</b></td>
<td align="left">可选择“保留原提示词”追加写入,也可选择“替换原提示词”完整切换;适合在不同模型、不同任务、不同 Prompt 之间快速切换。</td>
</tr>
<tr>
<td align="center">💬 <b>整理本地会话</b></td>
<td align="left">搜索会话、按项目路径分组、检查并自动修复异常数据;支持单选、多选或勾选整个项目,将指定会话从 Codex 存储中永久删除。</td>
<td align="center"><b>Provider / API</b></td>
<td align="left">添加、编辑、启用、删除第三方供应商;支持连接检测、模型获取 / 测试、从 cc-switch 导入,并可在 OpenAI Official 与中转 API 之间切换。</td>
</tr>
<tr>
<td align="center">🧠 <b>管理 Skills / MCP</b></td>
<td align="left">查看当前可用的 Skills 与 MCP,先预览再导入已有内容;支持从 ZIP 安装 Skill、逐项启用 / 禁用,并检查 Skill 更新状态。</td>
<td align="center"><b>会话管理</b></td>
<td align="left">搜索本地会话、按项目路径分组、同步当前供应商、检查会话状态,并支持单选 / 多选 / 项目级永久删除。</td>
</tr>
<tr>
<td align="center">📝 <b>管理配置与登录</b></td>
<td align="left">集中查看 Codex 当前使用的 <code>config.toml</code> 与 <code>auth.json</code>,区分官方登录态和第三方 API Key;重要写入前自动备份,需要时可以恢复。</td>
<td align="center"><b>Skills / MCP</b></td>
<td align="left">可视化查看 Skills 与 MCP,导入已有配置,从 ZIP 安装 Skill,逐项启用 / 禁用,并检查更新状态。</td>
</tr>
<tr>
<td align="center">📦 <b>跨平台使用</b></td>
<td align="center"><b>配置与登录</b></td>
<td align="left">集中查看 Codex 当前使用的 <code>config.toml</code> 与 <code>auth.json</code>,区分官方登录态和第三方 API Key;重要写入前自动备份。</td>
</tr>
<tr>
<td align="center"><b>跨平台使用</b></td>
<td align="left">提供 macOS Apple Silicon / Intel、Windows MSI / 便携版和 Linux 安装包;安装版可在应用内直接下载、校验并安装更新,便携版继续使用手动下载。</td>
</tr>
</table>
@@ -140,18 +120,27 @@
## 核心亮点
### 1. 提示词模板中心
### 1. 可视化提示词注入中心
<p align="center">
<img src="https://img.shields.io/badge/当前模板库-5_套-2563eb?style=flat-square" alt="当前模板库 5 套" />
<img src="https://img.shields.io/badge/离线内置-5_套-16a34a?style=flat-square" alt="离线内置 5 套" />
<img src="https://img.shields.io/badge/GitHub_同步-自动更新-f59e0b?style=flat-square" alt="GitHub 自动同步" />
<img src="https://img.shields.io/badge/自定义提示词-支持导入_编辑-7c3aed?style=flat-square" alt="支持自定义提示词" />
</p>
> [!TIP]
> **安装后就能用,联网后自动补齐。**
> **安装后就能用,联网后自动补齐,也能维护自己的提示词库。**
>
> 安装包离线自带当前全部 5 套模板;软件启动后会在后台自动同步 GitHub `examples/` 的更新和新增模板,无需先打开【指令提示词】页面。同步成功的在线版本会缓存到本地,临时离线仍可继续使用。
> 安装包离线自带当前全部 5 套模板;软件启动后可同步 GitHub `examples/` 的更新和新增模板。同步成功的在线版本会缓存到本地,临时离线仍可继续使用。你也可以导入自己的 `.md`、新增分类、编辑说明,并像切换插件一样启用或禁用任意提示词。
Codex-X 现在不只是“几套内置 Prompt”的启动器,而是一个可视化提示词注入与管理工具:
- 按分类管理提示词,例如破甲 / 逆向、软件开发、写作辅助,也可以新增自己的分类
- 支持同步 GitHub 模板、导入 Markdown、手动添加提示词、编辑标题 / 文件名 / 内容
- 每个提示词都有独立开关,打开时自动按当前启用方式写入 Codex 指令文件
- 支持“保留原提示词”和“替换原提示词”两种模式,适合日常叠加或完整切换
- 本地缓存可离线使用,后续模板更新不会影响你自己维护的自定义提示词
<div align="center">
<table>
@@ -201,44 +190,33 @@
</tr>
</table>
每次启用或禁用前都会自动创建备份。除了模板库,你也可以导入、编辑和删除自己的 `.md` 提示词。
每次启用或禁用前都会自动创建备份。除了模板库,你也可以导入、编辑、删除自己的 `.md` 提示词,并通过分类管理把常用提示词整理成自己的工作流。
### 2. Provider 切换:新会话直接生效
> [!NOTE]
> 如果你有好用的提示词模板,欢迎在 [Issues](https://github.com/yynxxxxx/Codex-X/issues) 提交:请附上模板名称、适用场景、Markdown 内容、推荐启用方式和必要说明。合适的模板会考虑收录到 `examples/`,让更多用户可以一键同步使用。
### 2. Provider / API:添加、检测、获取模型、随时切换
> [!NOTE]
> 启用新的第三方供应商后,新建或重新打开 Codex 会话即可使用新的中转,不需要重启整个 Codex 客户端。
- 保存多个第三方供应商,随时查看当前正在使用哪一个
- 切换前可测试 API 地址是否可用,并分别保存或启用配置
- 切换前可检测连接,并可获取模型进行测试
- 在同一页面编辑 Base URL、API Key、Model、Wire API 和完整 TOML
- 从 cc-switch 导入时自动区分新增、更新、合并与跳过;相同 URL + Key 不再重复显示
- 切回 OpenAI Official 时保留当前官方登录态,第三方配置也不会凭空消失
### 3. 官方 Auth 管理
- 自动读取 Codex 官方 `auth.json`
- 支持查看 / 编辑 ChatGPT 登录态 Auth
- 区分官方 Auth 与第三方 API Key
- 官方配置可和第三方 Provider 在 UI 中统一管理
### 4. TOML 可视化编辑
- 查看当前 Codex `config.toml`
- 深色代码预览与语法高亮
- Provider 编辑页可直接编辑完整 TOML
- 保存后同步到 Codex 配置目录
### 5. 会话管理:检查、修复与永久删除
### 3. 会话管理:同步、检查与永久删除
<table>
<tr>
<td width="50%" valign="top">
<b>查找和整理</b><br />
按标题、项目路径搜索会话,也可以按项目分组查看;Codex 自动创建的后台子会话默认不会混进普通会话列表。
<b>同步和检查</b><br />
检查本地会话是否和当前 Provider / 模型一致,需要时一键同步到当前供应商配置,不修改聊天内容。
</td>
<td width="50%" valign="top">
<b>检查和修复</b><br />
一键检查本地会话是否与当前 Provider 一致,支持手动全量修复,也可以开启启动时自动检查与修复。
<b>查找和整理</b><br />
按标题、项目路径、供应商或 ID 搜索会话,也可以按项目路径分组查看,适合清理长期使用后积累的会话列表。
</td>
</tr>
<tr>
@@ -252,7 +230,7 @@
> [!CAUTION]
> **永久删除不可恢复。** 删除前请先关闭仍在使用这些会话的 Codex 窗口或 CLI,并在确认窗口中再次核对待删除列表。
### 6. Skills / MCP 管理
### 4. Skills / MCP 管理
在【技能和 MCP】页面集中管理 Codex 的能力扩展,不必再到多个目录和配置文件中逐项查找。
@@ -269,7 +247,18 @@
</tr>
</table>
### 7. 逆向 Skills 导航
### 5. TOML 与官方 Auth 管理
- 自动读取 Codex 官方 `auth.json`
- 支持查看 / 编辑 ChatGPT 登录态 Auth
- 区分官方 Auth 与第三方 API Key
- 官方配置可和第三方 Provider 在 UI 中统一管理
- 查看当前 Codex 正在使用的 live `config.toml`
- 深色代码预览与语法高亮
- Provider 编辑页可直接编辑完整 TOML
- 保存后同步到 Codex 配置目录
### 6. 逆向 Skills 导航
<div align="center">
<a href="https://yynxxxxx.github.io/Codex-X/">
@@ -306,7 +295,7 @@
</a>
</p>
### 8. 跨平台桌面软件
### 7. 跨平台桌面软件
- macOS Apple Silicon `.dmg`
- macOS Intel `.dmg`
Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

+54 -5
View File
@@ -12,9 +12,13 @@ from typing import Any
REQUIRED_PLATFORMS = {
"darwin-aarch64": ".app.tar.gz",
"darwin-aarch64-app": ".app.tar.gz",
"darwin-x86_64": ".app.tar.gz",
"darwin-x86_64-app": ".app.tar.gz",
"windows-x86_64": ".msi",
"windows-x86_64-msi": ".msi",
"linux-x86_64": ".AppImage",
"linux-x86_64-deb": ".deb",
"linux-x86_64-rpm": ".rpm",
"linux-x86_64-appimage": ".AppImage",
@@ -44,11 +48,45 @@ def validate_signature(platform: str, value: Any) -> None:
fail(f"{platform} signature is unexpectedly short")
def rewrite_download_urls(
manifest_path: Path,
manifest: dict[str, Any],
assets_by_url: dict[str, dict[str, Any]],
) -> int:
platforms = manifest.get("platforms")
if not isinstance(platforms, dict):
fail("latest.json has no platforms object")
rewritten = 0
for platform, entry in platforms.items():
if not isinstance(entry, dict):
fail(f"invalid platform entry {platform}")
current_url = entry.get("url")
if not isinstance(current_url, str):
fail(f"{platform} has an invalid download URL")
asset = assets_by_url.get(current_url)
if asset is None:
fail(f"{platform} URL does not point to an asset in this release")
download_url = asset.get("browser_download_url")
if not isinstance(download_url, str) or not download_url.startswith("https://"):
fail(f"{platform} asset has no public download URL")
if current_url != download_url:
entry["url"] = download_url
rewritten += 1
manifest_path.write_text(
json.dumps(manifest, ensure_ascii=False, indent=2) + "\n",
encoding="utf-8",
)
return rewritten
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--manifest", type=Path, required=True)
parser.add_argument("--assets", type=Path, required=True)
parser.add_argument("--version", required=True)
parser.add_argument("--rewrite-download-urls", action="store_true")
args = parser.parse_args()
manifest = load_json(args.manifest)
@@ -80,18 +118,29 @@ def main() -> None:
if not isinstance(platforms, dict):
fail("latest.json has no platforms object")
for platform, suffix in REQUIRED_PLATFORMS.items():
entry = platforms.get(platform)
if not isinstance(entry, dict):
fail(f"missing platform {platform}")
validate_signature(platform, entry.get("signature"))
if args.rewrite_download_urls:
rewritten = rewrite_download_urls(args.manifest, manifest, assets_by_url)
print(f"Rewrote {rewritten} updater asset URLs to public download URLs.")
for platform, entry in platforms.items():
if not isinstance(entry, dict):
fail(f"invalid platform entry {platform}")
validate_signature(platform, entry.get("signature"))
url = entry.get("url")
if not isinstance(url, str) or not url.startswith("https://"):
fail(f"{platform} has an invalid download URL")
asset = assets_by_url.get(url)
if asset is None:
fail(f"{platform} URL does not point to an asset in this release")
if url != asset.get("browser_download_url"):
fail(f"{platform} URL points to GitHub metadata instead of the asset download")
for platform, suffix in REQUIRED_PLATFORMS.items():
entry = platforms.get(platform)
if not isinstance(entry, dict):
fail(f"missing platform {platform}")
asset = assets_by_url[entry["url"]]
asset_name = asset["name"]
if not asset_name.endswith(suffix):
fail(f"{platform} points to {asset_name!r}, expected a {suffix} updater")