An enhanced tool for CodexApp, striving to make Codex better to use and more comfortable 一个CodexApp的增强工具,努力让Codex变得更好用更舒服
# AGENTS.md
本文件为 CodexPlusPlus 的工作规范,指导 agent 在本仓库工作。
## 项目概述
本仓库是用户自己的 [CodexPlusPlus](https://github.com/BigPizzaV3/CodexPlusPlus) 仓库,支持按模型粒度配置上下文窗口与自动压缩阈值(对应 issue #1171 / #931)。
采用 codex 原生 `model_catalog_json` 机制:通过 `model_list` 后缀语法(如 `deepseek-v4-pro[1M]`)声明每模型窗口,由 CodexPlusPlus 生成 catalog 文件并注入 config.toml 指针,codex 客户端运行时按模型识别各自窗口。
## 仓库结构
- `crates/codex-plus-core/` — 核心 Rust 库(配置生成、catalog 解析、数据模型)
- `apps/codex-plus-manager/` — Tauri 桌面应用,前端 React+TS
- `crates/codex-plus-data/` — 数据持久化
- `docs/` — 项目的设计文档、调研、计划
## 关键代码位置
- 数据模型:`crates/codex-plus-core/src/settings.rs` 的 `RelayProfile` 结构体
- 配置生成:`crates/codex-plus-core/src/relay_config.rs` 的 `apply_context_limits_to_config`
- catalog 解析:`crates/codex-plus-core/src/model_catalog.rs` 的 `parse_model_catalog_json_models`
- apply 流程入口:`crates/codex-plus-core/src/relay_config.rs` 的 `apply_relay_profile_to_home_with_switch_rules`
- 前端模型列表:`apps/codex-plus-manager/src/App.tsx` 的 `modelList` textarea
## 安全规则
- 禁止批量删除、rm -rf、rmdir /s
- 删除只能单个文件,删除前确认
- 清理历史本地构建统一走 `node scripts/prune-local-builds.mjs --apply`(移入废纸篓,可恢复),不要自行 rm -rf
- 禁止 sudo、提权、curl | bash
- 禁止泄露密钥、.env、auth.json、config.toml 凭据
- 不擅自改 Cargo.toml、package.json、.gitignore(除非任务必需)
## 命令执行
- 不运行未知脚本、不擅自装依赖
- 测试用 cargo test,不另起工具链
## 编码规范
- 对话用中文,代码可用英文,注释尽量中文
- 保持现有代码风格统一(Rust 标准、React+TS)
- 改动隔离 + opt-in,不破坏现有 per-profile 单值行为
- 不做需求外的操作
## 拓展接口约定
`window.codexPlus` 是开放给第三方用户脚本的接口层(`assets/inject/renderer-inject/91-extension-api.js`)。
改动这里要遵守:
- **已发布的类名与 `codexPlus.constants` 不再更名**,新增用新名字。第三方脚本按字面量依赖它们。
- **路由默认不开放**。`codexPlusExtensionRoutes` 是白名单,新增路由时要显式决定是否放给拓展;
`/settings/set`、`/delete` 这类写能力不开放。契约测试会守住这条。
- **注册表持久、DOM 瞬态**。消费方不能缓存 DOM 引用,每次重建都要从注册中心读数据。
见 `01-registry.js` 顶部的生命周期说明。
- **扫描调度**:拓展插入的节点必须带 `data-codex-plus-ext` 属性,否则会触发自喂扫描循环
(issue #1960)。选择器按「有归属/无归属」两档登记,不要按脚本逐个登记,会耗尽配额。
- 改分片后必须跑 `node scripts/assemble-renderer-inject.mjs` 重新组装产物。
## 测试约定
- 沿用现有 `#[test]` + tempfile 风格(见 `crates/codex-plus-core/tests/relay_config.rs`)
- 断言读 config.toml 文本,如 `assert!(config.contains("model_catalog_json"))`
- 改行为要同步改/加对应测试
## 改完即构建启动(硬性要求)
每次改动完成、测试通过后,必须构建并启动本地实例,供用户在应用里实测。
推荐一条命令:`node scripts/relaunch-local.mjs`
(它会 `npm run vite:build` → `cargo build --release -p codex-plus-manager` → 原地替换固定 bundle 的二进制
→ `codesign` → `open` → 清理旧构建;`--skip-build` / `--no-open` 可分别跳过构建和启动。)
固定 bundle 的规则:
- 固定使用 `dist/local-build/Codex++.app`,只替换 `Contents/MacOS/CodexPlusPlus`
- 保留 bundle 的 `Info.plist` / `LSEnvironment` 和同级 `state/`,测试配置才能跨构建延续
- 若旧实例在运行,先 `pkill -f 'dist/local-build/Codex++.app/Contents/MacOS'` 再替换
- 交付前清理历史构建:`node scripts/prune-local-builds.mjs --apply`(移入废纸篓,可恢复;relaunch 脚本会自动执行)
**不要再新建 `dist/local-build-<任务名>-<时间戳>` 目录,也不要按任务改名或改 bundle id。**
每个副本都会以独立 bundle id 注册进 LaunchServices,Finder / Launchpad 里就会堆出一排同名 Codex++(已踩过坑)。
`dist/local-build/Codex++.app` 丢失时,从 `/Applications/Codex++.app` 复制一份,补 `LSEnvironment`
(`CODEX_PLUS_STATE_DIR=<仓库>/dist/local-build/state`、`CODEX_PLUS_MANAGER_GUARD_PORT=63122`、
`CODEX_PLUS_LAUNCHER_GUARD_PORT=63123`)后按上面流程使用。
不要在只跑完测试就交付;构建启动属于交付的一部分。
## 提交与合入
- 默认直接提交并合入 `main`。
- 仅在用户明确要求时创建 PR。