Files
proxycast/docs/develop/lime-borrow-codex-engineering-practices.md
T
2026-03-27 14:35:56 +08:00

546 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lime 如何借鉴 Codex 的工程方法:从“已有基础”到“快而稳的迭代系统”
> 目的不是照抄 Codex 的技术栈,而是借鉴它背后的工程方法,并结合 Lime 当前仓库的真实现状,收敛出一条适合我们的落地路径。
## 1. 背景
这份文档基于两部分事实:
1. 对 `openai/codex` 仓库的结构、规则、CI、测试、发布流程做了实际阅读;
2. 对 Lime 当前仓库的工程入口、脚本、工作流、测试和发布链路做了核对。
结论先写在前面:
**Lime 并不缺“零起点能力”,而是已经有不少关键积木。**
我们现在更需要的,不是继续堆更多脚本,而是把已有能力收敛成一条清晰、分层、可执行的开发与交付路径。
如果要把这些工程方法进一步落实到 Lime 的 Agent / Harness 改造,请继续阅读:
- `docs/tech/harness/README.md`
Codex 值得借鉴的,不是 Bazel、不是纯 Rust、也不是它的体量;
真正值得借鉴的是:
**他们把“如何开发、如何验证、如何发布”写进了仓库本身。**
对 Lime 来说,这一点尤其重要。
因为 Lime 当前已经不是一个简单的单体项目,而是一个同时包含:
- React + TypeScript 前端
- Tauri 桌面壳
- Rust workspace
- 多 Provider / 网关 / MCP / 插件 / 浏览器桥接
- 文档站点
- 多平台发布
的复合型仓库。
从 `src-tauri/Cargo.toml` 看,当前 Rust workspace 已经有 `20` 个 crate;
从 `package.json` 看,前端、桥接、契约、发布、本地验证、AI 验证、治理脚本都已经存在。
这意味着:
**Lime 已经进入“需要系统化工程节奏”的阶段。**
## 2. Lime 当前已经具备的基础
在讨论“借鉴 Codex”之前,先明确 Lime 不是从零开始。
### 2.1 仓库级规则已经存在
根 `AGENTS.md` 已经提供了不少高价值工程约束,例如:
- 全部输出与文档统一使用中文
- 涉及 UI 先看 `docs/aiprompts/design-language.md`
- 默认同时考虑 macOS / Windows
- 优先使用 `npm`、`cargo`、Tauri 命令与项目内封装
- 明确给出了构建、测试、代码检查入口
这意味着 Lime 已经有“仓库级规则入口”,这是非常好的基础。
### 2.2 本地验证脚本已经不弱
当前 `package.json` 里已经有一整组工程命令:
- `npm run lint`
- `npm run typecheck`
- `npm test`
- `npm run test:bridge`
- `npm run test:contracts`
- `npm run test:rust`
- `npm run verify:local`
- `npm run verify:local:full`
- `npm run ai-verify`
其中 `scripts/local-ci.mjs` 已经实现了**按改动范围智能选择任务**:
- 前端改动 -> `lint` + `typecheck` + `test`
- bridge 改动 -> `test:bridge` + `test:contracts`
- Rust 改动 -> `cargo test`
- `--full` 时再补 `cargo clippy`
这其实已经很接近 Codex 仓库里“按 changed paths 决定 CI 跑什么”的思路了。
### 2.3 Git hook 也已经上线
`.husky/pre-commit` 当前会执行:
`npx tsx scripts/ai-code-verify.ts`
也就是说,Lime 已经不是“完全依赖人工自觉”的状态,而是开始把工程约束前移到提交流程。
### 2.4 契约与一致性检查已经有雏形
当前仓库里至少已经有两个很重要的“机器校验型”脚本:
- `scripts/check-app-version-consistency.mjs`
- `scripts/check-command-contracts.mjs`
前者会检查:
- `package.json`
- `src-tauri/Cargo.toml`
- `src-tauri/tauri.conf.json`
- `src-tauri/tauri.conf.headless.json`
的版本是否一致。
后者会检查:
- 前端 `safeInvoke` / `invoke` 实际调用了哪些 Tauri 命令
- `src-tauri/src/app/runner.rs` 里真正注册了哪些命令
- mock priority 命令集合是否同步
这已经非常接近 Codex 那种“把接口契约变成可自动验证对象”的方向了。
### 2.5 发布链路也已具备完整骨架
当前 `.github/workflows/release.yml` 已经具备:
- tag 驱动发布
- 多平台构建(macOS arm64 / x64,Windows x64)
- 版本同步到 Tauri 配置
- release notes 生成
- GitHub Release 上传
再加上:
- `deploy-docs.yml`
- `update-homebrew.yml`
说明 Lime 已经不是没有交付能力,而是已经有了一个基础发布流水线。
## 3. Lime 当前最明显的缺口
和 Codex 对比后,我认为 Lime 当前最核心的缺口不是“工具不够多”,而是下面三件事还没有完全收敛。
### 3.1 缺少一个统一的 PR 质量主入口
当前 GitHub Actions 里:
- `ci.yml` 主要覆盖 `src-tauri/**` 改动下的 **Windows OpenClaw regression**
- `deploy-docs.yml` 只负责文档站点
- `release.yml` 只负责发布
这意味着,Lime 当前很多重要校验虽然**本地可跑**,但还没有成为 PR 上稳定、清晰、统一的 required status,例如:
- 前端 `lint`
- 前端 `typecheck`
- Vitest
- `test:contracts`
- GUI headless smoke
- Rust 全量测试 / `clippy`
- bridge / smoke 校验
也就是说,我们已经有很多验证动作,但还没有把它们真正收束成“团队共同依赖的一条质量主链路”。
### 3.2 现有脚本之间还偏“并列”,没有形成明确分层
现在仓库里已经有:
- pre-commit 的 `ai-verify`
- 本地智能校验 `verify:local`
- 前端和 Rust 单独测试命令
- bridge / smoke / contracts 脚本
但还缺一件事:
**每一层到底该挡什么问题,团队的预期还不够明确。**
比如现在容易出现的疑问:
- `ai-verify` 是补充提醒,还是硬门禁?
- `verify:local` 是建议执行,还是提交前标准动作?
- `test:contracts` 什么时候必须跑?
- `smoke:social-workbench` 该放本地还是 CI?
Codex 很强的一点,就是每一层的角色很清楚。
Lime 现在更像是“积木已经有了,但还没拼成系统”。
### 3.3 契约检查已有基础,但还没有完全上升为“关键接口演进规范”
`check-command-contracts.mjs` 已经很有价值,但它目前更像一个检查脚本,而不是一整套“接口演进流程”的中心。
对 Lime 这种项目来说,真正高风险的契约不止是 Tauri command 名称,还包括:
- Tauri command 参数结构
- 前后端共享数据结构
- bridge 交互协议
- OpenClaw / Gateway / Workspace 相关状态快照
- 插件 / MCP 相关 manifest 或接口字段
Codex 的经验告诉我们:
**接口文档、生成物、测试、实现,最好一起演进。**
这正是 Lime 接下来最该补齐的一层。
## 4. Codex 最值得 Lime 借鉴的五个方法
下面只写“适合 Lime 的”,不写那些和我们技术栈不匹配的。
### 4.1 借鉴一:建立单一的“质量主入口”
Codex 很重要的一个做法,是把很多检查统一收口到一个最终状态上。
对 Lime 来说,最值得借鉴的是:
**新增一个主质量工作流,让 PR 的主要质量信号只看这一条。**
建议名称可以是:
- `.github/workflows/quality.yml`
这个工作流不需要一开始就做得很重,但应该具备三个特征:
1. **按改动范围决定执行内容**
2. **聚合前端 / Rust / bridge / docs 的核心信号**
3. **最后产出一个统一 results job 作为 required status**
这件事最好优先复用已有逻辑,而不是重写。
最合适的方式是:
- 继续保留 `scripts/local-ci.mjs` 作为本地入口
- 抽一层共享的 changed-path 规则到独立脚本
- 本地与 CI 共同复用这套判断逻辑
这样才能保证:
- 本地怎么判断改动范围
- CI 怎么判断改动范围
尽量一致。
### 4.2 借鉴二:把现有验证动作分层,而不是继续堆并列命令
建议把 Lime 的工程验证分成四层:
#### Layer 0:提交前快速提醒
保留 `.husky/pre-commit` 的 `ai-verify`,但明确定位为:
- 快速提醒
- 风险提示
- 代码卫生检查
**不要把它视为“提交前完整验证”的替代品。**
#### Layer 1:开发者本地标准入口
继续以 `npm run verify:local` 为核心。
建议将它明确成:
**所有功能型改动在发起 PR 前默认至少跑一次。**
这样 Lime 就不需要额外引入 `justfile` 一类新工具,仍然符合我们仓库“优先使用 `npm` / `cargo` / Tauri 命令”的跨平台约束。
#### Layer 2:PR 级智能 CI
这里建议接入:
- 前端:`npm run lint`、`npm run typecheck`、`npm test`
- bridge:`npm run test:bridge`、`npm run test:contracts`
- Rust:`cargo test --manifest-path "src-tauri/Cargo.toml"`
- Rust 扩展:按路径触发的 `cargo clippy`
#### Layer 3:高风险路径专项验证
这层不必每个 PR 都跑,但应该对特定路径生效,例如:
- `src/lib/dev-bridge/**`
- `src/lib/tauri-mock/**`
- `src/components/openclaw/**`
- `src-tauri/src/services/openclaw_service/**`
- `src-tauri/src/app/**`
- Workspace / browser-runtime / MCP / plugin 高风险路径
可以复用现有命令:
- `npm run bridge:health`
- `npm run verify:gui-smoke`
- `npm run bridge:e2e`
- `npm run smoke:workspace-ready`
- `npm run smoke:social-workbench`
其中如果明确把 Lime 看作 **GUI 桌面产品**,我更建议把高风险路径的最小专项护栏优先收口成一个统一入口:
- `npm run verify:gui-smoke`
它适合作为:
- headless Tauri 启动验证
- DevBridge 健康检查
- 默认 workspace 准备态 smoke
这样既不会一开始就把所有页面都推进重型 E2E,也能确保桌面壳、前端入口、bridge 和 workspace 基本链路至少有一条稳定的自动回归。
#### Layer 4:发布前全量验证
发布时建议至少统一收口:
- `npm run verify:app-version`
- `npm run test:frontend`
- `npm run test:contracts`
- `npm run test:rust`
- `npm run lint:rust`
这样 release workflow 才不会只在“能构建”层面把关,而能同时覆盖“接口一致性”和“核心回归风险”。
### 4.3 借鉴三:把“命令契约”升级成 Lime 的正式工程边界
Codex 很强调契约一致性。
Lime 现在已经有 `check-command-contracts.mjs`,这是非常好的起点。
建议下一步不要只把它当脚本,而是把它升级成:
**Lime 的正式工程边界规范之一。**
具体建议:
1. **PR CI 默认跑 `npm run test:contracts`**
2. **凡是修改 `src-tauri/src/app/runner.rs`、前端 `safeInvoke` 调用、bridge mock 命令集合的改动,都要求契约检查通过**
3. **后续逐步扩展到“命令名之外的参数契约”**
这里不建议一上来做成很重的 schema 系统,而是先做最小闭环:
- 命令名一致
- 参数结构不出现静默漂移
- mock / runtime / frontend 三方同步
这是 Lime 当前最值得优先工程化的一条“接口护栏”。
### 4.4 借鉴四:让治理脚本进入主流程,而不是停留在工具箱
Codex 的一个显著特点,是“治理不是旁路”。
Lime 当前已经有:
- `npm run governance:legacy-report`
- `scripts/report-legacy-surfaces.mjs`
同时我们也已经在 `docs/develop/` 下沉淀了不少退场与治理文档,例如:
- `execution-tracker-deprecation-plan.md`
- `execution-tracker-p0-acceptance-report.md`
这意味着 Lime 已经具备治理意识,但还可以更进一步:
### 建议做法
1. 把 `governance:legacy-report` 纳入定期检查或专项 CI
2. 对明确已经进入退场窗口的旧路径,增加“新增引用即报警”的守卫
3. 每个重要治理主题都要求同时有:
- 技术计划
- 退场计划
- 验收报告
- 守卫脚本
也就是说,治理不要只写文档,最好同时配一个可执行的检测机制。
这正是 Codex 的典型思路。
### 4.5 借鉴五:把发布从“打 tag 构建”升级成“分层交付”
Lime 当前的 `release.yml` 已经有不错的发布骨架。
但如果借鉴 Codex,我们可以把“发布”进一步拆成两个层级:
#### A. 稳定版交付
继续保留当前正式 tag 驱动的 GitHub Release、Homebrew 更新、Tauri 构建发布。
#### B. 预发布交付
针对风险较高、改动较大的版本,建议引入:
- `beta` / `rc` / `prerelease`
- 或内部 nightly / weekly 构建
原因很简单:
Lime 现在涉及:
- 桌面壳
- bridge
- 浏览器 runtime
- Provider / Gateway
- OpenClaw 安装与运行态
- 文档站点
这些链路任何一处变化,都可能需要在正式 tag 前先经过一次“真实用户环境暴露”。
Codex 的 alpha 节奏说明了一点:
**快速发布不等于鲁莽发布,预发布本身就是风险管理工具。**
## 5. 结合 Lime 实际,哪些不要照抄
借鉴 Codex,不代表要复制它的全部做法。
以下几件事我认为对 Lime 当前阶段不适合直接照搬。
### 5.1 不要为了“看起来更专业”引入额外构建系统
Codex 同时处理 Cargo / Bazel,是它自己的历史和规模决定的。
Lime 当前已经有:
- `npm`
- `cargo`
- Tauri
这套组合已经足够复杂。
现阶段不应该再额外引入一层类似 Bazel、Buck 或新的任务系统。
### 5.2 不要一下子把所有页面都做成重型 E2E
Lime 当前已经有 bridge / smoke / headless 相关脚本,这很好。
但如果一下子把所有页面都推进到全量 E2E,只会显著拉高维护成本。
更适合的做法是:
- 优先选高风险路径
- 选用户感知强、状态复杂、跨端联动重的页面
- 先做 smoke,再决定是否需要完整 E2E
### 5.3 不要让 AI 验证替代编译与测试
`.husky/pre-commit` 里的 `ai-verify` 很有价值,但它更适合做:
- 提醒
- 自检
- 风险暴露
不适合替代:
- `typecheck`
- `cargo test`
- `test:contracts`
- `clippy`
Codex 借鉴给我们的,不是“让 AI 代替工程”,而是:
**把工程流程做好之后,再让 AI 增强它。**
## 6. 建议的 Lime 落地顺序
下面给出一条尽量现实、成本可控的落地路径。
## Phase 0:收口现有入口(1 周内)
目标:先让团队对“标准本地验证路径”达成一致。
建议动作:
1. 在根 `AGENTS.md` 和开发文档中明确:
- 功能改动默认执行 `npm run verify:local`
- 大范围改动执行 `npm run verify:local:full`
2. 明确 `ai-verify` 是快速提醒层,不替代完整验证
3. 为 `test:contracts` 和 `verify:app-version` 增加更明确的使用说明
产出结果:
- 开发者知道“提交前至少跑什么”
- review 时可以默认假设这些动作已执行
## Phase 1:建立统一质量工作流(1~2 周)
目标:把本地已有能力上升为 PR 门禁。
建议动作:
1. 新增 `quality.yml`
2. 引入 changed-path detection
3. 按改动范围执行:
- frontend
- bridge/contracts
- rust
- docs build
4. 增加单一 `results` 汇总 job
产出结果:
- PR 有统一 required status
- 本地与 CI 质量路径更一致
## Phase 2:加强高风险边界(2~4 周)
目标:让最容易出事故的路径拥有专项护栏。
优先建议覆盖:
1. `safeInvoke` / Tauri command 契约
2. OpenClaw 安装与运行态相关路径
3. bridge / headless / smoke 相关路径
4. Workspace 准备态相关 smoke
可复用现有脚本:
- `npm run test:contracts`
- `npm run bridge:health`
- `npm run bridge:e2e`
- `npm run smoke:workspace-ready`
- `npm run smoke:social-workbench`
## Phase 3:把治理与预发布纳入节奏(1~2 个月)
目标:让“旧路径收口”和“风险前移”进入长期机制。
建议动作:
1. 给 `governance:legacy-report` 找到稳定的执行时机
2. 对重要治理主题建立“技术计划 + 退场计划 + 验收报告 + 守卫脚本”闭环
3. 为大改版本增加 prerelease / beta 节奏
## 7. 最终判断
如果只从表面看,Codex 和 Lime 的仓库差异很大。
但从工程方法看,Lime 其实已经有不少和 Codex 同方向的基础:
- 有仓库级规则
- 有本地智能校验
- 有 AI 验证 hook
- 有命令契约检查
- 有版本一致性检查
- 有多平台 release
- 有治理脚本和退场文档
所以 Lime 现在最需要做的,不是“再发明一套全新的方法论”,而是:
**把已有能力收口成一条清晰、稳定、分层的工程路径。**
如果用一句话概括这份文档的核心建议,那就是:
**对 Lime 来说,借鉴 Codex 的重点不是“学他们用了什么工具”,而是“把我们的规则、脚本、测试、治理和发布真正串成系统”。**
一旦这件事完成,Lime 的迭代速度和稳定性都会一起上一个台阶。