mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-09-24 23:10:56 +08:00
chore: release v0.96.0
This commit is contained in:
@@ -385,7 +385,7 @@ pub struct TokenUsage {
|
||||
// 当前仓库的事实源是 Hook + runtime adapter,而不是根 store barrel。
|
||||
// 推荐边界:
|
||||
// - 会话 / turn / action:`src/lib/api/agentRuntime.ts`
|
||||
// - 流式协议:`src/lib/api/agentStream.ts`
|
||||
// - 流式协议:`src/lib/api/agentProtocol.ts`
|
||||
// - 前端主链:`useAgentChatUnified -> useAsterAgentChat`
|
||||
// - 已删除旧入口:`useAgentChat`、`useAgentStore`
|
||||
|
||||
|
||||
@@ -0,0 +1,541 @@
|
||||
# Lime 如何借鉴 Codex 的工程方法:从“已有基础”到“快而稳的迭代系统”
|
||||
|
||||
> 目的不是照抄 Codex 的技术栈,而是借鉴它背后的工程方法,并结合 Lime 当前仓库的真实现状,收敛出一条适合我们的落地路径。
|
||||
|
||||
## 1. 背景
|
||||
|
||||
这份文档基于两部分事实:
|
||||
|
||||
1. 对 `openai/codex` 仓库的结构、规则、CI、测试、发布流程做了实际阅读;
|
||||
2. 对 Lime 当前仓库的工程入口、脚本、工作流、测试和发布链路做了核对。
|
||||
|
||||
结论先写在前面:
|
||||
|
||||
**Lime 并不缺“零起点能力”,而是已经有不少关键积木。**
|
||||
|
||||
我们现在更需要的,不是继续堆更多脚本,而是把已有能力收敛成一条清晰、分层、可执行的开发与交付路径。
|
||||
|
||||
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 的迭代速度和稳定性都会一起上一个台阶。
|
||||
Reference in New Issue
Block a user